Problème création de tableau multidimension

chodague Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   -  
Char Snipeur Messages postés 10112 Statut Contributeur -
Bonjour,

Je suis débutante en C et je veux créer en C le tableau de 4 dimension suivant:


unsigned char dest_ArtCoeff[ModelNum][SRC_ANGLE][CAMNUM][ART_COEF];


Le problème, c'est que je ne connais pas au moment de déclaration la taille de "ModelNum".
ModelNum ne peut donc pas etre un constant. Mais le compilateur demande toujour un constant pour construire
ce tableau.

J'aimerais savoir s'il y a la possibilité de déclarer ce tableau autrement sans savoir le valeur de "ModelNum".

J'ai utilisé VC 8 Express.
A voir également:

3 réponses

Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Salut.
c'est fesable, il faut utiliser malloc et les pointeurs :
unsigned char ****dest_ArtCoeff;
dest_ArtCoeff=(char****)malloc(ModelNum)
for (i= 0 à ModelNum){dest_ArtCoeff[i]=(char***)malloc(SRC_ANGLE); pour j allant de 0 à SRC_ANGLE, destcoeff[i][j]=(char**)malloc etc. }

Si ModelNum était le dernier paramètre du tableau, ça serait plus simple, tu n'aurai qu'un malloc à faire.
0
chodague Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup.
J'ai déja essayé de faire comme tu as dit mais quand je l'ai passé à l'autre fonction ça a l'air pas marché comme il faut. Peut être il y a des erreurs en passant les paramètres, vous pouvez le regarder svp.

Et voici mon code:

// La fonction que j'ai construit le tableau
void compareModule(int ModelNum)
{

//1. creation des tableau dynamique de 4D, je ne suis pas sure si je l'ai bien créé?
unsigned char**** dest_ArtCoeff;

dest_ArtCoeff = (unsigned char****) malloc(ModelNum * sizeof(unsigned char***));

for(i=0; i<ModelNum; i++){
dest_ArtCoeff[i] = (unsigned char***)malloc(SRC_ANGLE * sizeof(unsigned char**));
for(j=0; j<SRC_ANGLE; j++){
idest_ArtCoeff[i][j] = (unsigned char**)malloc(CAMNUM * sizeof(unsigned char*));
for(k=0; k<CAMNUM; k++){
dest_ArtCoeff[i][j][k] = (unsigned char*)malloc(ART_COEF* sizeof(unsigned char));
}
}
}


....
...
//2. Puis je veux affecter la valeur à dest_artCoeff[] comme vous voyez ci-dessous
(Avec cette façon d'affectation, la valeur obtenu dans dest_artCoeff est bien dans la forme unsigned char***?
Vous pouvez m'expliquer?)


Count = 0;
while(...){
...
fpt = fopen(filename, "rb");
fread(dest_ArtCoeff[Count], ANGLE * CAMNUM * ART_COEF, sizeof(unsigned char), fpt);
fclose(fpt);
Count++
}

//3. Enfin, je veux passer dest_artCoeff[Count] à l'autre fonction que vous trouver ci-dessous

SIM = MatchLF(dest_ArtCoeff[Count]);

-----------------------------------------------------------
Voici la fonction MatchLF
float MatchLF(unsigned char dest_ArtCoeff[SRC_ANGLE][CAMNUM][ART_COEF])



Ce code est passé à la compilation mais quand je l'exécute, il me donne les mauvais résultat.
j'ai essayé de tester la valeur de dest_ArtCoeff dans la fonction MatchLF comme ci-dessous:


if(dest_ArtCoeff == NULL){ printf("errour null\n");}else{printf("%s\n",dest_ArtCoeff[0][0][0]);}

ça a fait planter mon exécution. Pourquoi? Le problème doit venir de paramètre passé à la fonction?

Quelqu'un a un conseil pour ça, svp??

Merci bcp.
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
je te cinseil vraiment de prendre un cour sur les pointeurs, et de lire attentivement. Ce n'est pas évident ça demande beaucoup de rigueur, car le compilateur peu accepter des choses qui ne sont pas juste. C'est à toi de le voir.
Pour le 1., la création me semble correct, je ne voi pas de souci.
Pour le 2., en revanche, c'est complètement faux ! tu ne peux pas lire un tableau ainsi, tu peux lire au mieux un tableau une dimension, donc fread(dest_ArtCoeff[i][j][k],ART_COEF,sizeof char,fprt) avec une boucle sur i, j, k.
Pour le 3., dest_ArtCoeff[SRC_ANGLE][CAMNUM][ART_COEF] n'est pas de type char, mais char * !! et dest_ArtCoeff[count] est de type char*** donc forcément, tu ne passe pas à la fonction ce qu'elle attend, donc ça ne peut pas fonctionner.

En fait, en C, il n'y a pas de tableaux de multiple dimension non constant. En fait, tu crées un tableau d'une certaine quantité de cases, puis dans chaque case tu mets un tableau d'un autre nombre de case, etc.
Tu pourrais très bien avoir un tableau "non-carré", c'est à dire n'ayant pas les même validité d'indice : T[0][2][5] serai bon par exemple, mais pas T[0][3][5], car T[0][3] n'aurai que 2 cases. Donc quand tu passes un pointeur multiple (char**** par exemple) à une fonction, la fonction ne peux pas connaître les différentes dimension (sauf si c'est toi qui la fait et que tu les présuppose dans la fonction).
0
chodague Messages postés 4 Date d'inscription   Statut Membre Dernière intervention  
 
resalut,

D'abord je te remercie pour tes conseils. j'ai essayé de lu déja les cours sur le pointeurs mais je n'ai tj pas compris pour le 4D ;-(

Pour le 2. Je ne veux pas lire dans le tableau mais je veux affecter la valeur récupéré d'un fichier au tableau.

Je l'ai fait
 fread(dest_ArtCoeff[Count],ART_COEF,sizeof char,fpt) 
avec le tableau statique déclaré comme ci-dessous et ça a marché bien.
unsigned char	dest_ArtCoeff[ModelNum][SRC_ANGLE][CAMNUM][ART_COEF]; 


Pourtant avec le tableau dynamique (char**** dest_ArtCoeff; ), ça ne marche plus. Je ne comprends pas.
D'ailleurs, j'ai essayé de faire comme tu m'as dit (fread(dest_ArtCoeff[i][j][k],ART_COEF,sizeof char,fprt)) ça ne marche pas non plus. L'exécution a planté à cette ligne la.

Alors, pour m'aider à comprendre mieux l'affectation des valeur au tableau 4D, je vx savoir pour l'instant comment on peut affecter la valeur aux cases dans cette tableau alrs?

J'ai essayé avec un exemple d'initialisation de cette tableau, mais ça ne me donne pas non plus le bon valeur.

#define			INFINI	100000

for(i=0; i<ModelNum; i++){
		for(j=0; j<SRC_ANGLE; j++){
			for(k=0; k<CAMNUM; k++){
				for(l=0; l<ART_COEF; l++){
				dest_ArtCoeff[i][j][k][l] = INFINI;
				}
			}
		}
}
	
printf("after intialize dest_ArtCoeff= %d\n", dest_ArtCoeff[0][0][0][0]);


Résultat : after intialize dest_ArtCoeff= 160. Normalement il doit etre 100000, non?

Pourrais-tu me direi comment l'initialise stp?
0
Char Snipeur Messages postés 10112 Statut Contributeur 1 299
 
Salut.
Pour ce qui est du tableau multi dimension, je t'ai déjà expliqué, relis ce que j'ai marqué, il n'est pas possible de faire un fread avec un tableaux à plus d'une dimension.
pour ton affectation, c'est normal, il faut faire attention aux type !
"unsigned char" va de 0 à 255, donc si tu lui affecte 100000, forcément, ça rentre pas, en fait le code fait une espece de 100000%256
0