Место записи нарушения прав доступа Где ошибка? (Диаграмма Вейча)

ПРИМЕЧАНИЕ: у меня было две переменные с одинаковыми именами ... Большое спасибо Стефану Бирладяну и Хенрику за то, что заметили это! *

Недавно я начал писать код, который помогает мне вводить значения функции bool в диаграмму Вейча (Карно) с 4 переменными. Код должен записывать элементы в матрицу размером 4x4, но с такими индексами:

  1. элемент - индекс 3,3
  2. элемент - индекс 2,3
  3. элемент - индекс 3,2
  4. элемент - индекс 2,2
  5. элемент - индекс 0,3
  6. элемент - индекс 1,3
  7. элемент - индекс 0,2
  8. элемент - индекс 1,2
  9. элемент - индекс 3,0
  10. элемент - индекс 2,0
  11. элемент - индекс 3,1
  12. элемент - индекс 2,1
  13. элемент - индекс 0,0
  14. элемент - индекс 1,0
  15. элемент - индекс 0,1
  16. элемент - индекс 1,1 Это код функции main ():

        void main()
        {
            int n;
    
        n=4;
    
        int **VeitchDiagram;
    
        //allocate memory for Veitch diagram
        VeitchDiagram = new int *[n];
        for(int i=0; i<n; i++)
            VeitchDiagram[i]=new int [n];
    
        //enter the elements
        for(int i=0; i<n; i++)
        {
            int j, k;
            if(i%2==1)
            {
                k=0;
                if(i<2)
                    j=4;
                else
                    j=-1;
                for(int k=0; k<2; k++)
                {
                    if(i<2)
                        j--;
                    else
                        j++;
                    cin >> VeitchDiagram[k][j];     //this part writes the input to elements with index (at least it should do that):
                    k++;                            //0,3     1,3     0,2     1,2     if i%2==1 and i<2
                    cin >> VeitchDiagram[k][j];     //0,0     1,0     0,1     1,1     if i%2==1 and i>=2
                    k--;
                }
            }
            else
            {
                k=3;
                if(i<2)
                    j=4;
                else
                    j=-1;
                for(int k=0; k<2; k++)
                {
                    if(i<2)
                        j--;
                    else
                        j++;
                    cin >> VeitchDiagram[k][j];     //this part writes the input to elements with index (at least it should do that):
                    k--;                            //3,3     2,3     3,2     2,2    if i%2==0 and i<2
                    cin >> VeitchDiagram[k][j];     //3,0     2,0     3,1     2,1    if i%2==0 and i>=2
                    k++;
                }
            }
        }
    
        //free memory allocated for VeitchDiagram
        for(int i=0; i<n; i++)
            delete [] VeitchDiagram[i];
        delete [] VeitchDiagram;
    }
    

person zkristic    schedule 23.03.2012    source источник
comment
Вы прошли через это с помощью отладчика?   -  person Luchian Grigore    schedule 23.03.2012
comment
Да ... Несколько раз. Это позволяет мне ввести первые два элемента, а затем выдает нарушение прав доступа.   -  person zkristic    schedule 23.03.2012


Ответы (3)


        for(int k=0; k<2; k++)
        {
            if(i<2)
                j--;
            else
                j++;
            cin >> VeitchDiagram[k][j];     //this part writes the input to elements with index (at least it should do that):
            k--;                            //3,3     2,3     3,2     2,2    if i%2==0 and i<2
            cin >> VeitchDiagram[k][j];     //3,0     2,0     3,1     2,1    if i%2==0 and i>=2
                                 ^ k == -1

Но вам действительно стоит научиться пользоваться отладчиком.

person Henrik    schedule 23.03.2012
comment
Ооооо ... У меня две переменные k ... Я только что это заметил! Спасибо, что указали на это, и да, я должен научиться использовать отладчик (лучше): D Спасибо ... и извините за то, что раздражаю вас! - person zkristic; 23.03.2012

для i = 0 вы попадаете в эту ветку

else
            {
                k=3;
                if(i<2)
                    j=4;
                else
                    j=-1;
                for(int k=0; k<2; k++)
                {
                    if(i<2)
                        j--;
                    else
                        j++;
                    cin >> VeitchDiagram[k][j];     //this part writes the input to elements with index (at least it should do that):
                    k--;                            //3,3     2,3     3,2     2,2    if i%2==0 and i<2
                    cin >> VeitchDiagram[k][j];     //3,0     2,0     3,1     2,1    if i%2==0 and i>=2
                    k++;
                }
            }

когда k = 0

cin >> VeitchDiagram[k /* = 0  OK */][j];     //this part writes the input to elements with index (at least it should do that):
                    k--; //decrease it                            //3,3     2,3     3,2     2,2     if i%2==0 and i<2
                    cin >> VeitchDiagram[k /* here k = -1 BAD!!! */][j];     //3,0     2,0     3,1     2,1    if i%2==0 and i>=2
                    k++;
person Stefan Birladeanu    schedule 23.03.2012

Как отмечалось в другом месте, вы индексируете вне массива.
Так же как и предложение, версия на основе таблицы может быть менее сложной для правильного выполнения:

const size_t k_index[] = {3,2,3,2,0,1,0,1,3,2,3,2,0,1,0,1};
const size_t j_index[] = {3,3,2,2,3,3,2,2,0,0,1,1,0,0,1,1};

int main()
{
    const int n = 4;
    int VeitchDiagram[n][n]; // No need for dynamic allocation here.

    //enter the elements
    for(int i = 0; i < n * n; i++)
    {
        cin >> VeitchDiagram[k_index[i]][j_index[i]];
    }
}

Это тоже на пару строк короче.

person molbdnilo    schedule 23.03.2012
comment
лол ... на пару строк короче: D Ага, это (намного) легче читать! Спасибо за код - person zkristic; 23.03.2012