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 :

Tableaux de types multiples


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut Tableaux de types multiples
    Bonjour à tous,

    tout d'abord voici ce que j'aimerais faire :

    je lis un message où je récupère entre autre des paramètres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    boucle tant que(pas fin message)
    {
    lire type du paramètre
         si type==int alors lire le paramètre, le caster en int et le stocker dans param
         si type==bool alors lire le paramètre, le caster en bool et le stocker dans param
    }
    Donc voilà, si ca boucle, le paramètre param va etre ecrasé par la nouvelle lecture

    Donc j'ai pensé à la solution du tableau qui serait de différents types,
    alors à chaque boucle j'incrémente une variable, et j'ecris ds param[0] puis param[1] etc...

    Si il y a un moyen plus simple, arrêtez moi tout de suite ...

    Sinon, comment fait-on ca ?

    J'ai réussi à trouver la notion de conteneur, auquel cas il y aurait typeid() qui permettrait de récupérer le type, ce qui m'arrangerait pour un autre truc!

    Suis-je sur la bonne voie ?

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu ne peux pas avoir un tableau contenant des éléments de différents types.

    Il faudrait que tu nous expliques un peu le contexte, mais si stocker des types différents est vraiment la solution à ton problème, alors tu as boost.variant ou boost.any qui peuvent ty 'aider.

  3. #3
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    Je ne pense pas que boost.variant m'aide dans mon cas.
    Je reexplique (pas évident d'etre clair ) :
    Je recupere un parametre d'un type quelconque, et je veux le mettre dans une variable.
    Faisant ca dans une boucle, je ne peux pas declarer une seule variable, meme de type multiple, puisque au deuxieme passage de la boucle, j'ecrase le travail du premier passage de la boucle.

    Bon je poste le code parce que la je m'enfonce ...

    je lis ce message :
    string msgBuf("fMessageBoxA@1930@194Your function is working@194Hey Dude@193MB_OK");

    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
    string funcName(readName(msgBuf));
    	LPCSTR funcNameL;
    	funcNameL=funcName.c_str(); // converts String into LPCSTR
    	int loop=0;
    ->	while(msgbuf[ltr]!='\0')
    	{
     
     
    		string paramType(readType(msgBuf));
    		std::istringstream iss( paramType );
    		int paramTypeInt;
    		iss >> paramTypeInt;
     
    		string paramValue;
     
    		switch (paramTypeInt)
    		{
    			case 193 :
    				paramValue=readName(msgBuf);
    				break;
    			defaut :
    				break;
    		}
     
    	}
     
    	FCTX<int, char*, char*, unsigned int>::type        Fn_Ptr;
    	Fn_Ptr = (FCTX<int, char*, char*, unsigned int>::type )GetProcAddress(ModId, funcNameL);
    	Status = Fn_Ptr(0, "Your function is working", "Hey dude", MB_OK);
    	printf ("After function call, status = %i (1 means ok)\n", Status);
    	cout<<" Address pointer : "<<Fn_Ptr<<" !! "<<endl;
    	cout<<funcNameL<<" ( "<<paramType<<','<<paramValue<<" );"<<endl;
    c'est donc paramValue que je recupere. J'aimerais reutiliser paramValue dans la ligne
    Status = Fn_Ptr(0, "Your function is working", "Hey dude", MB_OK);
    pour avoir
    Status = Fn_Ptr(paramValue1, paramValue2, paramValue3, paramValue4);
    Donc comment faire pour recuperer mes differents parametres, les mettre dans 4 paramValue differents ? J'avais pensé à un espece de tableau acceptant des types differents, mais comment faire alors?

    Merci pour votre aide
    Je reviens demain si j'ai besoin d'apporter des precisions

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Mais là les types sont parfaitement connus, ainsi que le nombre d'éléments. Donc il te suffit de déclarer les 4 variables qu'il te faut.

    Tu ne pourras plus utiliser une boucle, mais il suffit de placer ton code de lecture dans une fonction (template) et de l'appeler pour chacune de tes variables.

    Sinon, si tu tiens vraiment à avoir un tableau, tu peux utiliser boost.any.

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    j'avais préparé un exemple avec des conteneur... mais là il te suffit simplement de découper ta string avec strtok ou en c++ (avec string.find()) et de stocker les différents paramètres dans des strings ou des chaines de caractères.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    string message= "fMessageBoxA@1930@194Your function is working@194Hey Dude@193MB_OK";
     
    char *explore = (char*)(void*)message.c_str();
    int num;
     
    /* on cherche le nombre de @ */
    for(num = 1; *explore != 0; ++explore)
    {
      if (*explore == '@') ++num;
    }
     
    /* création du tableau */
    string params[num];
     
    /* on refait une boucle , cette fois pour placer les éléments*/
    int i, j, k;
    for (i = 0, j = message.find('@', i), k=0; k < num; ++k, i=j+1, j=message.find('@'))
    {
      param[k] = message.substr(j-i);
    }
     
    /*
      maintenant on a le tableau param
      en fait ca aurait été beaucoup plus simple
      avec strtok
      */

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Et si tu as 150 options, boost.program_options est un choix possible.
    Lectures connexes (pour des solutions plus génériques):
    http://www.developpez.net/forums/sho...=1#post1588859
    http://www.developpez.net/forums/sho...d.php?t=186236
    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
    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
    Je ne pense pas que boost.variant m'aide dans mon cas.
    Pourtant, si.
    C'est exactement ce que tu veux d'après la demande de ton premier message.

    Sauf que boost.variant ne l'implémente pas comme ça (tu trouveras ce genre de d'interface avec boost.any) mais d'une meilleure manière, plus propre, plus performante (car la recherche du type doit être en O(log n) a priori et non pas en O(n)) et en plus, permet de faire un genre de duck typing avec les templates.

  8. #8
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Par défaut
    Citation Envoyé par coyotte507
    j'avais préparé un exemple avec des conteneur... mais là il te suffit simplement de découper ta string avec strtok ou en c++ (avec string.find()) et de stocker les différents paramètres dans des strings ou des chaines de caractères.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     
    string message= "fMessageBoxA@1930@194Your function is working@194Hey Dude@193MB_OK";
     
    char *explore = (char*)(void*)message.c_str();
    int num;
     
    /* on cherche le nombre de @ */
    for(num = 1; *explore != 0; ++explore)
    {
      if (*explore == '@') ++num;
    }
     
    /* création du tableau */
    string params[num];
     
    /* on refait une boucle , cette fois pour placer les éléments*/
    int i, j, k;
    for (i = 0, j = message.find('@', i), k=0; k < num; ++k, i=j+1, j=message.find('@'))
    {
      param[k] = message.substr(j-i);
    }
     
    /*
      maintenant on a le tableau param
      en fait ca aurait été beaucoup plus simple
      avec strtok
      */


    Salut,
    c'est exactement ce que fait ma fonction readName ou readType, elle lit ma chaine msgbuf et stocke dans des strings. Mais ma boucle me sert aussi a transformer mes strings en le type defini dans msgbuf (ce sont les codes 193 ou 194 ca correspond a des types, mon maitre de stage veut que ce soit des numeros, alors on met des numeros)
    Et mon msgbuf n'est pas fixe, normalement c'est un message que je recois par ethernet, et il est different a chaque fois, c'est juste un exemple ici pour bosser...

  9. #9
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Vu que de toute façon tu connais les types (tu passes tes valeurs à une fonction dont le prototype est bien défini), pourquoi ne pas garder tes valeurs sous forme de chaîne et les convertir uniquement au moment de l'appel (là où tu connais le type), par exemple avec boost.lexical_cast ?

Discussions similaires

  1. [Tableaux] Programme de multiplication enfant
    Par isa150183 dans le forum Langage
    Réponses: 12
    Dernier message: 02/08/2006, 23h16
  2. [Tableaux] Le type Ensemble existe-t-il ?
    Par petitnuage dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 20h21
  3. [Tableaux] bouton radio multiples
    Par baillador dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 10h14
  4. Réponses: 6
    Dernier message: 17/03/2006, 12h23
  5. Réponses: 2
    Dernier message: 09/02/2006, 18h20

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