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 :

[debutant]Question technique


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut [debutant]Question technique
    voila j'ai lu l'article

    http://c.developpez.com/faq/cpp/?pag...#POINTEURS_new

    et j'ai une manip du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //en language C ca donne
    char monTab[variable1 - sizeof(type1)];
     
    //en C++ j'en deduis de l'article...
    char * monTab = new type1[variable1 - sizeof(type1)];
    mais ca marche meme po ...

    bon bref si klkun a une idee du pourquoi du comment

    ben ca serait gentil de me la faire aprtager ...

    merci bokou
    a bientot
    [/url]

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En C++, l'allocation de mémoire via new est typée. Càd que si tu alloues un tableau de type1 il faudra placer le résultat dans un type1*. Si tu veux un tableau de char alors il faut faire un new char[...].

    Ne pas oublier aussi qu'en C++ on a std::vector qui fait avantageusement office de tableau dynamique.

    Mais si tu n'es pas au point avec ça, tu devrais lire un bon livre / cours online avant de continuer.

  3. #3
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Si je puis me permettre, ma première remarque est que C++ ne demande certainement pas de remplacer les variables locales (placées en pile) par des allocations dans le tas (new ...), on n'est pas en Java . . . et c'est tant mieux

    Ensuite, comme cela a déjà été dit a mainte reprises, on ne mémorise pas un pointeur sur un type1 dans un char *, on le fait dans un type1 * Contrairement à malloc, new gère les types . . . d'ailleurs il est justement là pour cela.

    Je ne comprendrais jamais pourquoi vous voulez absolument vous compliquer la vie ainsi
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    ok, merci pour toutes ces precisions,

    concernant les lectures j'en ai deja fait pas mal, mais elles ont toutes aussi troubles les une que les autres... sauf sur developpez.com !!!

    donc si j'ai bien compris vos explications une declarations de structure de ce type devrais marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct maStructure
    {
    	int unNombre;
    	double * monTabDeDonnees= new double[unNombre];
    }
    //ps j'ai aussi essayer avec 
    //static int unNombre;
    bref ce code me renvoi ceci :
    blblbl.h(59) : error C2258: illegal pure syntax, must be '= 0'

    je sens que je vais encore apsser pour un c..
    mais j'aime ca...



  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu ne peux pas déclarer et initialiser un membre de structure en un coup comme ça (même en C...). En C++ on se sert des constructeurs / destructeurs / fonctions membres, par exemple :

    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
    class maStructure
    {
    public :
     
       maStructure(int nombre)
       {
          unNombre = nombre;
          monTabDeDonnees = new double[nombre];
       }
     
    private :
     
       int unNombre;
       double * monTabDeDonnees;
    }
     
    // Crée une instance de maStructure en passant 50 à son constructeur
    maStructure S(50);

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 005
    Points
    11 005
    Par défaut
    Citation Envoyé par bruno_pages
    Si je puis me permettre, ma première remarque est que C++ ne demande certainement pas de remplacer les variables locales (placées en pile) par des allocations dans le tas (new ...), on n'est pas en Java . . . et c'est tant mieux
    Pas de VLA en C++98 -- contrairement au C99 -- rien à l'horizon non plus pour le C++0x.
    Un tableau dynamique est soit géré à la main, soit enveloppé dans un vecteur. Ca finira toujours dans le freestore ; bien que l'on puisse changer les allocateurs, mais cela ne change pas grand chose au fait que ce ne sera pas dans la pile.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 534
    Points : 6 723
    Points
    6 723
    Par défaut
    Citation Envoyé par Luc Hermitte
    Un tableau dynamique est soit géré à la main, soit enveloppé dans un vecteur. Ca finira toujours dans le freestore ; bien que l'on puisse changer les allocateurs, mais cela ne change pas grand chose au fait que ce ne sera pas dans la pile.
    tu as mal vu/compris : son 1er code était
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char monTab[variable1 - sizeof(type1)];
    ce vecteur est totalement placé en pile (il ne s'agit pas d'un std::vector) !
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 005
    Points
    11 005
    Par défaut
    Et c'est un VLA et les VLA n'existent pas en C++.
    J'avais parfaitement compris


    PS: Oui certains compilos en mode non-pédantique les supportent, de même que certains qui supportent CString ou AnsiString.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Loulou24
    Tu ne peux pas déclarer et initialiser un membre de structure en un coup comme ça (même en C...). En C++ on se sert des constructeurs / destructeurs / fonctions membres, par exemple :

    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
    class maStructure
    {
    public :
     
       maStructure(int nombre)
       {
          unNombre = nombre;
          monTabDeDonnees = new double[nombre];
       }
     
    private :
     
       int unNombre;
       double * monTabDeDonnees;
    }
     
    // Crée une instance de maStructure en passant 50 à son constructeur
    maStructure S(50);
    Ecoutez tout d'abord MERCI beaucoup, en fait pour faire simple, les structures en C++ ne sont pas tres utilisees ???

    mieux vaut faire une classe c'est plus propre est plus simple non ?

    En tout cas le code que tu m'as donnee marche parfaitement donc merci beaucoup, ca me deblaye une partie des choses que je ne pige pas en C++...

    mais quand je lis cvertains article de votre site je me dis ke je suis pas sorti de la berge ...

    merci encore

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ecoutez tout d'abord MERCI beaucoup, en fait pour faire simple, les structures en C++ ne sont pas tres utilisees ???

    mieux vaut faire une classe c'est plus propre est plus simple non ?
    En fait en C++, struct et class sont strictement équivalents à part un petit détail : par défaut la visibilité est public dans les struct, private dans les classes. A part ça c'est kif-kif.

    Par convention on prend souvent struct lorsqu'il n'y a que des données membres publiques, et class dès qu'on ajoute un peu d'encapsulation : fonctions membres, accesseurs, constructeurs, ...

  11. #11
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    je commence a comprendre,

    que pensez vous de 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
     
    class UneClasse
    {
    public:
       UneClasse(int unParam, int unAutreParam)
       {
          monTabDObjet = new UneAutreClasse[unParam];
          for(int i = 0 ; i < unParam ; i++)
          {
              monTabDObjet[i] = new UneAutreClasse(unAutreParam);
          }
       }
    private:
       UneAutreClasse * monTabDObjet; //modif monTabDObjet
    };
    bon la je sais je vous en demande un peu trop donc si vous voulez passer a autre chose pas de soucis....

    mais moi ca me travail mon compilateur en veux pas...
    je continun a chercher je trouverai bien un jour .... rrrr

  12. #12
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Avec plus de code on pourra mieux t'aider.
    C++ est sensible à la casse; tu as utilisé 'monTabDObjet' dans le construrcteur et 'monTabDobjet' dans la déclaration.
    Comment as tu défini 'UneAutreClasse' et '' ?

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    monTabDobjet est un tableau dont les éléments sont des UneAutreClasse, pas des UneAutreClasse*. L'allocation dynamique que tu fais pour chaque élément n'a donc aucun sens (et le compilo n'en veut pas car les types ne collent pas), tes objets sont déjà alloués correctement.

  14. #14
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Rely
    Avec plus de code on pourra mieux t'aider.
    C++ est sensible à la casse; tu as utilisé 'monTabDObjet' dans le construrcteur et 'monTabDobjet' dans la déclaration.
    Comment as tu défini 'UneAutreClasse' et '' ?
    ok, j'ai modifier le post merci, pour ce qui est de UneAutreClasse voici sa definition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class MonAutreClasse
    {
    public:
       MonAutreClasse(int unParam)
       {
          datas = new double[unParam];
       }
    private:
       double * datas;
    };
    voila ca vole pas bien haut mais bon ca me permet de m'exercer un peu pour comprendre un peu mieux ces histoires d'allocation dynamiques...

    si ca vous inspire, je suis preneur ...
    merci encore et encore...

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu devrais également faire joujou avec les vector et autres conteneurs de la STL, juste histoire de ne pas garder ce code à base de new lorsque tu voudras écrire du "vrai" code .

  16. #16
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Loulou24
    monTabDobjet est un tableau dont les éléments sont des UneAutreClasse, pas des UneAutreClasse*. L'allocation dynamique que tu fais pour chaque élément n'a donc aucun sens (et le compilo n'en veut pas car les types ne collent pas), tes objets sont déjà alloués correctement.
    Comment faire alors pour declarer un tableau dynamiquent, ET instancier les elements de ce tableau qui sont des objets de type UneAutreClasse ???

    ps : desole pour les noms de variables et de classe pas tres lisible mais je pensais pas ke ca irai aussi loin ...

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En allouant ton tableau tu alloues aussi chacun de ses éléments, construits par défaut. Le fait est qu'il est impossible d'utiliser un constructeur autre que celui par défaut pour une allocation de taleau avec new, donc ce que tu veux faire est impossible tel quel.

    Par contre avec std::vector, tu peux tout à fait le faire.

  18. #18
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Loulou24
    Tu devrais également faire joujou avec les vector et autres conteneurs de la STL, juste histoire de ne pas garder ce code à base de new lorsque tu voudras écrire du "vrai" code .
    bo bo bo....

    c'est deja pas facile avec les "new"

    les vector j'ai lu quelques articles masi c'est pas evidant evidant, ne parlons aps des STL ....

  19. #19
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par toto4650
    Comment faire alors pour declarer un tableau dynamiquent, ET instancier les elements de ce tableau qui sont des objets de type UneAutreClasse ???
    En fait ton tableau est déja dynamiquement déclarer. Tu n'as plus besoin de d'instancier chaque élément car cela se fait implicitement dans le 'new UneAutreClasse[unParam]'

  20. #20
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Loulou24
    En allouant ton tableau tu alloues aussi chacun de ses éléments, construits par défaut. Le fait est qu'il est impossible d'utiliser un constructeur autre que celui par défaut pour une allocation de taleau avec new, donc ce que tu veux faire est impossible tel quel.

    Par contre avec std::vector, tu peux tout à fait le faire.
    ok, je vcommence a comprendre beaucoup de chose avec votre aide merci beaucoup je vais jeter un oeil du coup sur les std::vector

    y aurait pas un tutoriel qui traine par ici ??

    je cherche et je met a jour le post si je trouve quelquechose merci pour tout
    et bonne journee

Discussions similaires

  1. Question techniques sur les extents
    Par lecharcutierdelinux dans le forum Oracle
    Réponses: 16
    Dernier message: 24/08/2006, 09h01
  2. [debutant]Question toute bete sur le messages
    Par flogreg dans le forum Servlets/JSP
    Réponses: 18
    Dernier message: 09/09/2004, 09h07
  3. [.NET] Une question technique a propos du mode asynchrone
    Par nicknolt dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 08/06/2004, 10h07
  4. [debutant] Questions a propos du XML
    Par brune dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/06/2004, 09h39
  5. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49

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