Место записи нарушения прав доступа... Где ошибка? (Диаграмма Вейча)
ПРИМЕЧАНИЕ: у меня было две переменные с одним и тем же именем... Большое спасибо Стефану Бирладяну и Хенрику за то, что заметил это!*
Недавно я начал писать код, который помогает мне вводить значения функции bool в диаграмму Вейча (Карно) с 4 переменными. Код должен записывать элементы в матрицу размером 4х4, но с такими индексами:
- элемент - индекс 3,3
- элемент - индекс 2,3
- элемент - индекс 3,2
- элемент - индекс 2,2
- элемент - индекс 0,3
- элемент - индекс 1,3
- элемент - индекс 0,2
- элемент - индекс 1,2
- элемент - индекс 3,0
- элемент - индекс 2,0
- элемент - индекс 3,1
- элемент - индекс 2,1
- элемент - индекс 0,0
- элемент - индекс 1,0
- элемент - индекс 0,1
элемент - индекс 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; }
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
Но вы действительно должны научиться использовать отладчик.
Для я = 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++;
}
}
когда к = 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++;
Как уже было отмечено, вы индексируете массив.
Так же, как предложение, версия на основе таблицы может быть менее сложной, чтобы получить право:
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]];
}
}
Это также на пару строк короче.