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 :

Exception std::length_error incomprehensible


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Exception std::length_error incomprehensible
    Bonjour,

    Lors de l’exécution de mon code, cette erreur apparaît :
    terminate called after throwing an instance of 'std::length_error'
    what(): vector::_M_fill_insert
    Au début le code marchait, mais impossible de savoir quel modification a provoqué cela. De plus le déboggueur m'aide pas vraiement. Il me dit juste que ça vient de la ligne ci-dessous, mais je comprend pas ce qui produit l'exception et comment résoudre ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cppdb::result rtotal = db << "SELECT COUNT(" + columns + ") AS total FROM " + argv[ARG_TABLE] << cppdb::row;
    Merci d'avances pour vos réponses !

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    plutot que des '+', utilise des '<<', en raison des priorités...
    quelque chose comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cppdb::result rtotal = db << "SELECT COUNT(" << columns << ") AS total FROM " << argv[ARG_TABLE] << cppdb::row;
    Si l'erreur persiste, c'est soit un problème de logique de base de données, soit une "juste après l'erreur", auquel cas, vérifie les lignes précédentes.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Je peux pas utiliser << car la bibliothèque le traite différemment de +.

    Dans la bibilothèque, << sert à spécifier des valeurs dans la requête. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    db << "UPDATE ma_table SET value2 = ? WHERE id = ?" << value2 << id << cppdb::exec;
    Sinon, j'ai vérifier les lignes au dessus, aucune erreur apparement

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Dans ce cas, mets des parenthèses autour de la construction de la chaine, et plonge dans ta documentation pour savoir dans quelles conditions cette exception peut être lancée.

    Autre possibilité d'investigation, divise la ligne en deux.
    Si tu es en C++11, c'est très facile, sinon, il faudra chercher quel est le type intermédiaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    auto bidule = db << ("SELECT COUNT(" + columns + ") AS total FROM " + argv[ARG_TABLE]);
    cppdb::result rtotal = bidule << cppdb::row;
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    J'ai testé en divisant la ligne en deux, ça a bien l'air d'être l’exécution de la requête qui pose problème.

    Pourtant, en exécutant la même requête dans outil graphique, ça marche sans problèmes ...

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    c'est que tu n'a pas codé pas ce que tu crois.

    Vérifie tes arguments.

    tout particulièrement argv[ARG_TABLE] et columns
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    J'ai déjà vérifier avec un cout, les valeurs sont bonnes

  8. #8
    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
    http://www.cplusplus.com/reference/s...string/string/
    If the resulting string length would exceed the max_size, a length_error exception is thrown.

    Pourtant tout semble indiquer un problème d'arguments...
    As-tu essayé de faire de columns et la table injectée à FROM des valeurs fixes et avec quel résultat ?

    En plus que la syntaxe qui confond << à l'objet db et + pour concaténer une chaîne qui est des plus surprenantes.
    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.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    J'ai testé avec des valeurs fixes, ça change rien

  10. #10
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    count n'a pas besoin de colonnes, quand il n'y pas de group by.
    Essaie cppdb::result rtotal = db << "SELECT COUNT(1) AS total FROM " + argv[ARG_TABLE] << cppdb::row;
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    COUNT(*) plutôt.

    Ça change rien. D'après la pile d'appel, ça plante au niveau d'un vector qui semble venir de cppdb.

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Au contraire, count(1) ne lit pas la ligne, alors que count(*) la lit entièrement. Ca change beaucoup dans performances.

    Alors écrit en dur la requete utilisée dans l'outil graphique.

    Si ca ne passe toujours pas, c'est que le problème est ailleurs:
    la base est mal connectée, il y a un lock ...
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    ça passe, mais je pense avoir trouvé le problème qui vient de cppdb
    Voici un bout de code qui redimensionne un vector dans la cppdb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    params_.resize(params_no_);
    Hors, d'après le débogueur, params_no_ vaut -1247.

    Normalement, la fonction n'accepte pas un nombre négatif ? (dans le prototype, le paramètre est de type size_type, mais je ne sais pas ce qu'il accepte)

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est bizarre, size_type est le plus souvent un typedef sur size_t, un nombre non-signé... Je suppose que ce n'est pas le cas ici (cherche dans la classe elle-même ou une classe parente, elle doit contenir le typedef...)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 13
    Points : 8
    Points
    8

Discussions similaires

  1. Besoin d'aide avec Exception std::bad_alloc
    Par YohDono dans le forum C++
    Réponses: 2
    Dernier message: 18/05/2013, 18h40
  2. Réponses: 7
    Dernier message: 18/11/2008, 09h12
  3. Réponses: 7
    Dernier message: 03/10/2008, 20h16
  4. std::bad_alloc Exception projet VCL
    Par mickyoun dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/10/2007, 17h48
  5. [vb.net][exception] erreur incomprehensible
    Par arnolem dans le forum Windows Forms
    Réponses: 8
    Dernier message: 05/01/2006, 14h33

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