Tableau 2 dimentions, pointeur
Bonsoir,
Je débute en C et je bloque au niveau des tableaux.
j'essai de remplir un tableau à 2 dimention avec 0;
Lors de la compilation du code suivant, il n'y a pas d'erreur de compilation, mais à l'utilisation, je saisi 3 ça marche, mais avec 5 ça bug, d'ou cela vient t'il?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int nbr;
int a, b, c;
int carreMag[nbr][nbr];
int *pcarre;
pcarre = (int*)malloc(sizeof(int)*nbr*nbr);
int point;
/* Contrôle de la valeur entrée */
do
{
printf("Entrer un nombre impair : ");
scanf("%d",&nbr);
}while((nbr%2)==0);
/* Initialisation des valeurs du tableau à 0*/
for(a=0; a<nbr; a++)
{
for(b=0; b<nbr; b++)
{
carreMag[a][b]=0;
printf("[a%d] [b%d] = %d | ", a, b, carreMag[a][b]);
}
printf("\n");
}
free(pcarre);
system("PAUSE");
return 0;
} |
[/code]
Re: Tableau 2 dimentions, pointeur
Citation:
Envoyé par DidierMesenbourg
j'essai de remplir un tableau à 2 dimensions avec 0;
Lors de la compilation du code suivant, il n'y a pas d'erreur de compilation, mais à l'utilisation, je saisi 3 ça marche, mais avec 5 ça bug, d'ou cela vient t'il?
Ton code met en oeuvre un concept nouveau du langage C (C99) appelé VLA (Variable Lenth Array). Le comportement est indéfini parce que la valeur de nbr est indéfinie au moment où le tableau carreMag est défini.
D'autre part, tu utilises une définition dynamique du tableau basée sur le fait qu'un tableau à 2 dimensions est linéaire (ce qui est correct), mais curieusement, tu n'exploites pas ce code (il est non inutile ici).
N'étant pas un grand fan des VLA que je trouve dangereux, je propose de développer le principe du tableau 2D avec un malloc(). Le problème est l'accès aux éléments du tableau, car évidemment la notation [][] ne convient pas (la tableau n'a qu'une dimension). Le principe est donc de calculer l'adresse de l'éléments à partir des paramètres connus (adresse de base, taille d'une dimension) et des éléments variables (coordonnées x et y). C'esr le rôle de la macro ADR (qui pourrait aussi bien être une fonction)
Ton code corrigé. Pose des questions si tu ne comprends pas.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
#include <stdio.h>
#include <stdlib.h>
#define ADR(p, n, x, y) \
((p)+((x)*(n)+(y)))
int main (void)
{
int nbr;
/* Controle de la valeur entree */
{
int ret;
do
{
printf ("Entrer un nombre impair : ");
ret = scanf ("%d", &nbr);
}
while (ret != 1 && (nbr % 2) == 0);
}
{
int *p_carreMag = malloc (sizeof *p_carreMag * nbr * nbr);
/* Initialisation des valeurs du tableau à 0 */
if (p_carreMag != NULL)
{
int a, b;
for (a = 0; a < nbr; a++)
{
for (b = 0; b < nbr; b++)
{
*ADR (p_carreMag, nbr, a, b) = 0;
printf ("[a%d] [b%d] = %d | ", a, b, *ADR (p_carreMag, nbr, a, b));
}
printf ("\n");
}
free (p_carreMag),p_carreMag=NULL;
}
}
system ("PAUSE");
return 0;
} |
Nota : concernant les entrées, scanf() est déconseillée, car difficile à mettre en oeuvre correctement.
http://emmanuel-delahaye.developpez....tes.htm#saisie