C ++ битовый массив, доступ к значениям - PullRequest
0 голосов
/ 31 марта 2011


У меня есть задача создать матрицу смежности графа *1003* из списка смежных узлов, сохраненную в файле (без весов) в массив битов в C ++. Я успешно прочитал смежные узлы из файла, но когда я пытаюсь сохранить его в массиве битов, результат не правильный. Моя функция следующая:

bitset<N>* read_graph(string filepath)
{
    FILE *fp;
    char line[100];
    bitset<N> bs[N];

    fp = fopen(filepath.c_str(), "r");

    if(fp != NULL)
    {
       while(!feof(fp))
       {   
          fgets(line, 100, fp);
          //cout << line << endl;
          if(line[0] == 'a')
          {
               string str = ""; 
               int i(0);    
               for(i = 2; line[i] != ' '; i++)
               {
                  if(line[i] != ' ')
                  {
                    str += line[i];
                  }     
               }
               int fi = atoi(str.c_str());
               i++;
               str = "";
               for(int j = i; line[j] != ' '; j++)
               {
                  if(line[j] != ' ')
                  {
                    str += line[j];
                  }     
               }    
               int si = atoi(str.c_str());
               si--;
               fi--;
               //cout << "string: " << str << endl;
               cout << "fi: " << fi;
               //cout << "string: " << str << endl;
               cout << "   si: " << si << endl;
               bs[fi][si]= 1;
          }
       }          
    }
    fclose(fp);

    return bs;
}

Результат следующий (fi обозначает первый индекс, а si обозначает второй индекс):

sample.gr
fi: 0 si: 1
fi: 0 si: 2
fi: 1 si: 3
ФИ: 2 СИ: 4
ФИ: 3 СИ: 2
ФИ: 3 СИ: 5
ФИ: 4 СИ: 1
ФИ: 4 СИ: 5
ФИ: 4 СИ: 5

000000
000001
011000
001000
000000
000000

Индексы верны, я проверил их, но матрица должна быть следующей (она отражается из-за расположения битов по правой стороне):

000000
010001
001001
000010
000100
011000

Полагаю, ошибка где-то в доступе к элементу bitset, но я не могу понять, что именно не так.

Я ценю любую помощь. Спасибо.

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

После исправления указателя на проблему с локальным массивом ваш код запускается для меня и печатает то, что ожидается (кроме зеркального отображения).

Но не будет ли проще использовать C ++ I / O в этом случае?

#include <vector>
#include <bitset>
#include <iterator>
#include <fstream>
#include <sstream>
#include <iostream>
const int N=6;
std::vector<std::bitset<N> > read_graph(const std::string& filepath)
{
    std::vector<std::bitset<N> > bs(N);
    std::ifstream fp(filepath.c_str());
    for(std::string line; getline(fp, line); )
    {
        if(line.size() > 1 && line[0] == 'a')
        {
            std::istringstream str(line.substr(1));
            int fi, si;
            str >> fi >> si;
            std::cout << "fi: " << fi << "   si: " << si << '\n';
            bs[--fi][--si]= 1;
        }
    }
    return bs;
}
int main()
{
    std::vector<std::bitset<N> > v = read_graph("sample.gr");
    copy(v.rbegin(), v.rend(),
         std::ostream_iterator<std::bitset<N> >(std::cout, "\n"));
}

тестовый прогон: https://ideone.com/z7Had

2 голосов
/ 31 марта 2011

Вы возвращаете указатель на локальный массив.Неопределенное поведение.

Используйте взамен vector<bitset<N> > или аналогичный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...