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 :

Initialisation d'un tableau de pointeurs


Sujet :

C++

  1. #1
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut Initialisation d'un tableau de pointeurs
    Bonjour,

    Pour initialiser les pointeurs de mon tableau de pointeurs à zero je fais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *array[30]={0};
    ça fonctionne, mais j'ai lu quelque part que ce n'était pas une trés bonne solution (mais je ne me souviens plus du tout pourquoi ).
    Aussi, j'aimerais savoir si c'est une bonne pratique ou si il y a
    une autre méthode plus sûr et plus portable.

    Merci

  2. #2
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut
    je ne suis pas sur mais je pense qu'il serait mieux de créer un pointeur sur pointeur ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef char *car;
    car *array=new car[30];
    array=NULL;//initialisation sur rien

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par akfp85
    je ne suis pas sur mais je pense qu'il serait mieux de créer un pointeur sur pointeur ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef char *car;
    car *array=new car[30];
    array=NULL;//initialisation sur rien
    t'as honte la, non ?

    tintin72 : si tu veux initialiser les cases a 0, tu parcours les tableau en mettant chaque case à 0, comme ça t'es sur.
    Sinon tu alloue dynamiquement, et tu utilises calloc au lieu de malloc.

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut
    en fait j'initialisait sur rien pour ne pas lire à des adresses interdites
    c'est vrai que je n'ai initialiser que le premier pointeur je m'en excuse
    il est en effet possible d'initialiser comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0;i<30;i++)
    array[i]=NULL;
    là ça va?

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par akfp85
    en fait j'initialisait sur rien pour ne pas lire à des adresses interdites
    c'est vrai que je n'ai initialiser que le premier pointeur je m'en excuse
    il est en effet possible d'initialiser comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for(int i=0;i<30;i++)
    array[i]=NULL;
    là ça va?
    sachant que array[i] est un char, le mettre a NULL ça n'a rien de malin. Note que ça passera quand meme puisque NULL vaut 0, mais que je vois pas ça dans un code hein.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    memset
    Sets buffers to a specified character.

    void *memset( void *dest, int c, size_t count );

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par olive_le_malin
    memset
    oui ben vu le niveau, je sais pas si c'est recommandé de les faire utiliser memset.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    memset(array, 0, sizeof(char*) * 30);

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut
    Citation Envoyé par Faiche
    oui ben vu le niveau, je sais pas si c'est recommandé de les faire utiliser memset.
    je comprends rien

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    utilise ça (si c'est bien ce que tu veux faire ...)
    et pourt'en convaincre regarde au debuggeur le comportement de ton tableau.

    Regarde aussi l'aide de cette fonction.

  11. #11
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Ce qui n'est pas terrible comme solution, c'est de gérer des tableaux de chaines de la sorte. Rien de tel pour avoir des programmes pénibles à maintenir instables après la moindre refactorisation.

    Sinon, c'est une initialisation valable. Cela ne pourra en revanche jamais initialiser quoique ce soit.
    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...

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Citation Envoyé par tintin72
    Bonjour,

    Pour initialiser les pointeurs de mon tableau de pointeurs à zero je fais comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *array[30]={0};
    ça fonctionne, mais j'ai lu quelque part que ce n'était pas une trés bonne solution (mais je ne me souviens plus du tout pourquoi ).
    Aussi, j'aimerais savoir si c'est une bonne pratique ou si il y a
    une autre méthode plus sûr et plus portable.

    Merci
    Ça me semble être parfaitement correct.

  13. #13
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 38
    Par défaut
    Pourquoi faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for(int i=0;i<30;i++)
    array[i]=NULL;
    au lieu d'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *array[30]={0};
    Toutes les cases seront initialisées à zéro anyway non ?

  14. #14
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Ca y est! J'ai retrouvé l'article qui déconseillait (plus ou moins) cette façon de faire:
    http://www.game-lab.com/index.php?se...showtut&id=212
    l'argument est que cela stocke le tableau en entier dans le code du programme, ce qui fait grossir la taille de l'exécutable.
    Mais bon, tant pis pour la taille de l'exe car de toute façon il est impératif que tous mes pointeurs soit initialisés à zero sinon, avec les tests conditionnel qui suivent c'est le plantage assuré.
    Par contre je ne sais pas si pour une réinitialisation (le tableau doit être réinitialisé à zero aprés chaque utilisation) je peux réutiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char *array[30]={0};
    sinon je peux toujours utiliser memset qui est aussi une bonne alternative.

  15. #15
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 292
    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 292
    Par défaut
    Non, tu ne peux pas. (et +1 pour ma théorie des questions qui arrivent en troupeaux d'elles même)

    Mais que veux tu stocker ? Si c'est un tableau de chaines, cette solution est archaique en C++ -- pour ne pas dire maladroite, source à bugs, pénible à maintenir, non-flexible, ...
    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...

  16. #16
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Non, tu ne peux pas.
    Pourquoi ?
    Quelle méthode puis-je utiliser alors ?
    Mais que veux tu stocker ? Si c'est un tableau de chaines, cette solution est archaique en C++ -- pour ne pas dire maladroite, source à bugs, pénible à maintenir, non-flexible, ...
    Oui ce sont des chaine de caractères. Je sais, en C++ on utilise des strings, mais le pb c'est que les widgets (input text, output text etc..) de la GUI que j'utilise (fltk) attendent des const char* comme arguments.
    Je sais qu'on peut convertir les string en char et vice versa, mais pour l'instant mon prog est suffisament compliqué Aussi je préfère pour l'instant travailler avec des char* quitte aprés a tout
    reconvertir en string.

  17. #17
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Je sais qu'on peut convertir les string en char et vice versa, mais pour l'instant mon prog est suffisament compliqué
    Il serait pourant plus simple si tu utilisais des std:string (avec c_str() ) pour les injecter dans tes widgets.

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 131
    Par défaut
    je suis ce topic parce que il m'interesse aussi

    mais si tu ne renseignes pas ton tableau à sa declaration

    son contenu est-il considéré comme null ?

    ou est-il considéré déjà a 0 ?

    rog

  19. #19
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Ni l'un ni l'autre. Si tu n'itinialise pas ton tableau de pointeurs lors de sa déclaration, tes pointeurs vont pointer sur tout et n'importe quoi, d'où l'intérêt de l'initialisation.

  20. #20
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    L'utilisation de type primitif char * n'est pas à conseiller dans un langage orienté objet. Il faut réaliser de l'abstraction qui est plus facile à maintenir.

    L'utilisation de std::string est à prescrire au lieu de char *. Et plus le programme deviendra complexe et plus tu te casseras les dents.

    Un bête exemple, la majorité des développeurs oublient d'inclure la sécurité dans leur soft en se disant "je le ferai en dernier", et pourtant ça serait plus simple de le faire dès la naissance du projet. On gagne du temps.

    Même constatation avec les tests unitaires.

Discussions similaires

  1. initialisation tableau de pointeurs
    Par nikau6 dans le forum C++
    Réponses: 7
    Dernier message: 02/08/2013, 17h02
  2. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  3. tableau de pointeurs
    Par seal3 dans le forum C++
    Réponses: 7
    Dernier message: 01/11/2005, 20h51
  4. Tableau de pointeurs de fonctions
    Par Alp dans le forum C++
    Réponses: 7
    Dernier message: 29/10/2005, 13h19
  5. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58

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