2010-04-12 13 views
0

Ce programme est destiné à générer un tableau dynamique, mais il donne une erreur de violation d'accès lors de l'écriture lorsque certaines dimensions sont données. Par exemple: R = 6, C = 5 accidents, mais alors R = 5, C = 6 non. Dans le cas où vous vous demandez, ce n'est pas mon devoir de "réparer" ce programme brisé, c'est la méthode qu'on nous a enseignée en classe. Une partie de mon évaluation consiste à utiliser cette méthode, donc les vecteurs sont sortis. Merci d'avance!Violation d'accès lors de l'écriture de tableau 2D dynamique ... Parfois

#include <iostream> 

using namespace std; 

int main(){ 

const int R = 6; 
const int C = 5; 

char **d; 

d = new char *[R]; 

for(int i=0; i<C; ++i){ 
    d[i] = new char[C]; 
} 

//initialise 
for(int i=0; i<R; ++i){ 
    for(int j=0; j<C; ++j){ 
     d[i][j] = 'd'; 
     cout<<d[i][j]; 
    } 
    cout<<endl; 
} 
cout<<endl; 

system("pause"); 
return 0; 
} 
+1

Même si l'écriture 'd [r] [c]' pourrait sembler gentil, tout ces nouveaux appels pourraient devenir fastidieux pour des valeurs beaucoup plus grandes de R. Je donnerais donc 'char * d = new char [C * R]; pour (...) d [r * C + c] = 'd'; 'une pensée sérieuse. Il est possible d'arrondir 'C' à la prochaine puissance de 2, si la machine cible a des multiplications vraiment lentes. – ndim

+0

Même si vous pouvez y accéder avec la notation 'd [] []', cette structure n'est * pas * un tableau 2d. Quand vous écrivez 'char e [R] [C];' vous obtenez * un * bloc de mémoire totalisant 'R * C * sizeof (char)'. Avec la structure que vous utilisez (parfois appelée "tableau ragged") vous obtenez une allocation de 'R * sizeof (char *)' plus les allocations 'R' de' C * sizeof (char) '(qui peut ou non être contigu (ou même distinct!)) et il n'est pas nécessaire que chaque rangée ait la même longueur. Différentes choses. – dmckee

+0

Merci pour le conseil, @ndim, yer J'ai essayé de cette façon en premier mais je n'ai pas compris l'accès, pour le moment cela devrait être correct car R et C ne dépasseront pas 10. @dmckee, merci de clarifier, un peu au-dessus de ma tête, mais je suis sûr que cela aura du sens à temps. – fauxCoder

Répondre

4
for(int i=0; i<C; ++i){ 
    d[i] = new char[C]; 
} 

devrait être

for(int i=0; i<R; ++i){ 
    d[i] = new char[C]; 
} 
+0

Merci :), cela fonctionne très bien. – fauxCoder

3

Votre première boucle crée un nouveau tableau char pour les éléments du tableau d entre 0 et C-1 inclusivement. La seconde boucle externe passe de 0 à R-1 inclusivement. Le dernier d[i] accédé n'est donc pas initialisé. Cela échouera généralement.

Pour résoudre le problème, l'utiliser comme première boucle

for(int i=0; i<R; ++i){ 
    d[i] = new char[C]; 
}