[C] pointeurs de pointeurs en retour de fonction...

pointeurs de pointeurs en retour de fonction... [C] - C++ - Programmation

Marsh Posté le 29-04-2003 à 23:40:09    

Bonjour !
 
Alors voilà, j'ai cette fonction :

Code :
  1. float *calculCoordX(const int nbreFigures, const int nbrePointsA, const int nbrePointsD, float *pointsDepartX, float *pointsArriveeX)
  2. {
  3. int i,j;
  4. float **coordX = (float **) malloc( nbrePointsA * sizeof(float) );
  5. for(i=0 ; i<nbreFigures ; i++)
  6. {
  7.  coordX[i] = (float *) malloc( nbreFigures * sizeof(float) );
  8. }
  9. for( i=0 ; i<nbrePointsD ; i++ )
  10. {
  11.  for( j=0 ; j<nbreFigures ; j++ )
  12.  {
  13.   coordX[i][j] = pointsDepartX[i];  }
  14. }
  15. return coordX;
  16. }


 
et puis dans mon main j'ai :

Code :
  1. int main(void)
  2. {
  3. float **coordXcalculs;
  4. ...
  5. coordXcalculs = calculCoordX(nbreFigures,nbrePointsA,nbrePointsD,pointsDepartX,pointsArriveeX);
  6. ...
  7. }


 
Le problème c'est que quelque part je fais un truc qui va pas au niveau du return de la première fonction puisque j'ai un warning ... moi je veux retourner l'adresse du pointeur double (l'adresse de mon tableau à 2 dimensions quoi) et la mettre dans "float **coordXcalculs" du main... quelqu'un pourrait-il m'aider ?
 
D'autre part j'ai une erreur dans la première boucle for, alors si jamais au passage vous voyez ce qui peut clocher dans cette boucle ... :)
 
D'avance merci !

Reply

Marsh Posté le 29-04-2003 à 23:40:09   

Reply

Marsh Posté le 29-04-2003 à 23:55:30    

d'après une lecture rapide du code, tu ne devrais pas avoir que ca comme erreurs, tu peux poster les warnings et le erreurs que le compilo te sort ?
 
[edit] j'ai jeté le code dans mon compilo,
en changeant le prototype de la fonction de  

Code :
  1. float *calculCoordX(const int nbreFigures, const int nbrePointsA, const int nbrePointsD, float *pointsDepartX, float *pointsArriveeX)


en ça :

Code :
  1. float **calculCoordX(const int nbreFigures, const int nbrePointsA, const int nbrePointsD, float *pointsDepartX, float *pointsArriveeX)


 
ca compile.
 
maintenant, en changeant ça :

Code :
  1. float **coordX = (float **) malloc( nbrePointsA * sizeof(float) );


en ça :

Code :
  1. float **coordX = (float **) malloc( nbrePointsA * sizeof(float*) );


c'est un petit peu plus correct (a mon gout) après c'est vous qui voyez.


Message édité par SquiZZ le 30-04-2003 à 01:03:02
Reply

Marsh Posté le 30-04-2003 à 07:44:26    

merci !
mais pour le return je return quoi ? comme j'ai mis ? et dans le main c'est bon aussi mon ptit bout de code ?
 
merci d'avance !

Reply

Marsh Posté le 30-04-2003 à 08:21:32    

le return doit être bon,
dans tes boucles for, fais gaffe aux paramètres que tu utilises.
tu es sûr que c'est bon quand tu fais un malloc(nbrePointsA * sizeof(float*) et qu'ensuite tu va jusqu'a nbrePointD dans ton deuxième for ?

Reply

Marsh Posté le 30-04-2003 à 10:16:08    

dans le 2è malloc en effet je crois que je dois mettre nbPoints et non nbFigures ... j'essaierai en rentrant, je te dis si ça marche :)
merci de l'observation !!

Reply

Marsh Posté le 30-04-2003 à 13:04:24    

oki ça marche très bien maintenant...
 
en fait le premier malloc il définit quelle dimension de mon tableau à 2 dimensions final ? en disant qu'on a tableau[dimension1][dimension2] ...
 
C'est là où je me suis embrouillé !
 
Merci de tes réponses !! [:je%40nb]

Reply

Marsh Posté le 30-04-2003 à 13:46:19    

Y a un truc que j'aime pas dans ton code, c'est que la mémoire est allouée dans t afonction et qu'elle doit etre liberée à l'exterieur par l'appelant :\
 
C'est pas très propre ;)
 
Il vaut mieux faire les malloc, appeler la fonction avec les pointeurs alloués passés en parametre, et liberer après traitement.
 

Code :
  1. int calculCoordX(const int nbreFigures, const int nbrePointsA, const int nbrePointsD, float *pointsDepartX, float *pointsArriveeX, float *TableauResultat)


Avec juste un code retour d'erreur en retour (parce que là, si ton malloc vautre par exemple tu fais comment ?)
 
Les malloc et les free correspondants devraient (tant que faire ce peut) toujours etre dans le même bloc de programme. Pour la relecture c'est 50000 fois mieux.

Reply

Marsh Posté le 01-05-2003 à 10:05:39    

Oui en effet j'avais pensé à faire les malloc dans le main... je vais faire come ç !
 
 
Sinon tu saurais répondre à mes ptites questions du message juste avant ? :)
 
Merci d'avance !

Reply

Marsh Posté le 02-05-2003 à 15:43:01    

freeman_78 a écrit :

oki ça marche très bien maintenant...
 
en fait le premier malloc il définit quelle dimension de mon tableau à 2 dimensions final ? en disant qu'on a tableau[dimension1][dimension2] ...
 
C'est là où je me suis embrouillé !
 
Merci de tes réponses !! [:je%40nb]  


 
S'il vous plait une ptite réponse, je suis perdu et je n'arrive pas à bien voir le fonctionnement : est-ce qu'on définit en premier la dimension la plus intérieure ou la plus extérieure ?
 
merci :)
 
on pourrait dire [:ark] mais je l'ai déjà fait et là dessus y'a pas énormément d'explications ... :/

Reply

Marsh Posté le 02-05-2003 à 17:44:05    

Alors si je me souviens bien.... ( c'est le type même de la question piege le coup du [][] :lol: )
 
tab[i][j] = (tab[i])[j]
tab[i] est un int*
(faut raisonner en terme d'operateurs si je ne m'abuse)
 
d'où :  
pour allouer un tableau int test[i][j] :

Code :
  1. int **test;
  2. test = (int **) malloc ( sizeof(int *) * nombre_max_de_i )
  3. for(i de 0 à nombre_max_de_i-1)
  4.   test[i] = (int *) malloc ( sizeof(int) * nombre_max_de_j )


 
faut commencer par l'exterieur
 
mais bon, un petit essai sur un bout de code sera surement plus efficace que ma memoire defaillante ( j'aime paaaaas les tableaux de tableaux :lol: )

Reply

Marsh Posté le 02-05-2003 à 17:44:05   

Reply

Marsh Posté le 05-05-2003 à 10:34:37    

philou_a7 a écrit :

Alors si je me souviens bien.... ( c'est le type même de la question piege le coup du [][] :lol: )
 
tab[i][j] = (tab[i])[j]
tab[i] est un int*
(faut raisonner en terme d'operateurs si je ne m'abuse)
 
d'où :  
pour allouer un tableau int test[i][j] :

Code :
  1. int **test;
  2. test = (int **) malloc ( sizeof(int *) * nombre_max_de_i )
  3. for(i de 0 à nombre_max_de_i-1)
  4.   test[i] = (int *) malloc ( sizeof(int) * nombre_max_de_j )


 
faut commencer par l'exterieur
 
mais bon, un petit essai sur un bout de code sera surement plus efficace que ma memoire defaillante ( j'aime paaaaas les tableaux de tableaux :lol: )


 
 
ben ... Perso, ca me semble correct ... :D


---------------
last.fm
Reply

Marsh Posté le 05-05-2003 à 23:46:05    

okioki c'est bien ça  [:bigsmiley]  
 
merci à vous pour les réponses !!
 
pourvu ke ça dure :)
 [:ultraglab]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed