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 :

Grave problème de lecture de tableau string


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Points : 41
    Points
    41
    Par défaut Grave problème de lecture de tableau string
    Bonjour à tous,

    Le code suivant ne fonctionne pas (BCB C++) :

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
     
     
    #include <vcl.h>
    #include <string.h>
    #include <conio.h>
    #include <stdio.h>
    #include <cstring.h>
    #include <iostream.h>
    #pragma hdrstop
     
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
     
    //vecteurs d'entrée 
    int const n = 50;
    string InputVector[n] = {"0", "1e-3", "2e-5", "4e-3", "7e-7", "6e-4",
    "1", "4e-3", "66e-5", "43e-3", "78e-7","12e-4","2", "2e-3", "10e-5", "20e-3", "90e-7", "70e-4"};
     
    //vecteur de sortie
    string OutputVector_1[6];
    string OutputVector_2[6];
    string OutputVector_3[6];
     
    string CuVa = "";
     
    	int p = -1;
    	int r = 0;
     
    //lecture du vecteur d'entrée
     
    		for (int i=0; i <= n-1; i++)
    		{
     
    				CuVa = InputVector[i];
     
    				cout << CuVa << "\t";
     
    				if (CuVa == "0" || CuVa == "1" || CuVa == "2")
    				{
    				p++;
    				r = 0;
    				}
     
    				if (p==0)
    				OutputVector_1[r] = CuVa;
    				if (p==1)
    				OutputVector_2[r] = CuVa;
    				if (p==2)
    				OutputVector_3[r] = CuVa;
     
     
    				r++;
     
     
    		}
     
    		// ecriture matricielle du vecteur de sortie
     
    		int j = 0;
    		for (int i=0; i <= p; i++)
    		{
    			j = 0;
    			while(j <= 6)
    			{
     
    				if (i==0)
    				{
    				ShowMessage("val 1");
    				CuVa = OutputVector_1[j];
    				cout << CuVa;
     
    				}
    				if (i==1)
    				{
    				ShowMessage("val 2");
    				CuVa = OutputVector_2[j];
    				cout << CuVa;
    				}
    				if (i==2)
    				{
    				ShowMessage("val 3");
    				CuVa = OutputVector_3[j];
    				cout << CuVa;
    				}
     
    			 //cout << CuVa;
     
    			 if (j != 6	)
    			 cout << "\t";
    			 else
    			 cout << "\n";
     
    			 j++;
    			}
     
     
    getch();
     
    }
    Ce code permet d'effectuer la chose suivante. Etant donné un vecteur string d'entrée qui contient un certain nombre d'éléments dont les éléments "0" "1" et "2", le but est de pouvoir classer ce vecteur dans trois vecteurs de sortie tel que chaque vecteur de sortie commence par l'un des éléments "0" "1" et "2".
    Le problème est que la séquence de restitution des données "classées" ne fonctionne pas puisque les éléments restitués sont tous inexistants. On a en effet la sortie suivante :

    0 1e-3 2e-5 4e-3 7e-7 6e-4 1 4e-3 66e-5 43e-3 78e-7 12e-4 2 2e-3 10e-5 20e-3 90e-7 70e-4

    pour le premier cout - tout a fait normal puisque l'on relit le vecteur d'entrée - et seulement :

    2 2e-3 10e-5 20e-3 90e-7 70e-4

    pour la suite, alors que l'on devrait avoir :

    0 1e-3 2e-5 4e-3 7e-7 6e-4
    1 4e-3 66e-5 43e-3 78e-7 12e-4
    2 2e-3 10e-5 20e-3 90e-7 70e-4

    Grâce au ShowMessage, il est possible de vérifier que les trois vecteurs de sortie sont lus.

    C'est certainement une erreur bidon, mais je ne vois pas du tout où elle pourrait être.

    Je vous remercie pour votre aide.

  2. #2
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    chaque vecteur de sortie commence par l'un des éléments "0" "1" et "2".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CuVa = InputVector[i];
    if (CuVa == "0" || CuVa == "1" || CuVa == "2")
    Tu fais la comparaison sur l'intégralité de la chaine, pas son premier caractère.

  3. #3
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut,
    Citation Envoyé par NewbiZ Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CuVa = InputVector[i];
    if (CuVa == "0" || CuVa == "1" || CuVa == "2")
    Tu fais la comparaison sur l'intégralité de la chaine, pas son premier caractère.
    c'est justement ce que a_lincoln54 veut faire.

    Il y a des erreurs dans ton code, une fois corrigé, ça troune sur DEV-C++

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    // utilisation des fichiers standards actuels
    #include <string>
    #include <iostream>
    using namespace std;
     
    int main(int argc, char* argv[])
    {
     
    //vecteurs d'entrée 
    int const n = 50;
    string InputVector[n] = {"0", "1e-3", "2e-5", "4e-3", "7e-7", "6e-4",
    "1", "4e-3", "66e-5", "43e-3", "78e-7","12e-4","2", "2e-3", "10e-5", "20e-3", "90e-7", "70e-4"};
     
    //vecteur de sortie
    string OutputVector_1[6];
    string OutputVector_2[6];
    string OutputVector_3[6];
     
    string CuVa = "";
     
    	int p = -1;
    	int r = 0;
     
    //lecture du vecteur d'entrée
     
                    // il n'y a que 18 places dans les vecteurs de sorties
    		for (int i=0; i < 18; i++)
    		{
     
    				CuVa = InputVector[i];
     
    				cout << CuVa << "\t";
     
    				if (CuVa == "0" || CuVa == "1" || CuVa == "2")
    				{
    				p++;
    				r = 0;
    				}
     
    				if (p==0)
    				OutputVector_1[r] = CuVa;
    				if (p==1)
    				OutputVector_2[r] = CuVa;
    				if (p==2)
    				OutputVector_3[r] = CuVa;
     
     
    				r++;
     
    			
    		}
     
    		// ecriture matricielle du vecteur de sortie
                   cout << endl; // Un retour à la ligne pour faire joli
    		int j = 0;
    		for (int i=0; i <= p; i++)
    		{
    			j = 0;
    
                            // L'indice va de 0 à 5
    			while(j <= 5)
    			{
     
    				if (i==0)
    				{
    //				ShowMessage("val 1");
    				CuVa = OutputVector_1[j];
    				cout << CuVa;
     
    				}
    				if (i==1)
    				{
    //				ShowMessage("val 2");
    				CuVa = OutputVector_2[j];
    				cout << CuVa;
    				}
    				if (i==2)
    				{
    //				ShowMessage("val 3");
    				CuVa = OutputVector_3[j];
    				cout << CuVa;
    				}
     
    			 //cout << CuVa;
     
    			 if (j != 5 ) // Meme probleme d'indice
    			 cout << "\t";
    			 else
    			 cout << "\n";
     
    			 j++;
    			}
            }
    			
     
        cin.ignore();
     
    }
    Pourquoi n'utilise-tu pas la class std::vector ?

    a+
    jmv

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Merci beaucoup pour votre réponse pertinente. Cela fonctionne maintenant !! Je pense que le fait de lire des cases de tableaux de string qui ne contiennent rien sont probablement à l'origine de ça (puisque dans la boucle de lecture, j'avais mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for (int i=0; i <= (n-1); i++)
    avec n = 18; ce que vous avez corrigé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     for (int i=0; i < 18; i++)
    . En fait, j'avais déjà essayé cette manip. mais il y avait toujours une ligne qui disparaissait lors de la lecture des données "classées". Il y a aussi le , que je n'incluais jamais car cela marchait toujours sans !!

    Pour ce qui est de la classe vector, je ne savais pas que cela existait. C'est vrai que cela a l'air d'être bien pratique d'autant plus que - si je reviens à mon code - le vecteur d'entrée est ici fixé, mais est en réalité indéterminé. Ce code fait partie d'une application plus vaste dont l'une des fonctions est de lire des données à partir d'un fichier texte - de taille à priori quelconque...

    Comme je fais du développement à finalité scientifique, je n'ai pas trop le temps de chercher à optimiser le code (c'est un grand tord que je reconnais volontiers) et donc de trouver de nouvelles classes et méthodes. On se dit que tout marchera avec les bases (ultra classiques) du C standard mais bon, cet exemple démontre que l'on peut mieux faire...

    Encore merci.

    cdt

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

Discussions similaires

  1. [Tableaux] Problème lecture de tableau
    Par jbidou88 dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2008, 08h24
  2. Problème avec tableau() string
    Par Gdal dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/09/2007, 22h50
  3. Problème avec StingTokenizer vers tableau de String
    Par nicofromChina dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 06/10/2006, 11h22
  4. Problème de lecture dans un tableau associatif … ?
    Par sadao dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/07/2006, 22h24
  5. [TFileStream] Problème de lecture de string
    Par Pedro dans le forum Langage
    Réponses: 6
    Dernier message: 28/06/2004, 13h06

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