En fait, j’ai étudié un peu C pendant les vacances d’hiver et, au cours de mes aventures, j’ai trébuché sur un problème avec un Dynamic Array.
C’est un programme assez simple, vraiment. Ce que j’essaie de faire est de créer un tableau contenant les numéros de la série de Fibonacci. Voici le code:
#include #include int dynamic_arry_append(int* arry, int* number, int* size); int main() { int i, n, size = 3, *arry = NULL, fibarr[size]; printf("Dynamic array, Fibonacci series. \n"); printf("Capture upto element: "); scanf("%d", &n); i = 0; // passing the first elements fibarr[0] = 0; fibarr[1] = 1; fibarr[2] = 1; while ( i < n ) { printf("**%d\n",fibarr[0]); dynamic_arry_append( arry, &fibarr[0], &size ); fibarr[0] = fibarr[1]; fibarr[1] = fibarr[2]; fibarr[2] = fibarr[1] + fibarr[0]; i++; } for ( i = 0 ; i < size ; i++) printf("Element %d of the array: %d.\n", i, arry[i]); return 0; } int dynamic_arry_append(int* arry, int* number, int* size) { int i; int bacon = *size; // first name i thought of bacon++; int *new_addr = realloc(arry, bacon * sizeof(int)); if( new_addr != NULL ) { arry = new_addr; arry[bacon-1] = *number; // printf for easier debugging, or so i thought for ( i = 0 ; i < bacon ; i++ ) printf("%d\t%d\n", i+1, arry[i]); printf("\n"); *size = bacon; } else { printf("Error (re)allocating memory."); exit (1); } return 0; }
Au moins dans mon esprit cela fonctionne. Cependant, dans la pratique, j’obtiens des résultats amusants:
Dynamic array, Fibonacci series. Capture upto element: 5 **0 // next fibonacci number 1 5256368 2 5246872 3 1176530273 4 0 **1 1 5256368 2 5246872 3 1768053847 4 977484654 5 1 **1 1 5256368 2 5246872 3 1551066476 4 1919117645 5 1718580079 6 1 **2 1 5256368 2 5246872 3 977484645 4 1852397404 5 1937207140 6 1937339228 7 2 **3 1 5256368 2 5246872 3 1551071087 4 1953724755 5 842231141 6 1700943708 7 977484653 8 3 /* Code::Blocks output */ Process returned -1073741819 (0xC0000005) execution time : 17.886 s Press any key to continue.
Je suis vraiment dérouté par cette erreur, et après avoir cherché partout, je n’ai trouvé aucune solution … Quelqu’un peut-il m’aider? Merci beaucoup.
#include #include int * dynamic_array_append(int * array, int size); int main() { int i, n, size=0, *array = NULL; printf("Dynamic array, Fibonacci series. \n"); printf("Capture upto element: "); scanf("%d", &n); for (i=0 ; i
Points à noter:
main
et stocké dans un pointer-to-int
(ou) passer pointer-to-pointer-to-int
et le mettre à jour en conséquence une fois après la réaffectation. fibarr
n'est pas nécessaire. Cela ne résout aucun problème. size
et le number
. Il suffit d’envoyer la size
et il choisira les n-1
et n-2
pour calculer n
. highly inefficient
. Parce que si vous connaissez le n
vous pouvez allouer de la mémoire pour n
entiers en une fois et calculer la série fib. Le problème peut être que la variable pointeur arry
est passée valeur par valeur à la fonction dynamic_arry_append
. Cela signifie que les modifications que vous apportez à la variable arry
au sein de cette fonction ne seront reflétées par aucune variable en dehors de cette fonction. Par exemple:
int *a = NULL; someFunc(a); // a will still be NULL here no matter what someFunc does to it.
Vous devez déclarer votre fibarr
comme un pointeur (donc fibarr
le différemment) et non comme un tableau. Et vous devriez passer à votre dynamic_arry_append
l’adresse de ce pointeur, comme &fibarr
. Et vous devriez initialiser fibarr
dans votre main
avec calloc
. Enfin, vous devez mettre à jour de manière dynamic (et conserver et transmettre) la taille du tableau alloué.
Vous ne retournez pas la nouvelle adresse du tableau … et vous ne lisez / écrivez pas votre mémoire. Exécutez le programme avec tous les messages d’erreur sous le débogueur et vous verrez que le problème se trouve dans cette ligne:
dynamic_arry_append( arry, &fibarr[0], &size );