Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction prenant un tableau en argument et renvoyant un tableau

    6 mars 2008 à 16:03:24

    Bonjour, j'ai un petit problème avec mon projet d'informatique.

    J'essaie de créer une fonction, qui me prend un tableau t, et qui modifie chaque élément à l'intérieur et me ressort un tableau.
    Je n'ai aucun message d'erreur mais l'affichage du tableau à la compilation me ressort des valeurs absurdes (du genre 1e-308)

    Peut-être vaut-il mieux que je vous colle le code pour que vous puissiez voir le problème :

    main.cpp

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <iostream>
    4. #include <math.h>
    5. #include <fstream>
    6. #include "coordonnees.h"
    7. #define N 24
    8. using namespace std;
    9. // On considere que pour observer un objet dans l'espace, on oriente la tete de maniere a ce que cet objet soit vu sous le meme angle par les deux yeux.
    10. const double distanceyeux=6.1, distanceobjet=300;
    11. const double f=3;
    12. int main()
    13. {
    14. int i, j, k, l;
    15. double t[N], gauche[N], droit[N], a, b, c, x, y, z;
    16. ifstream woohoo("carre.txt",ios::in);
    17. if(woohoo)
    18. {
    19.     for(i=0;i<8;i++)
    20.     {
    21.     woohoo >> a >> b >> c;
    22.     cout << a << " " << b << " " << c << endl;
    23.     t[3*i]=a;t[3*i+1]=b;t[3*i+2]=c;
    24.     }
    25. // Les coordonnées du carré dans le référentiel du labo sont réécrites dans les référentiels de l'oeil gauche et droit
    26. *gauche=coordoeilgauche(t,N);
    27. *droit=coordoeildroit(t,N);
    28. for(j=0;j<24;j++)
    29. {
    30. cout << gauche[j] << endl;
    31. }
    32. }
    33. else
    34. {
    35. cout << "Impossible d'ouvrir le fichier carre.txt en lecture. Vérifier qu'il n'est pas vide" << endl;
    36. }
    37. return 0;
    38. }


    et mes fonctions sont dans coordonnees.cpp (je mets uniquement les fonctions "importantes")

    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <iostream>
    4. #include <math.h>
    5. #include <fstream>
    6. #include "coordonnees.h"
    7. using namespace std;
    8. // Fonction des coordonnees de l'objet donnant les coordonnees de l'image sur la rétine (pour l'oeil de référence seulement???)
    9. void coordimage(double x, double y, double z)
    10. {
    11. double f, distanceyeux, distanceobjet;
    12. double X,Y,Z;
    13. if(f>=0) {cout << "f est négatif ou nul" << endl; exit(0);}
    14. if(x<=0 || y<=0 || z<=0) {cout << "Vérifier les coordonnées objet" << endl; exit(0);}
    15. else X=-x/z*f; Y=-y/z*f, Z=-f;
    16. cout << X << endl;
    17. cout << Y << endl;
    18. cout << Z << endl;
    19. }
    20. //Fonctions donnant les coordonnées de l'objet dans les repères respectifs des deux yeux. L'argument est la donnée des coordonnees objet dans le référentiel du labo
    21. double coordoeilgauche (double t[],int n)
    22. {
    23. double distanceyeux;
    24. int i;
    25. for(i=0;i<8;i++)
    26. {
    27. t[i]=t[i];//transforme les x
    28. t[i+1]=t[i]+distanceyeux/2;//transforme les y
    29. t[i+2]=t[i+2];
    30. }
    31. return(t[n]);
    32. }
    33. double coordoeildroit (double t[],int n)
    34. {
    35. double distanceyeux;
    36. int i;
    37. for(i=0;i<8;i++)
    38. {
    39. t[i]=t[i];//transforme les x
    40. t[i+1]=-distanceyeux/2;//transforme les y
    41. t[i+2]=t[i+2];
    42. }
    43. return(t[n]);
    44. }




    Déjà je ne sais pas exactement comment déclarer mes constantes distanceyeux et distanceobjet étant donné qu'on me déconseille partout les variables globales.
    Ensuite j'ai des doutes sur mes fonctions coordoeildroit et coordoeilgauche...


    Voilà merci beaucoup pour votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      6 mars 2008 à 16:32:15

      Tu peux déja enelever les vieilles #include <stdio.h> et #include <stdlib.h> :)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        6 mars 2008 à 18:23:52

        Je ne lirais pas ce code, l'indentation est trop nulle. Améliore là ;) .
        Mais change aussi #include <math.h> en #include <cmath>.
        • Partager sur Facebook
        • Partager sur Twitter
          6 mars 2008 à 19:14:37

          Pour l'indentation, si tu es sous C::B tu peux utiliser AStyle pour l'indentation ;)

          Et il y a un problème dans coordonnees.cpp dans la ligne 18 (au niveau du else), tu dois utiliser les accolades sinon une seule instruction sera faite !!

          fais comme ceci :

          1. // [...]
          2. else
          3. {
          4. X=-x/z*f;
          5. Y=-y/z*f;
          6. Z=-f;
          7. }
          8. // [...]


          Je t'ai corrigé deux choses : le else doit prendre en compte les trois instructions et en plus, que vient faire la virgule après Y=-y/z*f, Z=-f; ??!
          • Partager sur Facebook
          • Partager sur Twitter
            6 mars 2008 à 19:52:46

            1. Y=-y/z*f, Z=-f;

            Ce code est légal (pas trés lisible tout de même), c'est sûrement l'usage de l'opérateur virgule qui te gêne. Le problème est que les variables Y et Z prennent la valeur de "-f" et que "-y/z*f" est calculé pour rien.
            • Partager sur Facebook
            • Partager sur Twitter
              6 mars 2008 à 20:46:17

              On peut renvoyer un tableau? On m'a toujours dit non ><
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                6 mars 2008 à 20:49:50

                Citation : Djad

                On peut renvoyer un tableau? On m'a toujours dit non ><

                On t'a mal dit. Les tableau sont (en vachement gros) des pointeurs.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 mars 2008 à 20:53:34

                  L'opérateur virgule ( operator, () ) permet par défaut d'évaluer avant toute chose son membre de gauche (tous les effets de bortd sur ce membre ont lieu), puis il évalue celui de droite.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 mars 2008 à 23:50:43

                    Pour ce qui concerne le fait que tu affiche n'importe quoi à la place de tes tableaux, cela vient certainement de tes fonctions "coordoeilgauche" et droit.

                    en effet elles renvoient un double, or tu t'en sers pour affecter un double* (pointeur de double, ou tableau de double),
                    bien sur, toujours dans ces fonctions t[n] est bien un double, c'est t[24] soit le 25eme élément de ton tableau de 24 doubles.... SYNTAX ERROR comme dirais mon apple II :D
                    Mais le problème sera vite corrigé puisque tu n'as pas à renvoyer de double mais un tableau, renvoie donc t (pour l'instant).
                    note que du coups tu n'as plus besoin du paramètre n, tu connais d'office la taille du tableau.

                    Petit résumé :
                    1. double* coordoeilgauche (double t[])
                    2. {
                    3.   double distanceyeux;
                    4.   int i;
                    5.   for(i=0;i<8;i++)
                    6.   {
                    7.     t[i]=t[i];//transforme les x
                    8.     t[i+1]=t[i]+distanceyeux/2;//transforme les y
                    9.     t[i+2]=t[i+2];
                    10.   }
                    11.   return(t);
                    12. }
                    13. double* coordoeildroit (double t[])
                    14. {
                    15.   double distanceyeux;
                    16.   int i;
                    17.   for(i=0;i<8;i++)
                    18.   {
                    19.     t[i]=t[i];//transforme les x
                    20.     t[i+1]=-distanceyeux/2;//transforme les y
                    21.     t[i+2]=t[i+2];
                    22.   }
                    23.   return(t);
                    24. }
                    25. gauche=coordoeilgauche(t);
                    26. droit=coordoeildroit(t);


                    Bon ça ça devrait déjà te sortir quelque chose de moins abhérent.
                    mais il reste un détail, quand tu fais "coordoeilgauche(t)" tu modifie t, car les tableaux ne sont pas copiés au passage dans une fonction, je te conseillerais donc la syntaxe suivante qui ira modifier directement les tableaux "gauche" et "droit" :

                    1. /** Copie t dans gauche en l'adaptant à l'oeuil gauche */
                    2. void coordoeilgauche (double t[], double gauche[])
                    3. {
                    4.   double distanceyeux;
                    5.   int i;
                    6.   for(i=0;i<8;i++)
                    7.   {
                    8.     gauche[i]=t[i];//transforme les x
                    9.     gauche[i+1]=t[i]+distanceyeux/2;//transforme les y
                    10.     gauche[i+2]=t[i+2];
                    11.   }
                    12. }
                    13. /** Copie t dans droit en l'adaptant à l'oeuil droit */
                    14. void coordoeildroit (double t[], double droit[])
                    15. {
                    16.   double distanceyeux;
                    17.   int i;
                    18.   for(i=0;i<8;i++)
                    19.   {
                    20.     droit[i]=t[i];//transforme les x
                    21.     droit[i+1]=-distanceyeux/2;//transforme les y
                    22.     droit[i+2]=t[i+2];
                    23.   }
                    24. }
                    25. coordoeilgauche(t, gauche);
                    26. coordoeildroit(t, droit);


                    Après ca ca devrait rendre des résultats déjà bien plus cohérents, sinon je t'autorise a me jeter des tomates virtuelles =)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mars 2008 à 12:30:46

                      Ok merci à tous j'ai corrigé les problème de syntaxe, supprimé les librairies inutiles, et modifié les fonctions comme l'a suggéré Inki

                      Voilà donc mon main.cpp :

                      1. #include <iostream>
                      2. #include <math.h>
                      3. #include <fstream>
                      4. #include "coordonnees.h"
                      5. #define N 24
                      6. using namespace std;
                      7. // On considere que pour observer un objet dans l'espace, on oriente la tete de maniere a ce que cet objet soit vu sous le meme angle par les deux yeux.
                      8. const double distanceyeux=6.1, distanceobjet=300;
                      9. const double f=3;
                      10. int main()
                      11. {
                      12.     int i, j, k, l;
                      13.     double t[N], gauche[N], droit[N], a, b, c, x, y, z;
                      14.     ifstream woohoo("carre.txt",ios::in);
                      15.     if(woohoo)
                      16.     {
                      17.         for(i=0;i<8;i++)
                      18.         {
                      19.             woohoo >> a >> b >> c;
                      20.             cout << a << " " << b << " " << c << endl;
                      21.             t[3*i]=a;
                      22.             t[3*i+1]=b;
                      23.             t[3*i+2]=c;
                      24.         }
                      25.         //   cout << " Remplissage du tableau " << endl;
                      26.         //   for(j=0;j<24;j++)
                      27.         //   {
                      28.         //   cout << t[j] << endl;
                      29.         //   }
                      30.         // Les coordonnées du carré dans le référentiel du labo sont réécrites dans les référentiels de l'oeil gauche et droit
                      31.     }
                      32.     else
                      33.     {
                      34.         cout << "Impossible d'ouvrir le fichier carre.txt en lecture. Vérifier qu'il n'est pas vide" << endl;
                      35.     }
                      36.     coordoeilgauche(t, gauche);
                      37.     coordoeildroit(t, droit);
                      38.     for(j=0;j<24;j++)
                      39.     {
                      40.         cout << gauche[j] << endl;
                      41.     }
                      42.     //fstream lili("graphe.gnu",ios::out);
                      43.     //lili << "set title 'Vision stereoscopique'" << endl;
                      44.     //lili << "set xlabel 'x'" << endl;
                      45.     //lili << "set ylabel 'y'" << endl;
                      46.     //lili << "set zlabel 'z'" << endl;
                      47.     //lili << "set size 1.,1.3" << endl;
                      48.     //lili << "set hidden3d" << endl;
                      49.     //lili << "set contour" << endl;
                      50.     //lili << "set noparametric" << endl;
                      51.     //lili << "set data style line" << endl;
                      52.     //lili << "splot [30 :-30][30 :-30][-20:20] 'carre.txt'" << endl;
                      53.     //lili << "pause -1" << endl;
                      54.     //lili.close();
                      55.     //#if defined(WIN32) || defined(WIN64)
                      56.     //system("start gnuplot/bin/wgnuplot.exe graphe.gnu"); // execution du fichier de commandes Gnuplot
                      57.     //#else
                      58.     //system("gnuplot graphe.gnu");
                      59.     //system("rm graphe.gnu");
                      60.     //#endif
                      61.     //
                      62.     return 0;
                      63. }


                      Néanmoins le programme me sort toujours pas les bons résultats (mais pas aberrants cette fois).

                      Par contre je précise que j'ai modifié les fonctions coordoeilgauche et droit car le i précédent ne couvrait pas les 24 indices :

                      1. /** Copie t dans gauche en l'adaptant à l'oeil gauche */
                      2. void coordoeilgauche (double t[], double gauche[])
                      3. {
                      4.   double distanceyeux;
                      5.   int i;
                      6.   for(i=0;i<8;i++)
                      7.   {
                      8.     gauche[3*i]=t[3*i];//transforme les x
                      9.     gauche[3*i+1]=t[3*i]+distanceyeux/2;//transforme les y
                      10.     gauche[3*i+2]=t[3*i+2];
                      11.   }
                      12. }
                      13. /** Copie t dans droit en l'adaptant à l'oeil droit */
                      14. void coordoeildroit (double t[], double droit[])
                      15. {
                      16.   double distanceyeux;
                      17.   int i;
                      18.   for(i=0;i<8;i++)
                      19.   {
                      20.     droit[3*i]=t[3*i];//transforme les x
                      21.     droit[3*i+1]=t[3*i+1]-distanceyeux/2;//transforme les y
                      22.     droit[3*i+2]=t[3*i+2];
                      23.   }
                      24. }




                      Je précise aussi que mon fichier carre.txt s'écrit sous la forme :

                      10 -10 -10
                      -10 -10 -10
                      -10 -10 10
                      10 -10 10
                      10 10 -10
                      -10 10 -10
                      -10 10 10
                      10 10 10


                      Et mon programme sort :

                      10 -10 -10
                      -10 -10 -10
                      -10 -10 10
                      10 -10 10
                      10 10 -10
                      -10 10 -10
                      -10 10 10
                      10 10 10
                      10
                      10
                      -10
                      -10
                      -10
                      -10
                      -10
                      -10
                      10
                      10
                      10
                      10
                      10
                      10
                      -10
                      -10
                      -10
                      -10
                      -10
                      -10
                      10
                      10
                      10
                      10
                      Press ENTER to continue.


                      Donc il ne prend pas du tout en compte mes constantes...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 mars 2008 à 13:20:49

                        Nouvel élément: ce code ne fonctionne pas sous Linux.

                        /tmp/ccvzp669.o: In function `main':
                        main.cpp:(.text+0x208): undefined reference to `coordoeilgauche(double*, double*)'
                        main.cpp:(.text+0x220): undefined reference to `coordoeildroit(double*, double*)'
                        collect2: ld a retourné 1 code d'état d'exécution
                        rm: ne peut enlever `a.out': Aucun fichier ou répertoire de ce type




                        Je ne comprends pas là...
                        • Partager sur Facebook
                        • Partager sur Twitter

                        fonction prenant un tableau en argument et renvoyant un tableau

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown