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 :

Conversion ou boucle ?


Sujet :

C++

  1. #1
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut Conversion ou boucle ?
    Bonjours,
    Je recontre actuellement un probléme, mais je ne sais pas d'ou il vien, et ducou je ne pense pas savoir le résoudre, voici les partis de mon programmes concerné:
    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
     
        string line;
        size_t size = line.size() + 1;
        char nomcomplet[100];
     
    ifstream fichier("Test.txt", ios::in);
     do
        {
            getline(fichier , line);
            nombre_de_ligne++;
     
        }
        while(nombre_de_ligne == 3);
    strncpy( nomcomplet, line.c_str(), size );
     
    //plus loin :
     
        texte = TTF_RenderText_Blended(police, nomcomplet, couleurNoire);
        position.x = 45;                                                   
        position.y = 120;                                               
        SDL_BlitSurface(texte, NULL, ecran, &position);
    En fait mon "nomcomplet", ne s'afiche pas sur la fenétre SDL.
    Merci pour vos réponses.

  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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    outre le titre des plus explicites, l'énoncé du problème est également si clair, que la seule réponse qui me vient à l'esprit est : obi-wan kenobi. Mais 42 et Kamoulox sont également des réponses acceptables amha.

    Btw,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
        {
            getline(fichier , line);
            nombre_de_ligne++;
     
        }
        while(nombre_de_ligne == 3);
    Cette boucle a certainement aucun sens.

    Tu es en C++, tu as une string et... un char[] derrière, ainsi qu'un strcpy.
    Utilise des string bon sang ! Tu fais uniquement un appel à c_str quand la méthode nécessite un const char*, pas avant.
    size vaut en tout et pour tout 1, donc copier 1 caractère est assez limité.
    le char[] n'est pas initialisé, gros crash en perspective.

    En plus de blitter sur l'écran, dont on ne sait rien sur l'initialisation (double buffer, .. ?), il faut généralement faire un flip de celui-ci pour l'afficher réellement.

    Conclusion:
    - revoir la grammaire de base du langage
    - revoir l'utilisation de base de SDL
    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
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Comme je l'ai dis, c'est une partie de mon code, ma fenetre sdl n'est pas si vide alors le flip arrive bien plus tard, de plus utiliser des string en sdl sert juste a vérifier le bon fonctionnement du débuger qui vas t'afficher des erreurs. J'utilise des char[] pour les autres texte, et sa fonctionnes parfaitement. La boucle me sert a récupérer la ligne de mon fichier qui m'intéraisse.

    Je suis daccord sur le fait que ma demande n'est pas trés explicite.
    Merci quand méme pour ta réponse.

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Progmeur Voir le message
    Comme je l'ai dis, c'est une partie de mon code, ma fenetre sdl n'est pas si vide alors le flip arrive bien plus tard, de plus utiliser des string en sdl sert juste a vérifier le bon fonctionnement du débuger qui vas t'afficher des erreurs. J'utilise des char[] pour les autres texte, et sa fonctionnes parfaitement. La boucle me sert a récupérer la ligne de mon fichier qui m'intéraisse.

    Je suis daccord sur le fait que ma demande n'est pas trés explicite.
    Merci quand méme pour ta réponse.
    La boucle : elle ne marche pas. Si nombre_de_ligne ne vaut pas 2 en entrant dans la boucle, alors la valeur n'atteint jamais 3, et du coup, tu sors immédiatement de la boucle.

    Ce que tu veux certainement, c'est le test inverse: nombre_de_ligne != 3
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Oui sans doute, mais en fait sa ne change rien au niveau du rendue, rien ne s'affiche, alors c'est surrement la conversion du string en char qui ne vas pas, cependant sachant ceci, j'ai essayer le résoudre le probléme avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char* nomcomplet = line.c_str();
    Mais toujours pareil, rien ne s'affiche hélas, ce qui est sur c'est que le probléme ne vient pas de ma fenétre SDL car lorsque j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char nomcomplet[100]
    fichier>>osef>>osef>>nomcomplet;
    Sa s'affiche. Mais nomcomplet peut étre sur plusieur mots et je ne sais pas toujours combien c'est variable, c'est pourquoi j'utilise getline, mais pour getline il faut utiliser un string qu'on ne peut pas utiliser avec SDL_ttf, d'ou la conversion mais voilà s'a ne s'affiche pas.
    Merci

  6. #6
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Oui sans doute, mais en fait sa ne change rien au niveau du rendue
    Comme te l'on bien expliqué Bousk et Mr Deloget, si tu rentres dans une boucle infinie ça peut "changer" ton rendu !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(nombre_de_ligne == 3);
    Indique "tant que nombre_de_ligne est égale à 3"
    #trait sur d’erreur :S

  7. #7
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    Effectivement si c'est une boucle infinie alors forcément, ma page vas bien m'afficher une ligne, mais une ligne d'espace... Merci pour vos réponses.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    Bonjour,
    Comme te l'on bien expliqué Bousk et Mr Deloget, si tu rentres dans une boucle infinie ça peut "changer" ton rendu !
    En l'occurence, c'est justement le contraire, on va sortir de la boucle immédiatement. Sauf, bien sûr, si nombre_de_ligne == 2 avant d'entrer dans le do-while, dans ce cas, en sortant de la boucle on aura nombre_de_ligne == 4.

  9. #9
    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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Après relecture, je pense avoir donné la réponse dans mon premier post. L'as-tu lu ?
    Citation Envoyé par Progmeur Voir le message
    c'est surrement la conversion du string en char qui ne vas pas,
    size vaut en tout et pour tout 1, donc copier 1 caractère est assez limité.
    Oui, copier 1 caractère revient souvent à créer une chaîne vide.. chaîne qui ne s'affiche pas des masses.
    Citation Envoyé par Progmeur Voir le message
    un string qu'on ne peut pas utiliser avec SDL_ttf, d'ou la conversion mais voilà s'a ne s'affiche pas.
    Utilise des string bon sang ! Tu fais uniquement un appel à c_str quand la méthode nécessite un const char*, pas avant.
    Et certainement pas déclarer un tableau de taille fixe ou pas pour y appeler strcpy.


    Citation Envoyé par Progmeur Voir le message
    En fait mon "nomcomplet", ne s'afiche pas sur la fenétre SDL.
    Il s'affiche peut-être en fait, mais puisqu'il fait 1 caractère de long.. pour peu qu'il s'agisse d'un espace.
    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.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Voilà, tu as énervé Bousk... t'es content ?

    Bon on va aller droit au but...
    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
    string line;
     
    ifstream fichier("Test.txt", ios::in);
    do {
        getline(fichier , line);
        nombre_de_ligne++;
    } while(nombre_de_ligne < 3);
     
     
    //plus loin :
     
    texte = TTF_RenderText_Blended(police, line.c_str(), couleurNoire);
    position.x = 45;                                                   
    position.y = 120;                                               
    SDL_BlitSurface(texte, NULL, ecran, &position);
    J'ai enlevé le strncopy, mais tout dépend de ce qui est fait dans "//plus loin" si tu dois accéder à line.c_str() plusieurs fois, alors nomcomplet peut avoir son intérêt... à condition de placer size_t size = line.size() + 1; APRES le while

  11. #11
    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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par GeantVert13 Voir le message
    J'ai enlevé le strncopy, mais tout dépend de ce qui est fait dans "//plus loin" si tu dois accéder à line.c_str() plusieurs fois, alors nomcomplet peut avoir son intérêt...
    Même là, son intérêt est nul. Appeler plusieurs fois c_str ne sera pas spécialement lourd.
    "au pire", const char* pStr = line.c_str(); suffira plus qu'amplement. Nul besoin de posséder une copie de la chaîne. Et si on veut vraiment une copie... std::string copie = line;
    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.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Même là, son intérêt est nul. Appeler plusieurs fois c_str ne sera pas spécialement lourd.
    "au pire", const char* pStr = line.c_str(); suffira plus qu'amplement. Nul besoin de posséder une copie de la chaîne. Et si on veut vraiment une copie... std::string copie = line;
    Je pensais plutôt à d'autres appels à des fonctions de SDL (que je ne connaîs pas) ou d'une autre lib... et qui pourraient, éventuellement, avoir besoin de modifier la chaîne.

  13. #13
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    OK, alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* pStr = line.c_str();
    même si ç’a revient exactement au même que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char* nomcomplet = line.c_str();
    je l'ai tester et je confirme ce que je pensais, sa change rien.
    je ne voie pas pourquoi ma boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    do
        {
            getline(fichier, line);
            compteur++;
        }
        while(nombre_de_ligne < 4);
    serai un problème vue que lorsque je laisse getline tout seul, la 1ére ligne de mon fichier texte ne s'affiche pas.
    C'est donc la conversion le problème.
    Ne serait il pas possible de faire une conversion de string avec un sprintf ?

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    As-tu le moyen de faire un simple std::cout << line << std::endl; ? juste pour faire un affichage sur la console, histoire de voir s'il n'y a pas un problème avec ton fichier, ou la lecture de ton fichier. D’ailleurs que se passe-t-il si ton fichier à moins de 4 lignes ?

  15. #15
    Membre éclairé

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Points : 877
    Points
    877
    Billets dans le blog
    1
    Par défaut
    Cela devrait peut être ressembler à ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int nombre_de_ligne(1);//Est il bien initialisé à un ?
    string ligne;
    ifstream fichier("Test.txt");
     
    while(nombre_de_ligne < 3)  {
           getline(fichier , ligne);
           nombre_de_ligne++;
    }
     const char * lineChar = ligne.c_str();//const char !

  16. #16
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    c'est a dire que le fichier texte a 4 ligne pour le moment, j'arrive a chopé et affiché les 3 première car, sur celles si, il n'y as qu'un mot par ligne, j'utilise donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichier>>mots1>>mots2>>mots3;
    donc aucun problème de fichier vue que j'affiche ces 3 lignes sans difficultés.
    Et mon : nombre_de_ligne ,est bien initialisé a 1.

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    et si tu ne mets qu'un seul mot sur la ligne 4 ça marche ?
    as-tu essayé l'affichage simple sur la console ?
    Pour te prouver que la "conversion" c_str marche tu peux également afficher nomcomplet.

  18. #18
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    si je ne met qu'un seul mots je ferais comme pour les autres ligne mais ce n'est pas le but, voie tu mon programme doit affiché des numéro et des nom d'entreprise, aucune difficultés pour les numéro (il n'y a pas d'espace), mais pour les noms d'entreprise qui sont souvent des noms composés sa devient plus compliqué. Et sur console d'application, sa ne vas servir a rien et comme je suis en sdl, je ne peut même pas m'en servir pour des test.

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Points : 258
    Points
    258
    Par défaut
    Peux tu poster un exemple de fichier que tu essais de lire ?

  20. #20
    En attente de confirmation mail
    Homme Profil pro
    Stagiaire\Lycéen
    Inscrit en
    Mars 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Stagiaire\Lycéen

    Informations forums :
    Inscription : Mars 2013
    Messages : 61
    Points : 13
    Points
    13
    Par défaut
    oui , quand tu ouvre le fichier, sa t'affiche sa:

    numéro
    numéro2
    numéro3
    nom nom


    voilà, c'est simple mais c'est un fichier de test.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. conversion boucle en operations vectoriel
    Par studentTun dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 11/03/2013, 17h43
  2. Conversion d'une boucle DO à l'ancienne
    Par TheOyoStyledMan dans le forum Fortran
    Réponses: 9
    Dernier message: 04/09/2012, 19h03
  3. [JSTL] boucle forEach et conversion bytes[] / String
    Par jymmy dans le forum Taglibs
    Réponses: 4
    Dernier message: 05/05/2009, 09h39
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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