IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Transmission de tableau dynamique d'objets


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Transmission de tableau dynamique d'objets
    Salut,

    J'ai un problème en utilisant un tableau d'objets.
    Je dois lire un fichier texte contenant des données et créer un certain nombres d'objets en fonction de ce que je trouve dans ce fichier. Je ne connais donc pas la taille de mon tableau à l'avance. Je crée donc une référence vers un objet dans le main, je la transmet à ma fonction qui analyse le fichier et crée le tableau de la taille souhaitée. Cette dernière fonction alloue la place nécessaire et crée le tableau d'objets. Mais je n'arrive pas à comprendre pourquoi je n'arrive pas à accéder à mes objets après cette fonction dans le main(). J'utilise pourtant bien l'opérateur new.
    Pour plus d'information, merci de jeter un oeil au sources ci-jointes (volontairement raccourcies).

    Merci par avance de votre aide,
    Lau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    using namespace std;
     
    class FrameCameraParams {
    private:
            double focalLength; 
    public:
            FrameCameraParams();
            void setFocalLength(double f);
            double getFocalLength();
    };
     
    FrameCameraParams::FrameCameraParams()
    {
            focalLength=0;
    }
     
    void FrameCameraParams::setFocalLength(double f)
    {
            focalLength=f;
    }
     
    double FrameCameraParams::getFocalLength()
    {
            return focalLength;
    }
     
     
    void parseCameraFile( FrameCameraParams* framesCameraParams)
    {
            framesCameraParams=new FrameCameraParams[5];
    	framesCameraParams[0].setFocalLength(37.);
    	cout << framesCameraParams[0].getFocalLength() << endl;
    	cout << framesCameraParams[1].getFocalLength() << endl;
    }
     
     
    int _tmain(int argc, _TCHAR* argv[]) {
    	FrameCameraParams* frames=NULL;
            parseCameraFile( frames); // ici tout fonctionne bien
            cout << (frames[0]).getFocalLength() << endl; // Cet appel plante...
            return 0;
    }

  2. #2
    Membre averti Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Points : 358
    Points
    358
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FrameCameraParams & * framesCameraParams
    Tu lui passe un pointeur mais tu a oublié de le renvoyer ...

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Merci de ta réponse, mais je n'ai pas tout compris. En quoi ai-je besoin de renvoyer le pointeur. Je modifie son adresse. N'est ce pas suffisant (EDIT:ah ok c'est une copie qui est transmise?). Et sinon que signifie le & dans une déclaration?
    Merci par avance.

  4. #4
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* je ferais plutot*/
    void parseCameraFile( FrameCameraParams* framesCameraParams)
    {
            framesCameraParams=new FrameCameraParams[5];
    	framesCameraParams[0]->setFocalLength(37.);
    	cout << framesCameraParams[0]->getFocalLength() << endl;
    	cout << framesCameraParams[1]->getFocalLength() << endl;
    }
    /* les "." deviennent "->" pour les pointeurs*/

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Ok donc j'ai fais comme cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    using namespace std;
     
    class FrameCameraParams {
    private:
            double focalLength; 
    public:
            FrameCameraParams();
            void setFocalLength(double f);
            double getFocalLength();
    };
     
    FrameCameraParams::FrameCameraParams()
    {
            focalLength=0;
    }
     
    void FrameCameraParams::setFocalLength(double f)
    {
            focalLength=f;
    }
     
    double FrameCameraParams::getFocalLength()
    {
            return focalLength;
    }
     
     
    FrameCameraParams* parseCameraFile( FrameCameraParams* framesCameraParams)
    {
            framesCameraParams=new FrameCameraParams[5];
    	framesCameraParams[0].setFocalLength(37.);
    	cout << framesCameraParams[0].getFocalLength() << endl;
    	cout << framesCameraParams[1].getFocalLength() << endl;
            return framesCameraParams;
    }
     
     
    int _tmain(int argc, _TCHAR* argv[]) {
    	FrameCameraParams* frames=NULL;
            FrameCameraParams* frames2=NULL;
            frames2=parseCameraFile( frames);
            cout << (frames[0]).getFocalLength() << endl;
            return 0;
    }
    Mais ca ne m'arrange pas en fait car je remplis plusieurs (tableau d'objets) différents. Comment je peux contourner le pb dans le cas suivant où j'ai deux tableaux d'ojets différents (sans créer plusieurs fonctions pour lire le fichier...). Je souhaiterais que les arguments transmis contiennent vraiment les adresses au final:

    EDIT: J'ai enfin compris. Il faut que je transmette le pointeur par adresse.
    Ca donne donc cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    parseCameraFile( FrameCameraParams* & framesCameraParams, FrameSuperCameraParams2* & frames2 )
    {
      framesCameraParams=new FrameCameraParams[10];
      frames2 =new FrameSuperCameraParams2[50];
      //...
    }
     
     
    int _tmain(int argc, _TCHAR* argv[]) {
    	FrameCameraParams1* frames1=NULL;
            FrameSuperCameraParams2* frames2=NULL;
            parseCameraFile( frames1,frames2);
    // ...
            return 0;
    }

    Merci à tous les deux pour votre aide!!

  6. #6
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    En fait ton programme ne fait pas un peu ce que tu dis. A vrai dire je ne te comprend pas très bien. Mais commence par changer les "." en "->". pour ton programme s' execute sans erreur.
    Je ne vois meme pas les fichier que tu veux traiter. Exprime toi plus clairement.

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    En fait ton programme ne fait pas un peu ce que tu dis. A vrai dire je ne te comprend pas très bien. Mais commence par changer les "." en "->". pour ton programme s' execute sans erreur.
    Je ne vois meme pas les fichier que tu veux traiter. Exprime toi plus clairement.
    Les . ne posent aucunement problème dans le code. Sous linux comme sous VC++, l'erreur ne venait pas de là. A l'avenir je les remplacerai par des ->. Sinon, je n'ai pas mis les fichiers que je veux traiter car sinon le code serait beaucoup trop gros. J'ai juste mis les informations nécessaires pour comprendre mon problème vis à vis d'un point précis sur les tableaux d'objets ainsi qu'un infime bout de code correspondant. C'est sans doute pour cela que ca rendait le problème un peu difficile à comprendre...

    Merci pour ton aide en tout cas

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Il ne faut pas changer les . en -> dans ce code. Ces opérateurs ne sont pas interchangeables.
    Ici, framesCameraParams* est un pointeur sur le début d'un tableau, mais framesCameraParams[0] n'est pas un pointeur. Ta première syntaxe était bonne.

    Sinon pour les tableaux, il y a aussi std::vector, qui serait peut-être plus pratique ici puisque la longueur du tableau n'est pas connue à l'avance, et que cette classe permet justement de gérer cette situation.

    Enfin, je suppose que le "delete[] frames;" a été omis dans un soucis de place ...

    Et pendant que j'y suis, j'aurais mis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FrameCameraParams::FrameCameraParams() : focalLength(0)
    {
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Tableau dynamique d'objets
    Par Virtuelfred dans le forum C#
    Réponses: 2
    Dernier message: 17/12/2009, 17h52
  2. [Dojo] objet tableau dynamique YUI
    Par MinaSenegal dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 22/04/2009, 23h47
  3. Problème de tableau dynamique d'objets
    Par markfish55 dans le forum C++
    Réponses: 2
    Dernier message: 07/06/2008, 13h07
  4. Réponses: 11
    Dernier message: 26/09/2007, 21h24
  5. tableau dynamique d'objets
    Par logarithme1984 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/03/2007, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo