echec de compilation avec fonction d'une instructio !!

Le
andre barbaroux
Bosoir à tous,
Débutant en C, jeunot de 84 ans, je réussis à ne pas compiler une fonction
de une instruction, j'utilise le compilateur C (GNU) de codeblocks, ce Sp
est destiné à imprimer un tableau ligne à ligne . Le precompilateur
m'indique toujours:
line 25 error expected ')' 'before' '[' token Qur je ne comprend pas?
cette ligne est la declaration de la fonction
C'est pourquoi j'ai mis en commentaire toute la fonction et la même erreur
toujours.

Merci de regarder ;-)



int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme
}

/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])

{
printf("%d",nbligne);
}
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Antoine Leca
Le #26291312
Le 22/07/2014 18:48, andre barbaroux écrivit :
int main()
{
int ligne;


une déclaration, OK
int col;


une autre déclaration, OK
ligne=2;


une instruction maintenant
col=3;


une autre instruction, OK
int tableau[ligne][col];


une déclaration, c'est pas bon !

Normalement, il faut déclarer ses variables avant de commencer à programmer.


Antoine
P.S.: je sais parfaitement qu'il y a d'autres solutions (C99) mais je ne
pense pas que ce soient de _bonnes_ solutions.
andre barbaroux
Le #26291522
Je vais voir et décaler la déclaration, merci d'avoir répondu, j'espère que
c'est ça, mais dans ce cas les messages du précompilateur
sont.....incomprehensibles..
Merci d'avoir répondu

"Antoine Leca" lqm5b4$915$
Le 22/07/2014 18:48, andre barbaroux écrivit :
int main()
{
int ligne;


une déclaration, OK
int col;


une autre déclaration, OK
ligne=2;


une instruction maintenant
col=3;


une autre instruction, OK
int tableau[ligne][col];


une déclaration, c'est pas bon !

Normalement, il faut déclarer ses variables avant de commencer à
programmer.


Antoine
P.S.: je sais parfaitement qu'il y a d'autres solutions (C99) mais je ne
pense pas que ce soient de _bonnes_ solutions.
espie
Le #26291512
In article andre barbaroux

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme
}

/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])

{
printf("%d",nbligne);
}



C'est ton code tel quel ? tu pourrais pas nous donner l'integralite du
code, et pas un fragment ?

parce que la, je vois pas la definition de ta fonction... ca va etre
un peu croquignolesque. Je vois pas non plus

#include
autre source de probleme possible.

Si tu as juste rajoute "ligne 25": ben ce que tu ecris derriere, c'est
pas une definition de fonction en bonne et due forme... ca devrait
plus ressembler a un truc genre:

int imp_tablo(int nbligne, int nbcol, int tablo[nbligne][nbcol])


Apres, il y a quelques soucis dans tout ca. Tu te bases sur quoi comme
texte pour apprendre ?

Antoine etait gene avec tes declarations melangees au code, mais a cote,

int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];


ne fonctionnera que dans cet ordre, et que en C99, pour plein de raisons...
Olivier Miakinen
Le #26291602
Bonjour,

Le 22/07/2014 18:48, andre barbaroux a écrit :
[...]
line 25 error expected ')' 'before' '[' token
[...]



Voyons voir.

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];



Si tu déclares un tableau de tailles fixes, le nombre de lignes et de
colonnes doivent être des constantes. Par exemple :

#define NB_LIGNES 2
#define NB_COLONNES 3

int main()
{
int tableau[NB_LIGNES][NB_COLONNES];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;



Puisque tu initialises le tableau de façon statique, tu peux tout
aussi bien le faire dès la déclaration :

#define NB_LIGNES 2
#define NB_COLONNES 3

int main()
{
int tableau[NB_LIGNES][NB_COLONNES] = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};


imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme



Attention, l'écriture tableau[ligne][colonne] désigne un élément du
tableau, avec ligne compris entre 0 et 1, colonne entre 0 et 2, et
non pas le tableau tout entier. Apparemment, les dimensions du tableau
sont données dans les premiers paramètres de la fonction.

Donc :

imp_tablo(NB_LIGNES,NB_COLONNES,tableau); // appel sous-programme

Cordialement,
--
Olivier Miakinen
Samuel DEVULDER
Le #26291682
Le 22/07/2014 18:48, andre barbaroux a écrit :

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme


^^^^

Ici je sens qu'il y a un pb. En effet tu remplies le tableau juste au
dessus et tu passe au sous programme la valeur en cellule (col,ligne).

Donc d'une part le reste du tableau ne sert à rien et on avait pas
besoin de l'initialiser, mais en plus tu accèdes carrément à l’extérieur
des bornes du tableau et ca, ca plante!

Je pense plutôt que tu voulais envoyer l'intégralité (ou un pointeur
sur...) du tableau au sous-programme.

Est-ce que j'ai bien deviné ce que tu voulais faire?




Par ailleurs je vois que tu utilises des tableaux de taille variable.
C'est pas une super bonne idée. Le C est un vieux langage qui ne possède
pas de sémantique très forte à la Pascal pour le type tableau. Le C
prèfère de loin les tableaux de taille fixe.

Ici moi j'aurais deux #define définissant globalement le nombre de
lignes/colonnes (voir la réponse d'Olivier Miakinen)


/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])



Sauf qu'on ne peut pas déclarer un tableau de taille variable en
paramètre de cette façon. Comme je le disais, le C prèfère de loin les
tableaux de taille fixe. Pour les tailles variables, je pense qu'un
pointeur est bien plus adapté.

// dans cette fonction on accède à l'élement (x,y) par tablo[y][x]
int imp_tablo(int nbligne, int nbcol, int **tablo)

Mais attention car dans ce cas passer le tableau tel qu'initialisé dans
le main() ne sera pas bon. Il faudra passer à imp_tablo en réalité un
pointeur sur les lignes du tableau:

int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

// hélas on ne peut pas passer tableau tel
// que à imp_tablo(int, int, int **)
// il faut construire un tableau temporaire
// pour y stocker les pointeurs sur le début
// de ligne

{ // <== on ouvre un bloc pour pouvoir déclarer des vars locales
int *tablo_de_lignes[ligne];
tablo_de_lignes[0] = tableau[0];
tablo_de_lignes[1] = tableau[1];

imp_tablo(ligne, col, tablo_de_lignes);
}





Maintenant il était aussi possible, sachant que le tableau que tu
intialise est organisé ligne à ligne sans trou en mémoire, d'avoir un
autre imp_tablo2 qui prend en argument la taille du tableau et un
pointeur sur la cellule (0,0) du tableau:

// dans cette fonction l'element (x,y) est accédé par tablo[y * nbcol + x]
int imp_tablo2(int nbligne, int nbcol, int *tablo);

int main(int argc, char **argv)
{
int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo2(ligne, col, &tableau[0][0]);
}

a+

sam.
Antoine Leca
Le #26292562
Le 22/07/2014 20:32, Marc Espie écrivit :
Antoine etait gene avec tes declarations melangees au code, mais a cote,

int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];


ne fonctionnera que dans cet ordre, et que en C99, pour plein de raisons...



Oups, je n'avais pas vu le tableau à taille variable... désolé pour la
fausse piste :-(


Antoine
andre barbaroux
Le #26293422
Tout d'abord merci pour vos reponses.
Pour Marc Espie, j'ai transmis tout le code à partir d'un code pkus grand et
qui me donnait toujours la même réponse quellesque soient mes modifications.
J'ai donc décidé de ne laisser que la fonction et le main qui l'appelle.
Selon moi la définition de la fonction est la ligne 25 que m'indique le
compilateur (le texte du code a été reporté par copier/coller et le texte
"ligne 25" a été rajouté par mes soins comme si ça avait été le
compilateur).
J'ai bien le includr stdio.h et stdlib.h
J(utilise l'environnement écodeblocs" downloadé sur sourceforge.

Pour olivier Makinien
Je pense que je ne sais pas bien comment passer un tableau, que je voudrais
en "global donc à l'exterieur ge tout programme main et sous
programmes.J'avais programmé il y a for longtemps en une quinzaine
d'instructions fortran le cheminement du cavalier au jeu d'echec (donc je
veux déclarer en global un tableau echec de 8x8 cases et plus generalement
un tableau deux dimensions quelles que soit le nombre de lignes et de
colonnes"

imp_tablo(NB_LIGNES,NB_COLONNES,tableau);

Je veux depuis le main passer passer le bombre de lignes , de colonne et
le nom du tableau, avec ou sans les crochets indiquant les tableau multi
dimensionnel

A Samuel Devulder
Voila mon appel de fontion
"imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme"

J'ai ecris cela apré avoir tenté sans les cellules.Je pense qu"effectivement
j'ai un probleme avec les tableaux multidimensionnel. Tu as bien deviné ce
que je veux faire passer en fait l'adresse du taleau et ses dimensions. On
peut certainement par un pointeur, mais je veux enseigner un peu mon petit
fils et je suis loin de cela. Je n'ai pas eu de problème en lui expliquant
AVEC un tableau à deuxdimension. J'ai ecrit un petit programme qui marche
trés bien et qui montre le global, l'appel de fonction.#include #include int short tableau[8][8];
int toto;

// programme principal

int main()
{
// sous-programme

tableau[0][0]=9;
imp_tablo(toto);
return 0;
}
// sous programme

imp_tablo(tata)
{

printf("%d",tata);
printf("%d",toto);
printf("%d",tableau[0][0]);
toto=3;

}
Quelle est la difference avec le programme incriminé qui ne fait Rien sauf
un appel,ça pourrait être une erreur à l'exécution mais là à la
compilation!! Je vous remercie tous, je vaisexploiter vos remarques.
..........................................................................................................................................................;
Marc Espie" lqmanh$188$
In article andre barbaroux

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme
}

/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])

{
printf("%d",nbligne);
}



C'est ton code tel quel ? tu pourrais pas nous donner l'integralite du
code, et pas un fragment ?

parce que la, je vois pas la definition de ta fonction... ca va etre
un peu croquignolesque. Je vois pas non plus

#include
autre source de probleme possible.

Si tu as juste rajoute "ligne 25": ben ce que tu ecris derriere, c'est
pas une definition de fonction en bonne et due forme... ca devrait
plus ressembler a un truc genre:

int imp_tablo(int nbligne, int nbcol, int tablo[nbligne][nbcol])


Apres, il y a quelques soucis dans tout ca. Tu te bases sur quoi comme
texte pour apprendre ?

Antoine etait gene avec tes declarations melangees au code, mais a cote,

int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];


ne fonctionnera que dans cet ordre, et que en C99, pour plein de
raisons...
andre barbaroux
Le #26293462
Tout d'abord merci pour vos reponses.
Pour Marc Espie, j'ai transmis tout le code à partir d'un code pkus grand et
qui me donnait toujours la même réponse quellesque soient mes modifications.
J'ai donc décidé de ne laisser que la fonction et le main qui l'appelle.
Selon moi la définition de la fonction est la ligne 25 que m'indique le
compilateur (le texte du code a été reporté par copier/coller et le texte
"ligne 25" a été rajouté par mes soins comme si ça avait été le
compilateur).
J'ai bien le includr stdio.h et stdlib.h
J(utilise l'environnement écodeblocs" downloadé sur sourceforge.

Pour olivier Makinien
Je pense que je ne sais pas bien comment passer un tableau, que je voudrais
en "global donc à l'exterieur ge tout programme main et sous
programmes.J'avais programmé il y a for longtemps en une quinzaine
d'instructions fortran le cheminement du cavalier au jeu d'echec (donc je
veux déclarer en global un tableau echec de 8x8 cases et plus generalement
un tableau deux dimensions quelles que soit le nombre de lignes et de
colonnes"

imp_tablo(NB_LIGNES,NB_COLONNES,tableau);

Je veux depuis le main passer passer le bombre de lignes , de colonne et
le nom du tableau, avec ou sans les crochets indiquant les tableau multi
dimensionnel

A Samuel Devulder
Voila mon appel de fontion
"imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme"

J'ai ecris cela apré avoir tenté sans les cellules.Je pense qu"effectivement
j'ai un probleme avec les tableaux multidimensionnel. Tu as bien deviné ce
que je veux faire passer en fait l'adresse du taleau et ses dimensions. On
peut certainement par un pointeur, mais je veux enseigner un peu mon petit
fils et je suis loin de cela. Je n'ai pas eu de problème en lui expliquant
AVEC un tableau à deuxdimension. J'ai ecrit un petit programme qui marche
trés bien et qui montre le global, l'appel de fonction.#include #include int short tableau[8][8];
int toto;

// programme principal

int main()
{
// sous-programme

tableau[0][0]=9;
imp_tablo(toto);
return 0;
}
// sous programme

imp_tablo(tata)
{

printf("%d",tata);
printf("%d",toto);
printf("%d",tableau[0][0]);
toto=3;

}
Quelle est la difference avec le programme incriminé qui ne fait Rien sauf
un appel,ça pourrait être une erreur à l'exécution mais là à la
compilation!! Je vous remercie tous, je vaisexploiter vos remarques
..............................................................................................................................................;;;
"Samuel DEVULDER" <samuel-dot-devulder-at-laposte-dot-net> a écrit dans le
message de news: 53cec26a$0$2389$
Le 22/07/2014 18:48, andre barbaroux a écrit :

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme


^^^^

Ici je sens qu'il y a un pb. En effet tu remplies le tableau juste au
dessus et tu passe au sous programme la valeur en cellule (col,ligne).

Donc d'une part le reste du tableau ne sert à rien et on avait pas besoin
de l'initialiser, mais en plus tu accèdes carrément à l’extérieur des
bornes du tableau et ca, ca plante!

Je pense plutôt que tu voulais envoyer l'intégralité (ou un pointeur
sur...) du tableau au sous-programme.

Est-ce que j'ai bien deviné ce que tu voulais faire?




Par ailleurs je vois que tu utilises des tableaux de taille variable.
C'est pas une super bonne idée. Le C est un vieux langage qui ne possède
pas de sémantique très forte à la Pascal pour le type tableau. Le C
prèfère de loin les tableaux de taille fixe.

Ici moi j'aurais deux #define définissant globalement le nombre de
lignes/colonnes (voir la réponse d'Olivier Miakinen)


/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])



Sauf qu'on ne peut pas déclarer un tableau de taille variable en paramètre
de cette façon. Comme je le disais, le C prèfère de loin les tableaux de
taille fixe. Pour les tailles variables, je pense qu'un pointeur est bien
plus adapté.

// dans cette fonction on accède à l'élement (x,y) par tablo[y][x]
int imp_tablo(int nbligne, int nbcol, int **tablo)

Mais attention car dans ce cas passer le tableau tel qu'initialisé dans le
main() ne sera pas bon. Il faudra passer à imp_tablo en réalité un
pointeur sur les lignes du tableau:

int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

// hélas on ne peut pas passer tableau tel
// que à imp_tablo(int, int, int **)
// il faut construire un tableau temporaire
// pour y stocker les pointeurs sur le début
// de ligne

{ // <== on ouvre un bloc pour pouvoir déclarer des vars locales
int *tablo_de_lignes[ligne];
tablo_de_lignes[0] = tableau[0];
tablo_de_lignes[1] = tableau[1];

imp_tablo(ligne, col, tablo_de_lignes);
}





Maintenant il était aussi possible, sachant que le tableau que tu
intialise est organisé ligne à ligne sans trou en mémoire, d'avoir un
autre imp_tablo2 qui prend en argument la taille du tableau et un pointeur
sur la cellule (0,0) du tableau:

// dans cette fonction l'element (x,y) est accédé par tablo[y * nbcol + x]
int imp_tablo2(int nbligne, int nbcol, int *tablo);

int main(int argc, char **argv)
{
int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo2(ligne, col, &tableau[0][0]);
}

a+

sam.
andre barbaroux
Le #26293452
Tout d'abord merci pour vos reponses.
Pour Marc Espie, j'ai transmis tout le code à partir d'un code pkus grand et
qui me donnait toujours la même réponse quellesque soient mes modifications.
J'ai donc décidé de ne laisser que la fonction et le main qui l'appelle.
Selon moi la définition de la fonction est la ligne 25 que m'indique le
compilateur (le texte du code a été reporté par copier/coller et le texte
"ligne 25" a été rajouté par mes soins comme si ça avait été le
compilateur).
J'ai bien le includr stdio.h et stdlib.h
J(utilise l'environnement écodeblocs" downloadé sur sourceforge.

Pour olivier Makinien
Je pense que je ne sais pas bien comment passer un tableau, que je voudrais
en "global donc à l'exterieur ge tout programme main et sous
programmes.J'avais programmé il y a for longtemps en une quinzaine
d'instructions fortran le cheminement du cavalier au jeu d'echec (donc je
veux déclarer en global un tableau echec de 8x8 cases et plus generalement
un tableau deux dimensions quelles que soit le nombre de lignes et de
colonnes"

imp_tablo(NB_LIGNES,NB_COLONNES,tableau);

Je veux depuis le main passer passer le bombre de lignes , de colonne et
le nom du tableau, avec ou sans les crochets indiquant les tableau multi
dimensionnel

A Samuel Devulder
Voila mon appel de fontion
"imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme"

J'ai ecris cela apré avoir tenté sans les cellules.Je pense qu"effectivement
j'ai un probleme avec les tableaux multidimensionnel. Tu as bien deviné ce
que je veux faire passer en fait l'adresse du taleau et ses dimensions. On
peut certainement par un pointeur, mais je veux enseigner un peu mon petit
fils et je suis loin de cela. Je n'ai pas eu de problème en lui expliquant
AVEC un tableau à deuxdimension. J'ai ecrit un petit programme qui marche
trés bien et qui montre le global, l'appel de fonction.#include #include int short tableau[8][8];
int toto;

// programme principal

int main()
{
// sous-programme

tableau[0][0]=9;
imp_tablo(toto);
return 0;
}
// sous programme

imp_tablo(tata)
{

printf("%d",tata);
printf("%d",toto);
printf("%d",tableau[0][0]);
toto=3;

}
Quelle est la difference avec le programme incriminé qui ne fait Rien sauf
un appel,ça pourrait être une erreur à l'exécution mais là à la
compilation!! Je vous remercie tous, je vaisexploiter vos remarques
.......................................................................................................................................................
"Antoine Leca" lqnui2$7ag$
Le 22/07/2014 20:32, Marc Espie écrivit :
Antoine etait gene avec tes declarations melangees au code, mais a cote,

int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];


ne fonctionnera que dans cet ordre, et que en C99, pour plein de
raisons...



Oups, je n'avais pas vu le tableau à taille variable... désolé pour la
fausse piste :-(


Antoine

andre barbaroux
Le #26293832
re-bonsoir;
Je me rend compte qu'avec toutes mes explication j'ai oublié l'essentiel de
ma question initiale:
Avec uniquement un main qui ne fait rien sauf initialiser des variables et
appeler la fontion le compilateur m(envoie ce message. Qu'a de particulier
au niveau syntaxe cette fonction

Merci
"Samuel DEVULDER" <samuel-dot-devulder-at-laposte-dot-net> a écrit dans le
message de news: 53cec26a$0$2389$
Le 22/07/2014 18:48, andre barbaroux a écrit :

int main()
{
int ligne;
int col;
ligne=2;
col=3;
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo(ligne,col,tableau[ligne][col]); // appel sous-programme


^^^^

Ici je sens qu'il y a un pb. En effet tu remplies le tableau juste au
dessus et tu passe au sous programme la valeur en cellule (col,ligne).

Donc d'une part le reste du tableau ne sert à rien et on avait pas besoin
de l'initialiser, mais en plus tu accèdes carrément à l’extérieur des
bornes du tableau et ca, ca plante!

Je pense plutôt que tu voulais envoyer l'intégralité (ou un pointeur
sur...) du tableau au sous-programme.

Est-ce que j'ai bien deviné ce que tu voulais faire?




Par ailleurs je vois que tu utilises des tableaux de taille variable.
C'est pas une super bonne idée. Le C est un vieux langage qui ne possède
pas de sémantique très forte à la Pascal pour le type tableau. Le C
prèfère de loin les tableaux de taille fixe.

Ici moi j'aurais deux #define définissant globalement le nombre de
lignes/colonnes (voir la réponse d'Olivier Miakinen)


/* Ceci est un sous-programme d'impression ligne à ligne d'un tableau.
Auquel on passe en parametre
le nom du tableau, le nombre de lignes, et de colonnesl*/

ligne 25: int imp_tablo(nbligne,nbcol,tablo[nbligne][nbcol])



Sauf qu'on ne peut pas déclarer un tableau de taille variable en paramètre
de cette façon. Comme je le disais, le C prèfère de loin les tableaux de
taille fixe. Pour les tailles variables, je pense qu'un pointeur est bien
plus adapté.

// dans cette fonction on accède à l'élement (x,y) par tablo[y][x]
int imp_tablo(int nbligne, int nbcol, int **tablo)

Mais attention car dans ce cas passer le tableau tel qu'initialisé dans le
main() ne sera pas bon. Il faudra passer à imp_tablo en réalité un
pointeur sur les lignes du tableau:

int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

// hélas on ne peut pas passer tableau tel
// que à imp_tablo(int, int, int **)
// il faut construire un tableau temporaire
// pour y stocker les pointeurs sur le début
// de ligne

{ // <== on ouvre un bloc pour pouvoir déclarer des vars locales
int *tablo_de_lignes[ligne];
tablo_de_lignes[0] = tableau[0];
tablo_de_lignes[1] = tableau[1];

imp_tablo(ligne, col, tablo_de_lignes);
}





Maintenant il était aussi possible, sachant que le tableau que tu
intialise est organisé ligne à ligne sans trou en mémoire, d'avoir un
autre imp_tablo2 qui prend en argument la taille du tableau et un pointeur
sur la cellule (0,0) du tableau:

// dans cette fonction l'element (x,y) est accédé par tablo[y * nbcol + x]
int imp_tablo2(int nbligne, int nbcol, int *tablo);

int main(int argc, char **argv)
{
int ligne = 2;
int col = 3;

// attention, extension du C avec un tableau de taille
// non défini à la compilation.
int tableau[ligne][col];

tableau[0][0]=1;
tableau[0][1]=2;
tableau[0][2]=3;
tableau[1][0]=4;
tableau[1][1]=5;
tableau[1][2]=6;

imp_tablo2(ligne, col, &tableau[0][0]);
}

a+

sam.
Publicité
Poster une réponse
Anonyme