2016-12-17 4 views
-3

Je voudrais obtenir de l'aide, je reçois cette erreur lors de l'application en cours d'exécutionAccès emplacement de lecture de violation 0xFDFDFDFD

Exception lancée à 0x0029B23D dans ConsoleApplication1.exe: 0xC0000005: Accès emplacement de lecture de violation 0xFDFDFDFD. S'il existe un gestionnaire pour cette exception, le programme peut être poursuivi en toute sécurité.

Je pense que le problème accède à la région de mémoire non paginée

Voici mon code

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); 
} 

Le problème vient de la fonction de définition, le programme démarre mais lorsque je tente de continuer juste apparaît encore et encore.

+5

Le bon outil pour résoudre ces problèmes est votre débogueur. Vous devez parcourir votre code ligne par ligne * avant * de demander Stack Overflow. Pour plus d'aide, veuillez lire [Comment déboguer de petits programmes (par Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Au minimum, vous devriez [modifier] votre question pour inclure un exemple [Minimal, Complet et Vérifiable] (http://stackoverflow.com/help/mcve) qui reproduit votre problème, ainsi que les observations que vous avez faites dans le débogueur. –

+1

Pourquoi allumez-vous 'tab [& py] [& px]' au lieu de 'tab [py] [px]'? – doctorlove

+0

Votre code tel que posté a plusieurs fonctions dont vous ne nous avez pas dit la définition de. Quelle ligne génère l'erreur? Est-ce de l'une des fonctions que nous ne pouvons pas voir? – doctorlove

Répondre

1

En utilisant tab[&py][&px] arrive à faire le compilateur accepter le code, mais il est juste totalement erroné. Vous dites accidentellement au compilateur que &py est un tableau et tab est l'index, alors que ce devrait être l'inverse.

que l'indexation « fonctionne » dépend de cette bizarrerie du langage C:

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

je suppose que la façon dont l'intention d'utiliser la fonction était

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; 
} 

mais cela ne Travailler non plus, car le compilateur ne peut pas connaître la longueur des lignes dans la matrice. Cela dépend du paramètre size transmis à la fonction create_tab, que le definition ne connaît pas. En outre, si la fonction a fonctionné, vous devez collecter la valeur direction retournée dans main. Sinon, la mise à jour sera perdue.

Si vous avez l'intention que cela soit en C++, vous pouvez créer std::vector<std::vector<int>> pour éviter la plupart de ces problèmes.