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 :

limites de substr( )


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut limites de substr( )
    Bonjour,
    Tbl...est une chaine de 12 caractères décrivant le contenu d'un tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         for (................)
             {
              cout<<i<<"L "<<TblOEntrT[i]                 <<endl;
              cout<<i<<"0 "<<TblOEntrT[i].substr(0,12)<<endl;              
              cout<<i<<"n "<<TblOEntrT[i].substr(4,4) <<endl;// n>0
             }
    Pourquoi le compilateur s'arrête en ligne 6?
    Partout ailleurs substr(n,m) fonctionne mais pas là!
    Cordialement à tous.
    Cordialement.
    Sen.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    kamoulox !

    Que signifie "le compilateur s'arrête" ? il refuse de compiler ?
    Les 3 lignes données sont correctes, du moment que TblOEntrT est déclaré comme string TblOEntrT[SIZE] ou string* TblOEntrT et correctement initialisé.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    arrivé à la ligne 10 maintenant:This application recherche la solution....
    Une autre partie de code dans la même fonction est écrite sans substr et fonctionne:donc Tbl est bien une chaine...
    Les deux {} sont indépendantes soit l'une soit l'autre.Tout est remis à zéro à
    chaque utilisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (int i=0................)
         if (condition A)
           {
           cout<<TblOEntrT[i]<<endl;
           }
        if (condition B)
          {
          cout<<i<<"L "<<TblOEntrT[i]                 <<endl;
          cout<<i<<"0 "<<TblOEntrT[i].substr(0,12)<<endl;              
          cout<<i<<"n "<<TblOEntrT[i].substr(4,4) <<endl;// n>0
          }
    Mystère!
    Cordialement.
    Sen.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    pourrait-on voir le code réel, en particulier les déclarations ?
    parce que "le compilateur s'arrête ligne 6" ou 10, ou "This application recherche la solution", ça ne signifie rien.

    Une autre partie de code dans la même fonction est écrite sans substr et fonctionne:donc Tbl est bien une chaine...
    il dit qu'il voit pas le rapport

    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    J'ai trouvé la raison!
    Quand il y a un pb il faut placer des cout<<variables<<endl;
    aux bons endroits....
    Et puis remonter petit à petit...
    Et puis ne pas tout prendre pour argent comptant...
    Controler ce qui rentre...
    Ou aller voir le départ de choses acquises.
    Si substr() ne fonctionne pas c'est qu'il a du hors limites..
    C'est que le tableau est mal construit..
    Le tableau était construit avec un fichier FhEntrFh contenant une ligne blanche en première ligne donc substr() ne pouvait lire une ligne vide.
    Il acceptait le 0:substr(0,12).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    string FhOEntrZ=FhEntrFh;
    ifstream FhOEntrLZ(FhOEntrZ.c_str(),ios::in);
         std::vector<std::string>TblOEntrT;
         string LignOEntrW;
              while (getline(FhOEntrLZ,LignOEntrW))
              {
              TblOEntrT.push_back(LignOEntrW);          //mise en tableau
     
              }
    for   (....)
    {cout<<TblOEntrT[i].substr(4,4)<<endl;//sauf si Tbl...vide!!
    }
    La philosophie de la discution:remonter à la source et ne pas croire les précédents comme acquis .Remonter aux déclarations!
    Il faut refaire le code pour que les lignes vides n'entrent pas dans le tableau ou purger le tableau de ses lignes vides.
    Merci à tous.
    Cordialement.
    Sen.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Le "problème" c'est que "le compilateur s'arrête ligne 6" ça ne veut rien dire.

    La doc de std::string::substr indique très bien l'erreur que tu vois
    If the position passed is past the end of the string, an out_of_range exception is thrown.
    la position étant le premier paramètre.

    Et un simple try...catch suffit à passer outre.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2006
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Septembre 2006
    Messages : 286
    Points : 0
    Points
    0
    Par défaut
    Merci pour ces précisions incompréhensibles pour un débutant quand on les lit traduites de l'anglais.Je vais les mettre en oeuvre.
    L'"avantage" du C/C++ c'est la profusion de possibilités à partir d'un simple mot,ici substr().
    Je viens de consulter les exceptions try catch:très interessant.Pour moi le traitement des erreurs c'était "on erreur" inconnu chez C/C++.
    Merci encore.
    Cordialement.
    Sen.

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

Discussions similaires

  1. limite d'utilisation de substr
    Par 6ril25 dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2008, 16h39
  2. Limite de la fonction substr
    Par zimotep dans le forum Langage
    Réponses: 2
    Dernier message: 31/10/2006, 01h45
  3. Réponses: 2
    Dernier message: 10/07/2002, 11h51
  4. Comment limiter les mouvements du curseur??
    Par scorpiwolf dans le forum C++Builder
    Réponses: 9
    Dernier message: 07/07/2002, 22h09
  5. [Comparatifs] Limites nombres tables et quantité de données
    Par benj63 dans le forum Décisions SGBD
    Réponses: 7
    Dernier message: 13/06/2002, 21h31

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