Адрес памяти перекрывается двумя массивами - PullRequest
1 голос
/ 26 марта 2012

Я работаю над двоичными матрицами.Два из моих массивов перекрываются.(Я проверил адреса). Это происходит только для нескольких размеров матриц.Следовательно, я получаю неправильные результаты.Я пытался использовать new для выделения массивов, но при этом я получаю ошибку сегментации.Есть ли способ избежать дублирования памяти?Я использую компилятор g ++.

Так я объявил массивы

bool A[size0][size0],B[size0][size0],C[size0][size0];

На следующем шаге я инициализирую все из них.A и B - операнды, а C будет содержать результат.

Я использую пользовательский алгоритм умножения на следующем этапе.Вот фрагмент

 for(I=0;I<cnm;I++){  
    bool Tab[m][size];
    bool Ctemp[size][size];

    int count=0;
    for(uint i=0;i<pow(2.0,m*1.0);i++){ 
            for(uint j=0;j<n;j++){
                    Tab[i][j]=0;  //Initialize
                    if(i==0){
                            Tab[i][j] = 0;
                    }
                    else{
                      int dec;
                      //h is calculated here
                      dec=gray_map[i-1]^gray_map[i]; //gray_map returns gray code
                      Tab[i][j] = Tab[i-1][j] ^ B[h][j];
                    }
                    ....
                    ....
              }
     }
     .....
     .....
     //Rest of the code

Согласно моим наблюдениям Tab и C перекрываются.Я проверил адреса памяти, напечатав их.Они перекрываются на шестой итерации второго уровня для цикла (n = 9, m = 3, размер = 9, cnm = 3).Я НЕ использовал C между ними, я использую его только во внешнем цикле.

1 Ответ

5 голосов
/ 26 марта 2012

C-Compliers не позволяют перекрывающимся массивам (за исключением того, что вы говорите им, или они действительно содержат ошибки).

В большинстве случаев причина таких ошибок - неправильная арифметика указателей или неправильный доступ к массиву.

Даже если у вас всего 3 секунды на код, я вижу, что с вашим доступом что-то не так:

вы объявили Tab[m][..], но у вас есть цикл, повторяющийся по i от 0 до 2 ^ m (кстати)использование pow для его вычисления не очень хорошо, вместо этого используйте сдвиг влево (<<)).И затем вы получаете доступ к <code>Tab[i][...], поэтому в большинстве случаев вы получаете доступ к Tab по необъявленным индексам.

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