Passage d'un tableau a X dimensions a une fonction et ANSI

AsM0DeUz Messages postés 19 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 4 février 2009 - 18 nov. 2008 à 12:20
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 - 18 nov. 2008 à 21:06
Bonjour,

J'aurai besoin d'un petit eclaircissement dans le cas ci dessous (c'est juste un exemple) :

#include <stdio.h>
  2
  3 void filltab(int, int *, int, int);
  4 void printok(int, int *, int, int);
  5
  6 int main()
  7 {
  8         int tab[3][2] = {{0,0},{0,0},{0,0}};
  9         filltab(5, tab, 3 , 2);
 10         printok(5, tab, 3 , 2);
 11 }
 12
 13 void filltab(int number, int *tab, int line, int column)
 14 {
 15         int i;
 16
 17         for (i=0; i < line*column; i++)
 18                 *(tab+i) = number;
 19 }
 20
 21 void printok(int number, int *tab, int line, int column)
 22 {
 23         int i;
 24
 25         for (i=0; i < line*column; i++)
 26                 if(*(tab+i) == number)
 27                         printf("OK");
 28 }

Lors de la compilation avec gcc j'ai le message suivant :

gcc -ansi test.c
test.c: In function ‘main’:
test.c:9: warning: passing argument 2 of ‘filltab’ from incompatible pointer type
test.c:10: warning: passing argument 2 of ‘printok’ from incompatible pointer type

donc si dans les lignes 9 et 10 je cast (int *), je n'ai plus le probleme.

 9         filltab(5, (int *)tab, 3 , 2);
10         printok(5, (int *)tab, 3 , 2);

Apres m'etre renseigné a gauche et a droite, certains disent que ca vient du compilateur qui ne repondrait pas à la norme ANSI qui dirait qu'un tableau tab[] et *tab c'est la meme chose (qu'il y ait X dimensions vu qu'en mémoire toutes les cases se suivent). Pourtant lors de la compil je mets bien -ansi ce qui me semble devrait régler le problème.

Est ce bien un probleme (ou non suivi de la norme ANSI) de compilateur ?

Merci

3 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
18 nov. 2008 à 13:32
Salut

Normalement tu as deux choix

Bon coding


cas 1
void
test (int **tab, int len_in, int len_out) {
for (int i = 0; i < len_out; i++)
for (int j = 0; j < len_in; j++)
cout<<tab[i][j];
}

int
main () {
int **tab;
//initialisation
test (tab);
}


cas 2

void
test (int tab[][], int len_in, int len_out) {
for (int i = 0; i < len_out; i++)
for (int j = 0; j < len_in; j++)
cout<<tab[i][j];
}

int
main () {
int tab[][];
//initialisation
test (tab);
}
0
AsM0DeUz Messages postés 19 Date d'inscription jeudi 17 août 2006 Statut Membre Dernière intervention 4 février 2009
18 nov. 2008 à 15:39
Salut

Normalement tu as deux choix

Bon coding



Merci pour cette reponse meme si elle ne reponds pas vraiment a ma question

Pq ces 2 solutions seraient meilleures ? le (int *) fonctionne tres bien, sans aussi d'ailleurs mais y a des warnings.

C'est plutot une réponse théorique que je cherche quitte à ce qu'on me renvoie vers un page des specs ANSI ou autre

Merci
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
18 nov. 2008 à 21:06
Salut,

int *tab et int tab[] sont bien la même choses.
ce qui est différent c'est int *tab et int tab[n][m] (qui est identique int **tab).
La présence de warning est donc bien normal. Un cast pour indiquer au compilo que tu sais ce que tu fais les fera disparaitre.

--Vive le CSavon
0
Rejoignez-nous