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 :

Comment déterminer le type d'un élément d'un tableau.


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Juin 2006
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Comment déterminer le type d'un élément d'un tableau.
    Bonjour tout le monde, ceci est mon premier message ici, et j'espère que vous pourrez m'aider.

    J'ai fouillé un peu sur le site, le forum et sur le net pour la question que je vais vous poser, et je n'ai pas trouvé de réponses de satisfaisante.

    Pour le projet que je fais actuellement, je dois traduire du code PHP vers du code C++. Comme les languages sont similaires, il n'y a pas trop de problème. C'est pas comme de VB à C++ ou de ASP à PHP. Mais dans PHP il y'a foreach qu'il n'y a pas en C++. J'avais pensé traduire le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($res as $ligne)
    {
           ...
    }
    En ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i = 0; i < (sizeof(res)/sizeof(res[0]); i++)
    {
            typeof(res[i]) ligne = res[i];
            ...
    }
    Je crois que typeof est un élément de C#, mais j'aimerais savoir s'il n'y a pas quelque chose d'équivalent en C++. Je sais que je pourrais travailler directement avec "res[i]", mais j'aimerais mettre la valeur dans "ligne" pour garder les modifications au code original au minimum.

    J'utilise Visual Studio 6.0 si ça peux aider.

    Merci à l'avance.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Si les éléments sont différents dans le tableau, tu ne pourras pas, ça n'existe pas en C++... Le coup du sizeof/sizeof, c'est très moyen même en C++ !
    typeof n'existe pas non plus dans le standard - et encore moins donc avec VC6 qui n'est pas conforme au standard parce que trop vieux, tu devrais regarder vers Visual C++ Express 2005 -, et même là, il faudrait que tu aies un type de données, alors qu'en fait tu aimerais ne pas en avoir.
    Il existe quand même une solution avec boost::any, mais c'est bien imparfait comme solution.

  3. #3
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    regarde peut être du côté des RTTI qui te permette d'avoir des infos sur les types durant l'exécution.
    Le coup du sizeof / sizeof est assez courant, et finalement pratique quand tu es obligé de bosser avec des tableaux... mais peut-être qu'un std::vector<> peut faire l'affaire ?

  4. #4
    Membre éclairé
    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
    Points : 785
    Points
    785
    Par défaut
    tu ne connais pas le type employé dans ton ensemble ?

    ce type change ?
    Nul ne peut mieux connaitre la connaissance qu'elle-même.

  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
    A l'endroit où tu manipules ton tableau, tu connais forcément son type et donc le type de ses éléments. Donc quel est le problème ?

    Le coup du sizeof / sizeof est assez courant
    En C++ il y a au moins deux façons de faire mieux (boost::array, ou détection automatique de la taille via un template).

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour le coup du template, voir la macro ARRAYSIZE de Visual C++ : En C++, elle utilise un template pour s'assurer qu'on ne l'emploie que sur un tableau.

    Si tableau il doit y avoir, le template est ce que je préconiserais...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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 015
    Points
    11 015
    Par défaut
    Le std::for_each du C++ applique un traitement à l'ensemble des éléments itérables entre deux bornes (quelle que soit la façon dont sont stockés ces éléments, il doivent juste être itérables). Il y a d'autres algos spécialisés dans le même genre pour faire recherches, copies, copies filtrantes, effacements, tris, ...

    (Le foreach, tel que tu l'utilises en php, est chez moi un squelette de code qui se traduit en boucle for()).

    Pour les tableaux statiques, (ceux natifs du C et du C++), j'aime bien utiliser boost::begin() et end() ou assimilé plutôt que de jouer avec des indices et la feinte du sizeof(). Feinte qui ne provoque même pas d'erreur quand utilisée sur des pointeurs.
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (T const * ptr = boost::begin(array), end=boost::end(array)
        ; ptr != end
        ; ++ptr)
    {
        Faire_qqch_avec(*ptr);
    }
    Dans le genre, j'avais croisé une macro array_size qu'il m'arrive d'utiliser régulièrement avec des assertions statiques. (NB: le bout de code du lien ne fonctionnera pas avec certains compilos, il faut rajouter un +0 à la valeur renvoyée dans le begin())


    Et, pour en rajouter une couche,
    - Si tes éléments sont différents, alors il y a des très fortes chances que tu aies un mauvais design
    - Définitivement, VC6 est complètement déprécié -- Microsoft ne le maintient plus (un petit argument pour les responsables informatique qui s'archarnent à continuer de s'en servir)
    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...

Discussions similaires

  1. Comment connaître le type d'un élément dans un réseau IP ?
    Par gregcat dans le forum Web & réseau
    Réponses: 5
    Dernier message: 16/07/2008, 14h17
  2. [Free Pascal] Comment déterminer le type que rentre l'utilisateur
    Par Vitoo dans le forum Free Pascal
    Réponses: 6
    Dernier message: 26/11/2007, 13h35
  3. Réponses: 3
    Dernier message: 26/08/2006, 14h03
  4. Réponses: 21
    Dernier message: 25/06/2006, 02h31

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