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 :

[Deb]Passer un tableau non préalablement définie en argument


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut [Deb]Passer un tableau non préalablement définie en argument
    Bonsoir,

    j'ai une fonction qui reçoit en argument un tableau de int. Les données dans ce tableau changent trés souvent.
    voici la définition de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string ecrireChaine(string chaine, int* deco );
    Donc quand je veux faire une écriture, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x[]={GRAS, SOULIGNE};
    string toto = ecrireChaine("Coucou", x);
    Si je veux en faire une autre, je dois modifier x à chaque fois, c'est trés lourd.

    y a t'il possibilité de faire un truc comme ça par exemple ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string toto = ecrireChaine("Coucou", int x[]=<< GRAS << NORMAL);
    J'ai également essayé d'écrire une fonction qui prend un int en argument et qui retourne un tableau, mais je coince. Cela m'aurait donné un appel de fonction comme ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string toto = ecrireChaine("Coucou", faitTableau(GRAS) << faitTableau(NORMAL));
    Si quelqu'un peut me donner un tuyau, je prend.
    Merci.

  2. #2
    Invité
    Invité(e)
    Par défaut
    A ta place, je n'utiliserai pas un tableau pour passer ce genre d'informations, mais le ou binaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char x = GRAS | SOULIGNE;
    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
    #include <stdio.h>
     
    enum {
        BOLD            = 0x01,
        ITALIC          = 0x02,
        UNDERLINED      = 0x04,
        CAPITAL_LETTERS = 0x08
    }
     
    void truc(unsigned char param)
    {
        if(param & BOLD)
            printf("bold\n");
        if(param & ITALIC)
            printf("italic\n");
        if(param & UNDERLINED)
            printf("underlined\n");
        if(param & CAPITAL_LETTERS)
            printf("capital_letters\n");
    }
     
    int main()
    {
        truc(BOLD|UNDERLINED);
     
        return 0;
    }

  3. #3
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    puisque tu utilises string tu peux aussi utiliser vector dans std. et utilise ton vector au lieu de ton int* pour contenir tes parametres GRAS, SOULIGNE etc...

    ou encore creer toi une petite classe Format ou Style qui gere tout ca pour toi ensuite tu as juste a passer cet objet en parametre de ta fonction.

    XXiemeciel

    * la solution du dessus est tres bien aussi, si tu es sure d'avoir moins de 8 valeur dans ton tableau travail directement sur les bits d'un char. Si tu peux avoir plus de valeur alors utilise un int (32 bits a priori)
    XXiemeciel

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    je ne peux pas faire du OU. Les valeurs GRAS, SOULIGNE, ITALIC viennent d'une enumeration.
    J'ai besoins d'envoyer un nombre variable de "décoration". J'ai ensuite une fontion qui écris les balises qui vont bien.

    je met la suite les fonctions utilisées, ce sera plus claire.
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
     
    	struct style {
    		   int indice;
    		   string nom;
    		   string definition;
        };
     
     
    //---------------------------------------------------------------------------
    //
    // Ecrit une chaine de caractéres
    //
    string xlsWriter::ecrireChaine(string chaine, int* deco){
    	   string style;
     
    		style = definirCell(deco);
           return style + "<Data ss:Type=\"String\">" + chaine + "</Data></Cell>\n";
    }
    //---------------------------------------------------------------------------
    string xlsWriter::definirCell(int* deco){
    	 int nbdeco = int(sizeof(deco)/sizeof(deco[0])); // Nombre de décorations demandé
    	 int somme=0; // pour stockage indice
    	 for (int i=0;i<=nbdeco; i++){
    	     somme+=deco[i];
    	 }
    	 if (somme==1)
    	    return "    <Cell>";
     
    	 // on regarde si un style avec cette indice existe
    	 if (!styleExiste(somme))
    		ajouteStyle(deco, nbdeco, somme);
     
    	return xlsWriter::styleParIndice(somme);
    }
    //---------------------------------------------------------------------------
    bool xlsWriter::styleExiste(int indice){
    	 if (this->nbstyles==0)
    	    return false;
     
    	 for (int i=0; i<=this->nbstyles;i++){
    		 if (styles[i].indice==indice)
    		    return true;
         }
    	 return false;
    }
     
    //---------------------------------------------------------------------------
    void xlsWriter::ajouteStyle(int* deco, int nbdeco, int somme){
    	 string definition="";
     
    	 for (int i=0; i<=nbdeco; i++){
    		 switch(deco[i]){
    			 case GRAS:
    				  definition += " ss:Bold=\"1\"";
    				  break;
    			 case SOULIGNE:
                      definition += " ss:Underline=\"Single\"";
                      break;
    			 case ITALIC:
    				  definition += " ss:Italic=\"1\"";
    				  break;
    		 }
    	 }
    	 this->styles[nbstyles].indice = somme;
    	 this->styles[nbstyles].nom=  "Style" + int2string(this->nbstyles);
    	 this->styles[nbstyles].definition =  "  <Style ss:ID=\"Style" + int2string(this->nbstyles) + "\">\n";
    	 this->styles[nbstyles].definition += "   <Font x:Family=\"Swiss\"" + definition + "/>\n";
    	 this->styles[nbstyles].definition += "  </Style>\n";
    	 this->nbstyles++;
     
    }
    //---------------------------------------------------------------------------
    string xlsWriter::styleParIndice(int somme){
    	for (int i=0; i<=this->nbstyles;i++){
    		if (styles[i].indice==somme)
    			return "    <Cell ss:StyleID=\"" + styles[i].nom + "\">";
    	}
    }

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par xxiemeciel
    Salut,

    puisque tu utilises string tu peux aussi utiliser vector dans std. et utilise ton vector au lieu de ton int* pour contenir tes parametres GRAS, SOULIGNE etc...
    Pas mal vector , je connaissais pas. Mais cela m'oblige toujours a initialisé une variable, c'est ce que je voudrais éviter.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int nbdeco = int(sizeof(deco)/sizeof(deco[0])); // Nombre de décorations demandé
    Ton code est buggé, sizeof(deco) donne la taille du pointeur, et pas du tableau. Tu as donc 0 ou 1 à chaque fois, et non pas la taille du tableau.
    Pour le reste, je ne vois toujours pas pourquoi tu ne veux pas utiliser les OU binaire (j'ai mis un exemple plus haut).

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Si tu veux eviter d'avoir a recreer le vector a chaque appel de la fonction garde le quelquepart en tant que membre et va le modifier regulierement, tu n'as plus qu'a aller lire tes valeurs dans le membre a chaque appel de la fonction.

    XXiemeciel
    XXiemeciel

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par remram44
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        int nbdeco = int(sizeof(deco)/sizeof(deco[0])); // Nombre de décorations demandé
    Ton code est buggé, sizeof(deco) donne la taille du pointeur, et pas du tableau. Tu as donc 0 ou 1 à chaque fois, et non pas la taille du tableau.
    Pour le reste, je ne vois toujours pas pourquoi tu ne veux pas utiliser les OU binaire (j'ai mis un exemple plus haut).
    Ta solution du OU me plait bien. Je pensais qu'on ne pouvait pas cumuler.
    Je vais faire comme ca
    MErci a vous

  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 : 39
    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
    Ta solution du OU me plait bien. Je pensais qu'on ne pouvait pas cumuler.
    Pense à bien choisir la valeur des champs de ton énumération (ie. des puissances de 2, pour qu'il n'y ait aucun recouvrement lorsque tu vas les cumuler).

    http://c.developpez.com/faq/c/?page=...etre_n_options

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Super génial.
    J'ai tout modifié pour faire du OU avec du int (pas assez de 8 valeurs).
    Ca marche nickel et cela me parait plus simple à gérer pour les gens qui ne vont voir que le header de la classe.

    Encore un grand merci à vous

  11. #11
    Invité
    Invité(e)
    Par défaut
    De rien.
    Pour infos, cette méthode est utilisée par la plupart des librairies, par exemple SDL, OpenGL, etc...

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 28/02/2005, 13h23
  2. Passer un tableau à une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 10/09/2004, 18h21
  3. Variables javascript non correctement définies
    Par LLaurent dans le forum XMLRAD
    Réponses: 5
    Dernier message: 11/05/2004, 12h39
  4. passer un tableau dynamique en parametre...
    Par annecyrond dans le forum Langage
    Réponses: 5
    Dernier message: 07/03/2003, 09h59
  5. Réponses: 3
    Dernier message: 16/12/2002, 16h12

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