2016-12-17 4 views
-3

Я хотел бы получить некоторую помощь, я получаю эту ошибку при запуске приложениюДоступ чтение нарушения расположение 0xFDFDFDFD

Exception брошенного в 0x0029B23D в ConsoleApplication1.exe: 0xC0000005: Доступ расположение чтения нарушения 0xFDFDFDFD. Если для этого исключения имеется обработчик , программа может быть безопасно продолжена.

Я думаю, что проблема доступ к невыгружаемой области памяти

Вот мой код

int ** create_tab(int size) 
{ 
    int ** tab = new int *[size]; 
    for (int i = 0; i < size; i++) 
    { 
     tab[i] = new int[size]; 
    } 
    return tab; 
} 
int definition(int direction, int px, int py, int tab) 
{ 
    switch (tab[&py][&px]) { 
    case 1: 
     tab[&py][&px] = 0; 
     direction = direction - 1; 
     break; 
    case 0: 
     tab[&py][&px] = 1; 
     direction = direction + 1; 
     break; 
    } 
    return direction; 
} 
int main() 
{ 
    int px = 0; 
    int py = 0; 
    int direction = 0; 
    int size = 0; 
    int steps = 0; 
    int steps_done = 0; 
    for (int steps_done = 0;steps_done < steps;steps_done++) 
    { 
     system("cls"); 
     turningaround(direction); 
     moves(direction, px, py); 
     looping_tab(px, py, size); 
     definition(direction, px, py, ** tab); 
     printing(size, ** tab); 
} 

Проблема возникает из функции определения, запускается программа, но когда я пытаюсь продолжить это просто появляется снова и снова.

+5

Правильный инструмент для решения таких проблем - ваш отладчик. Перед тем, как просить о переполнении стека, вы должны пропустить свой код по очереди *. Для получения дополнительной информации, пожалуйста, прочтите [Как отлаживать небольшие программы (Эрик Липперт)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Как минимум, вы должны \ [изменить] ваш вопрос, чтобы включить пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), который воспроизводит вашу проблему, а также замечания, сделанные вами в отладчик. –

+1

Почему вы используете 'tab [& py] [& px]' вместо 'tab [py] [px]'? – doctorlove

+0

Ваш код, как опубликовал, имеет несколько функций, которые вы не сказали нам. Какая строка генерирует ошибку? Это одна из функций, которые мы не можем видеть? – doctorlove

ответ

1

Использование tab[&py][&px] происходит, чтобы заставить компилятор принять код, но это всего лишь полностью не так. Вы случайно сообщите компилятору, что &py - это массив, а tab - это индекс, когда он должен быть наоборот.

То, что индексация «работает», зависит от этой причуды языка C:

With arrays, why is it the case that a[5] == 5[a]?

Я думаю предполагаемый способ использования функции была

int definition(int direction, int px, int py, int** tab) 
{ 
    switch (tab[py][px]) { 
    case 1: 
     tab[py][px] = 0; 
     direction = direction - 1; 
     break; 
    case 0: 
     tab[py][px] = 1; 
     direction = direction + 1; 
     break; 
    } 
    return direction; 
} 

но это не работа либо, так как компилятор не может знать длины строк в матрице. Это зависит от параметра size, переданного функции create_tab, о которой definition ничего не знает.

Кроме того, если функция сработала, вам необходимо будет собрать возвращаемое значение direction в main. В противном случае обновление будет потеряно.

Если вы хотите, чтобы это было C++, вы можете сделать tab a std::vector<std::vector<int>>, чтобы избежать большинства из этих проблем.