[C] Retourner un tableau d'int dans une fonction

Retourner un tableau d'int dans une fonction [C] - C++ - Programmation

Marsh Posté le 09-08-2002 à 13:46:54    

Bonjour à tous,
J'aimerai qu'une fonction retourne un tableau d'int du type : "int tab[4][6]". Evidemment ce n'est pas possible de faire un "int [4][6] nomfonction(..,...)" donc comment puis-je le réaliser ?
Merci

Reply

Marsh Posté le 09-08-2002 à 13:46:54   

Reply

Marsh Posté le 09-08-2002 à 13:56:06    

Poulou a écrit a écrit :

Bonjour à tous,
J'aimerai qu'une fonction retourne un tableau d'int du type : "int tab[4][6]". Evidemment ce n'est pas possible de faire un "int [4][6] nomfonction(..,...)" donc comment puis-je le réaliser ?
Merci




en renvoyant un poiteur genre int ** nomFonction(), ça devrai fonctionner.

Reply

Marsh Posté le 09-08-2002 à 14:07:13    

tomlameche a écrit a écrit :

 
en renvoyant un poiteur genre int ** nomFonction(), ça devrai fonctionner.




 
Ouais, bien sur.
 
Par contre , n'éspères pas faire ça :

Code :
  1. int [4][6] TonTableau;
  2. TonTableau = NomDeFonction();


Quand tu déclares un tableau de cette manière, le pointeur TonTableau est constant.
Par contre tu peux faire :

Code :
  1. int** hTonTableau = NomDeFonction();


Par la suite, j'pense que tu peux accèder aux différents éléments de hTonTableau comme si t'avais déclaré ton tableau en statique (avec les indices entre crochets quoi !)


Message édité par El_gringo le 09-08-2002 à 14:07:34
Reply

Marsh Posté le 09-08-2002 à 14:10:31    

El_Gringo a écrit a écrit :

 
 
Ouais, bien sur.
 
Par contre , n'éspères pas faire ça :

Code :
  1. int [4][6] TonTableau;
  2. TonTableau = NomDeFonction();


Quand tu déclares un tableau de cette manière, le pointeur TonTableau est constant.
Par contre tu peux faire :

Code :
  1. int** hTonTableau = NomDeFonction();


Par la suite, j'pense que tu peux accèder aux différents éléments de hTonTableau comme si t'avais déclaré ton tableau en statique (avec les indices entre crochets quoi !)




 
non ça passe pas. Y a une syntaxe particulière pour les pointeurs sur tableau multicolone (on en a déjà parlé ici) mais je sais plus laquelle


---------------
Le Tyran
Reply

Marsh Posté le 09-08-2002 à 14:29:31    

de toutes facons, un tableau [4][6] équivaut en mémoire a un tableau [24]
 
donc tu peux faire

Code :
  1. int *mon_tableau;
  2. mon_tableau=ma_fonction();
  3. puis :
  4. mon_tableau[CASE+COLONNE*6] // pour y accéder.


evidemment essaye de pas faire d'erreur c la merde pour debugguer..

Reply

Marsh Posté le 09-08-2002 à 14:31:15    

heu... c quoi que t'appels CASE ?

Reply

Marsh Posté le 09-08-2002 à 14:38:46    

Sur les indications de letoii j'ai cherché un topic qui en parlait et effectivement c'est celui-ci :
http://forum.hardware.fr/forum2.ph [...] h=&subcat=
 
J'ai donc dans ma fonction appelante :

déclaration : int (*tableau)[4][6];
allocation : tableau=(int(*)[4][6](malloc(sizeof(int)*4*6));
appel de la fonction : fonction_appelée(tableau)
lecture avec : (*tableau)[x][y]


et dans ma fonction appelée qui modifie le tableau

déclaration : fonction_appelée(int (*mon_tableau)[4][6])


 
Ca fonctionne sans problèmes et sans warning comme cela. Des remarques ?

Reply

Marsh Posté le 10-08-2002 à 05:50:02    

Code :
  1. int (*tableau)[4][6] ;//seule déclaration possible
  2. tableau= (int(*)[4][6])malloc(sizeof(int)*4*6) ;//allocation C
  3. tableau= new int[][4][6] ;//allocation C++
  4. (*tableau)[1][1]= 1 ;//accès au tableau
  5. tableau[0][1][1]=1  ;//accès au tableau également

Pour réellement pointer sur un tableau, il faut donc simuler un tableau fictif de 1 case le contenant.
 
On peut transmettre un tableau par valeur en argument/retour de fonction en l'englobant dans une structure:

Code :
  1. #include <stdio.h>
  2. struct tabdedans{
  3. int tab[4][6] ;
  4. };
  5. tabdedans fonc(tabdedans arg){
  6. return arg ;
  7. };
  8. int main (){
  9. tabdedans stab= {0} ; //remplissage à 0 de la structure, donc du tableau
  10. stab.tab[0][0]= 1 ;
  11. printf("%d\n", fonc(stab).tab[0][0] ) ;//limpide !
  12. return 0;
  13. }


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 28-03-2014 à 10:45:01    

Bonjour  :hello: ;
 
Si vous voulez bien me donner une idée, en fait j'ai une question presque identique à celle_ci, et j'ai essayé d'appliquer vos consignes mais ça n'a pas marché :pfff: !
Ma fonction K_eq contient une boucle for(i=1;i<=nnode;i++), qui me calcule un tableau des doubles. Or quand je fais appel à la fonction dans le main, je n'obtient que les valeurs d'une seule itération.
 
Objectif: quand je fais appel à la fonction K_eq, je dois récupérer toutes les valeurs de K_M=K_eq(i,1), toutes les valeurs de K_m=K_eq(i,2) et toutes les valeurs de K_geo=K_eq(i,3)=K_eq(i,4).
 
Cas1:normalement return ne récupère qu'une seule valeur, donc quand je l'ai mise dans la boucle, il m'affiche les valeurs de K_M, K_m et K_geo de la première itération et elle sort. Donc j'ai pensé à la faire sortir de la boucle.
 
Cas2:en dehors de la boucle, je sais pas quoi mettre entre les crochés de mon tableau K, si je mets return (K[i]), il m'affiche que des zéro (K_M=K_m=K_geo=0), et c'est normal car pour lui i en dehors de la boucle n'est qu'un simple entier. Si je mets la taille du tableau, c'est à dire je veux toutes les valeurs de mes paramètres return (K[nodmax]), il m'affiche la valeur moyenne de tous les K (K_M=K_m=K_geo=valeur moyenne).
 
J'espère que j'étais suffisamment claire pour que vous puissiez m'aider!
Merci  :)  

Reply

Marsh Posté le 29-03-2014 à 00:55:24    

mwawm a écrit :

Bonjour  :hello: ;
 
Si vous voulez bien me donner une idée, en fait j'ai une question presque identique à celle_ci, et j'ai essayé d'appliquer vos consignes mais ça n'a pas marché :pfff: !
Ma fonction K_eq contient une boucle for(i=1;i<=nnode;i++), qui me calcule un tableau des doubles. Or quand je fais appel à la fonction dans le main, je n'obtient que les valeurs d'une seule itération.
 
Objectif: quand je fais appel à la fonction K_eq, je dois récupérer toutes les valeurs de K_M=K_eq(i,1), toutes les valeurs de K_m=K_eq(i,2) et toutes les valeurs de K_geo=K_eq(i,3)=K_eq(i,4).
 
Cas1:normalement return ne récupère qu'une seule valeur, donc quand je l'ai mise dans la boucle, il m'affiche les valeurs de K_M, K_m et K_geo de la première itération et elle sort. Donc j'ai pensé à la faire sortir de la boucle.
 
Cas2:en dehors de la boucle, je sais pas quoi mettre entre les crochés de mon tableau K, si je mets return (K[i]), il m'affiche que des zéro (K_M=K_m=K_geo=0), et c'est normal car pour lui i en dehors de la boucle n'est qu'un simple entier. Si je mets la taille du tableau, c'est à dire je veux toutes les valeurs de mes paramètres return (K[nodmax]), il m'affiche la valeur moyenne de tous les K (K_M=K_m=K_geo=valeur moyenne).
 
J'espère que j'étais suffisamment claire pour que vous puissiez m'aider!
Merci  :)  


 
Je n'ai pas compris l'énoncé, le mieux serait de poster le code en plus.
Vu que la discussion traite de comment retourner un tableau 2D, voilà un exemple en C++ en espérant que ça pourra aider :
 

Code :
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4. //Prend en entrée un tableau tab et ses dimensions et retourne un tableau
  5. //avec chaque élément au carré
  6. int** tableau_au_carre(int** tab, int nb_lignes, int nb_colonnes)
  7. {
  8. int** tableau = new int*[nb_lignes];
  9. for(int i = 0; i<nb_lignes; i++)
  10. {
  11.  tableau[i] = new int[nb_colonnes];
  12.  for(int j = 0; j<nb_colonnes; j++)
  13.  {
  14.   tableau[i][j] = tab[i][j] * tab[i][j];
  15.  }
  16. }
  17. return tableau;
  18. }
  19. int main()
  20. {
  21. int nb_lignes = 10;
  22. int nb_colonnes = 4;
  23. int** tableau = new int*[nb_lignes];
  24. for(int i = 0; i<nb_lignes; i++)
  25. {
  26.  tableau[i] = new int[nb_colonnes];
  27. }
  28.    
  29. //Remplissage du tableau
  30. for(int i = 0; i<nb_lignes; i++)
  31. {
  32.  for(int j = 0; j<nb_colonnes; j++)
  33.  {
  34.   tableau[i][j] = i*nb_colonnes + j;
  35.  }
  36. }
  37. int** tableau_carre = tableau_au_carre(tableau, nb_lignes, nb_colonnes);
  38. tableau_carre[0][0] = -99; //modification de la case{0,0}
  39. //Affichage tableau
  40. for(int i = 0; i<nb_lignes; i++)
  41. {
  42.  for(int j = 0; j<nb_colonnes; j++)
  43.  {
  44.   cout<<tableau[i][j]<<" ";
  45.  }
  46.  cout<<endl;
  47. }
  48. cout<<endl;
  49. cout<<endl;
  50. //Affichage tableau_carre
  51. for(int i = 0; i<nb_lignes; i++)
  52. {
  53.  for(int j = 0; j<nb_colonnes; j++)
  54.  {
  55.   cout<<tableau_carre[i][j]<<" ";
  56.  }
  57.  cout<<endl;
  58. }
  59. for(int i = 0; i<nb_lignes; i++)
  60. {
  61.  delete tableau[i];
  62.  delete tableau_carre[i];
  63. }
  64. delete[] tableau;
  65. delete[] tableau_carre;
  66. system("pause" );
  67. return 0;
  68. }


Reply

Marsh Posté le 29-03-2014 à 00:55:24   

Reply

Marsh Posté le 01-04-2014 à 11:05:27    

Bonjour :)
 
Merci de votre aide honrisse  :jap:  
C'est juste que je ne veux afficher qu'un vecteur!
Ma fonction contient deux arguments, le premier pour la boucle for et le deuxième pour que je choisisse le K que je veux, soit K_M=K_eq(i,1), ou K_m=K_eq(i,2) ou K_geo=K_eq(i,3)=K_eq(i,4).
J'ai réussi à calculer toutes les valeurs de mes K (nnode valeurs), mais quand je fais appel à la fonction dans le main, je n'obtient qu'une seule valeur pour tous les K! Je pense que cela provient de mon return(K[nodmax]), mais je n'y ai pas encore trouvé le remède  :??:  
Voici la quasi totalité de mon code
 
Merci  :ange:  
 

Code :
  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #define nodmax 40903
  5. #define nnode 1111
  6. #define Vfwarp 0.504
  7. #define fiber_radius 8.7e-6
  8. #define pi 3.141592654
  9. int i;
  10. double x[nodmax];
  11. int nf;
  12. double K_geo, K_M, K_m, K[nodmax];
  13. double S, A_M, A_m, L_M, L_m, Smax, Smin, Smoy, wh, A,Tp, c;
  14. double k, a, b;
  15. double K_eq(int,int);
  16. double K1,K2,K3,K4;
  17. int main () {
  18. for (i=1;i<=nnode;i++){
  19.  K1=K_eq(i,1);
  20.  K2=K_eq(i,2);
  21.  K3=K_eq(i,3);
  22.  K4=K_eq(i,4);
  23.  printf("K1=%.20f K2=%.20f K3=%.20f K4=%.20f K5=%.20f \n",K1,K2,K3,K4);
  24.  system("pause" );
  25. }
  26.      return (0);
  27. }
  28. double K_eq(int i, int i_tow) {
  29. .
  30.         .
  31.         .
  32.     for(i=1;i<=nnode;i++) {
  33.        K_M=....; // les valeurs de K_M, K_m et K_geo changent en fonction de i
  34.        K_m=....; // c à d que pour chaque i on a une valeur des K
  35.        K_geo=....;// ce qui donne un tableau de valeurs pour chaque K
  36.        if (i_tow==1){
  37.          K[i]=K_M;
  38.        }
  39.        else if (i_tow==2){
  40.          K[i]=K_m;
  41.        }
  42.        else if (i_tow==3){
  43.          K[i]=K_geo;
  44.        }
  45.        else if (i_tow==4){
  46.          K[i]=K_geo;
  47.        }
  48.        else {
  49.         K[i]=0;
  50.         printf("Error in assigning tow index, i_tow=%d\n",i_tow);
  51.        }
  52. }
  53. return (K[nodmax]);
  54. }

Reply

Sujets relatifs:

Leave a Replay

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