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 :

Récupérer la valeur pointée


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Gilles57-H-G
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 88
    Par défaut Récupérer la valeur pointée
    Je cherche à optimiser un "programme".

    Ce programme combine des caractères, ainsi, sur cet exemple, je récupère trois pointeurs de type string, que je cherche à mettre directement dans un string.

    Je ne veux pas rajouter de commande supplémentaire, ce qui, je pense ralentirait le code.

    Pourquoi le string : mot ne s'affiche pas ? (première partie de l'exemple).

    J'ai essayé une autre version dans la deuxième partie de l'exemple.
    Cette foi c'est le string : word, qui n s'affiche pas correctement.

    Merci.
    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
     
    #include <cstdlib>
    #include <fstream>
    #include "stdlib.h"
    #include <stdio.h>
    #include <sstream>
    #include <string>    
    #include <iostream>  
    #include <cstring>
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
     ofstream fichier("FileExit.txt", ios::out | ios::trunc); 
     ofstream fichier1("FileExit2.txt", ios::out | ios::trunc); 
     
     string mot;
     string str ("abcd");
     
     
      string::iterator it0;
        string::iterator it1;
          string::iterator it2;
     
     
      for ( it2=str.begin() ; it2 < str.end(); it2++ )
       {
        for ( it1=str.begin() ; it1 < str.end(); it1++ )
         {
          for ( it0=str.begin() ; it0 < str.end(); it0++ )
          {
     
             mot[0] = *it0;
              mot[1] = *it1;
               mot[2] = *it2;
     
     
        cout<<mot<<"  "<<*it2<<*it1<<*it0<<endl;
        fichier<<mot<<"   "<<*it2<<*it1<<*it0<<endl;
     
                }
              }
            }
        cout<<"------------Fin Premiere partie-----------------------"<<endl;
     
     
       string chaine = "acb";
       int taille = chaine.length();
     
       string word[taille];
     
     
      for (int i2=0; i2<taille; i2++)  
          { 
         for (int i1=0; i1<taille; i1++)  
          { 
           for (int i=0; i<taille; i++)   
              {
     
               word[0] = chaine.substr(i,1);
               word[1] = chaine.substr(i1,1);
               word[2] = chaine.substr(i2,1);
     
                cout<<word<<endl;
                 fichier1<<word<<endl;
     
     
                 }
               }
            }
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Citation Envoyé par Gilles57-H-G Voir le message
    sur cet exemple, je récupère trois pointeurs de type string
    Ah bon ?
    Je dois avoir la vue qui baisse…

    Citation Envoyé par Gilles57-H-G Voir le message
    Pourquoi le string : mot ne s'affiche pas ? (première partie de l'exemple).
    Voyons voir…
    Tu déclares une variable de type string sans l'initialiser.
    A priori, ça appelle le constructeur par défaut ; donc on va dire que cette variable représente la chaîne vide.
    Ensuite tu essaies d'accéder aux 3 premiers caractères de cette chaîne.
    La chaîne vide ayant une longueur nulle, ces caractères n'existent pas.
    Bonne chance pour affecter lesdits caractères !

    Si encore tu avais donné une taille à cette chaîne, par exemple en appelant ce constructeur qui crée une chaîne avec n fois le caractère c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string::string(size_t n, char c)
    ou, si tu veux simplement stocker des caractères sans faire d'opération dessus, et si tu connais à l'avance leur nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char mot[NB_CHARS];
     
    // Ou éventuellement :
    char mot[NB_CHARS + 1];
    mot[NB_CHARS] = '\0';
     
    // Voire, s'il n'y a pas trop de caractères :
    char mot[] = {'\0', '\0', ... , '\0'};

    Citation Envoyé par Gilles57-H-G Voir le message
    J'ai essayé une autre version dans la deuxième partie de l'exemple.
    Cette foi c'est le string : word, qui n s'affiche pas correctement.
    Voyons…
    Tu crées un tableau de string, et tu n'en initialises aucun.
    Ah bah en fait, c'est exactement le même cas que juste au-dessus.


    Ceci dit, il y a quelque chose qui me perturbe.
    Tu crées un tableau dont la taille est une variable.
    En toute logique, ça devrait être interdit !!!
    D'après ce que j'ai compris des tableaux alloués statiquement, leur taille doit être connue à la compilation.
    Ce n'est clairement pas le cas ici !!!

  3. #3
    Membre confirmé Avatar de Gilles57-H-G
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 88
    Par défaut
    tu as certes raison, je compris ce qui ce passe.

    Bon j'ai mis une taille au string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     string str ("abcd");
     int t = str.length();
     
     string mot[t]; ;
    Cela ne change rien.

    J'ai besoin de la valeur pour tester.

    Cela fonctionne en passant par une variable intermédiaire.

    Je voulais supprimer cette étape .
    Je veux faire : 3 valeurs pointées rangées dans un string.

    Ne me dis pas que ce n'es pas possible.

    Bon pour lestableaux alloués statiquement, je vais faire attention.

  4. #4
    Membre confirmé Avatar de Gilles57-H-G
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 88
    Par défaut
    Ceci dit.

    Dans le dernier exemple la taille du tableau est connue à la compilation, puisque c'est le string chaine qui défini la taille via la fonction length.

    Le string chaine contient un nombre de caractères fixe, non modifiable.

    L'exemple en question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       string chaine = "acb";
     
       int taille = chaine.length();
     
       string word[taille];
    Il eut été plus élégant de définir une taille via un entier , je conçoit.

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Gilles57-H-G Voir le message
    Bon j'ai mis une taille au string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     string str ("abcd");
     int t = str.length();
     
     string mot[t]; ;
    Cela ne change rien.
    Non tu n'as pas mis une taille au string, tu as créé un tableau de string.

    Au passage, comme déjà signalé, ce code n'est pas correct en C++: on ne peut pas créer de taille statique avec une variable en guise de table. A priori tu utilises les extensions de ton compilateur.


    Citation Envoyé par Gilles57-H-G Voir le message
    Dans le dernier exemple la taille du tableau est connue à la compilation, puisque c'est le string chaine qui défini la taille via la fonction length.
    Non, même si ici tu sais avec certitude la valeur qui sera contenue dans taille sans l'exécuter,taille n'en reste pas moins une variable, pas une constante connue à la compilation. On ne peut donc pas l'utiliser comme taille de tableau.

    Pour illustrer l'explication, le code suivant n'est pas valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int t = 3;
    int tab[t];
    alors que celui-ci l'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int t = 3;
    int tab[t];
    Citation Envoyé par Gilles57-H-G Voir le message
    Le string chaine contient un nombre de caractères fixe, non modifiable.
    Si le nombre de caractère (et le contenu) de la chaîne est modifiable.

    Je pense que tu confonds le fonctionnement des chaînes C++ (std::string) et des char* pointant sur des chaînes littérales [1].





    <HS>
    [1] Au passage, on ne peut certes pas modifier la chaîne littérale dans ce cas, mais on peut modifier l'adresse contenue dans le pointeur. Le résultat de strlen(p) peut donc tout à fait évoluer même dans ce cas de figure
    </HS>

  6. #6
    Membre confirmé Avatar de Gilles57-H-G
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 88
    Par défaut
    @gl "Non tu n'as pas mis une taille au string, tu as créé un tableau de string."

    C'est évident, je ne m'en était pas rendu compte, merci.

    Mais j'ai lu qu'un string, est un tableau de caractère, qui sont de type string.

    Donc, un string est un tableau de string par définition ?
    -------------------------------------------------------------------------------Fin @ gl

    Au départ, tout fonctionne, je veux simplement supprimer une commande.
    La version que je cherche à rendre plus rapide.
    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
      #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include "stdlib.h"
    #include <stdio.h>
    #include <sstream>
    #include <string>    
    #include <cstring>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
     
        using namespace std;
         int a,b,c,d;
     
         string lt1,lt2,lt3;
         string mot;
     
         int taille;
     
     
         string chaine;
         cout<<"Entrez caracteres"<<endl;
         cin>> chaine;
     
         taille = chaine.length();
     
          string t1[taille];
             string t2[taille];
                 string t3[taille];
     
     
             for (int ii=0; ii<taille; ii++)   
     
              {
     
                    t1[ii] = chaine.substr(ii,1);
                    t2[ii] = chaine.substr(ii,1);
                    t3[ii] = chaine.substr(ii,1);
     
                                                           }
     
     
                for(c=0; c<taille; c++)
                  {
                    for(b=0; b<taille; b++)
                     {
                        for(a=0; a<taille; a++)
                         {
     
                         lt1 = t1[a];  
                         lt2 = t2[b];
                         lt3 = t3[c];
     
     
                         mot =    lt3 += lt2 += lt1  ;
     
                         cout<<mot<<endl;
     
     
                          }
                      }
                  }
     
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    je voulais transformer le code ci dessus, résultat de l'application d'un algorithme basé sur des tableaux.

    En ceci, utilisant les iterator de la classe string, en affichant directement les pointeurs dans le string mot, supprimant une commande .

    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
    #include <iostream>
    #include <cstdlib>
    #include <fstream>
    #include "stdlib.h"
    #include <stdio.h>
    #include <sstream>
    #include <string>    
    #include <cstring>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
     
     
        using namespace std;
     
        string mot;
        string str;
     
        cout<<"Entrez caracteres"<<endl;
        cin>> str;
     
     
      string::iterator it0;
        string::iterator it1;
          string::iterator it2;
     
     
      for ( it2=str.begin() ; it2 < str.end(); it2++ )
       {
        for ( it1=str.begin() ; it1 < str.end(); it1++ )
         {
          for ( it0=str.begin() ; it0 < str.end(); it0++ )
          {
     
             mot[0] = *it0;
              mot[1] = *it1;
               mot[2] = *it2;
     
     
        cout<<mot<<"  "<<*it2<<*it1<<*it0<<endl;
     
     
                }
              }
            }
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Si je réussissais à récupérer directement la valeur pointée par les 3 pointeurs, rangés dans un string, le code serait plus rapide.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Citation Envoyé par Steph_ng8 Voir le message
    ou, si tu veux simplement stocker des caractères sans faire d'opération dessus, et si tu connais à l'avance leur nombre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char mot[NB_CHARS];
     
    // Ou éventuellement :
    char mot[NB_CHARS + 1];
    mot[NB_CHARS] = '\0';
     
    // Voire, s'il n'y a pas trop de caractères :
    char mot[] = {'\0', '\0', ... , '\0'};

    On reste sur des strings ! Pourquoi se mettre en danger avec des char

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

Discussions similaires

  1. récupérer des valeurs séparées par un point virgule
    Par Spaccio dans le forum Requêtes
    Réponses: 9
    Dernier message: 10/04/2009, 11h22
  2. [VBA-E] Graphiques : récupérer la valeur d'un point
    Par laloune dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2006, 15h45
  3. récupérer la valeur du 2ème champ dans un DBLookUpListBox
    Par jakouz dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/07/2004, 16h45
  4. [Couleur] Récupérer les valeurs R,V,B et L,U,V ?
    Par M4v3rick dans le forum C++Builder
    Réponses: 4
    Dernier message: 25/01/2004, 03h28
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

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