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 :

Problème avec std::cout


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Problème avec std::cout
    Bonjour,

    J'ai un problème avec une fonction qui récupère des données sur un socket et qui fait une boucle. Tout marche parfaitement quand il y a std::cout (ou printf) dans la boucle mais ça plante une fois sur 2 quand il n'y est pas :s. Je n'ai pourtant aucun warning. Qu'est ce qui peut déclencher ceci ? Voici mon code :

    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
    #include <iostream>
    using namespace std;
    #define order 8
    void printall(int arr[]);
    bool validity_check(int,int,int []);
    int main()
    {
            int nextjump[order];//Keeps track for every order what should be the pos. of next jump.
            for(int i=0;i<order;i++) nextjump[i]=0;
            int level=0;
            int position[order];
            mainloop:
            while(true)
            {
                    //cout<<"Entered the while loop"<<endl; //This is the line which can change the whole output when uncommented
                    for(int i=nextjump[level];i<order;i++)
                    {
                            if(validity_check(level,i,position))
                            {
                                    cout<<"Successful at level "<<level<<" using position "<<i<<endl;
                                    position[level]=i;
                                    nextjump[level++]=i+1;
    
    
                                    if(level==order)
                                    {
    
                                            printall(position);
                                            goto mainloop;
                                    }
    
                                    nextjump[level]=0;
                                    goto mainloop;
                            }
                    }
    
                    level-- ;
                    goto mainloop;
            }
            return 0;
    }
    
    bool validity_check(int level,int n, int current[])
    {
            for(int i=0;i<level;i++)
            {
                    if(current[i]==n) return false;
            }
            //Level 0 has always full validity.
            if((level>0)&&(level<order-1))
            {
                    if((current[level-1]==n)|(current[level+1]==n)) return false;
            }
            if(level==order-1)
            {
                    if(current[level-1]==n) return false;
            }
    
    }
    
    void printall(int current[])
    {
            for(int i=0;i<order;i++)
            {
                    cout<<current[i]<<endl;
            }
    }
    Merci

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    cout n'est pas vraiment le responsable. Dans ta fonction bool validity_check(int level,int n, int current[]), il y a juste des cas qui ne sont pas traités. Lorsqu'un de ces cas se produit, le code atteint la fin de la fonction or la fonction, dans un tel cas, ne spécifie pas de valeur de retour donc sa valeur de retour sera à priori imprévisible. Sur une architecture x86 32 bits, un return <valeur booléenne ou entière>; est traduit en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov eax, <la valeur à retourner>
    ret
    Si t'as bien compris, la valeur de retour d'une fonction, c'est juste la valeur courante de eax. Qui sait ce qu'il peut bien y avoir là-dedans si tu ne spécifies rien ...

  3. #3
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par Melem Voir le message
    Dans ta fonction bool validity_check(int level,int n, int current[]), il y a juste des cas qui ne sont pas traités.
    Si tel était le cas, il est pas censé avoir un warning ? Et puis, pourquoi le cout provoquerez un changement de comportement ?


    Bon, je connais pas ton socket, ni comment les données arrive dessus, mais il se peut que se soit un problème de synchro. Essaye de remplacer le cout par une mini attente (genre 10µs), voir si tu as le même résultat. Si oui, va falloir que tu creuse la synchro.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Merci pour vos réponses.

    Effectivement, quand je met un Sleep(10) juste après ma fonction recv tout marche.
    C'est bizarre je n'utilise pourtant pas de thread, qu'est ce qui peut bien provoquer ça ?

  5. #5
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Bon, j'ai pas trouvé d'opération sur ton socket dans ton code. Comment les données arrives dessus si ce n'est pas un autre thread ?
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    En fait, ce n'est pas mon code. C'est juste que j'ai le même type de problème, c'est-à-dire une boucle avec un std::cout dedans et quand j'enlève le cout ça bug.

    Voici, en gros, comment est mon code :
    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
     
    std::string Client::Receive()
    {
        char buffer[BUFFERSIZE];
        std::string retour;
        int  lu = 0;
        do
        {
            memset(buffer,0,sizeof(buffer));
            lu = recv(sockreceive,buffer,sizeof(buffer),0);
            retour += buffer
           std::cout<<"hello"<<std::endl;//tout marche quand je laisse ce cout ou que je met un Sleep(10)
     
        } while (lu == BUFFERSIZE);
        return retour;
    }

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Quand tu lis depuis une socket, ne t'attends pas nécessairement à ce qu'il y ait un message "entier". Par exemple, si tu attends la chaîne
    "abcdefghijklmnop"

    tu peux très bien te retrouver à lire uniquement "abcdefgh", parce que le reste n'est pas encore arrivé.

    Du coup, il te faut un format de message défini pour être sur que Receive renvoie bien un message complet. Je pense que ça marche avec le cout ou le sleep parce que ça ralentit ton programme, et que du coup, le système a le temps de recevoir le message complet depuis le client, et que recv reçoit tout. Mais c'est vraiment par chance que ça marche, et compte que ça plantera au moment où c'est le plus gênant.

    Il faut vraiment que tu aies, au choix, la longueur du message dans l'entête, ou un séparateur de messages, sinon, tu ne t'en sortiras jamais (message tronqués, concaténés, etc)

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    uhm, moui mais quand tu veux recevoir des réponses FTP tu fais comment ?
    Il n'y a pas d'en-tête ni de message de fin il me semble.

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Si tel était le cas, il est pas censé avoir un warning ?
    Si, mais son compilateur est sans doute moins verbeux que le mien ... D'ailleurs il est très simple de prouver qu'il y a des cas non traités, sans chercher à comprendre le programme : le comportement n'est pas le même quand tu mets return true; et return false; à la fin pourtant, si tous les cas sont considérés, cette instruction ne devrait jamais être exécutée.

    Et puis, pourquoi le cout provoquerait un changement de comportement ?
    Le code est trop mal écrit pour que ça me donne envie de creuser. En plus, l'auteur parle de sockets alors que je ne vois pas un seul dans le programme. Je préfère alors attendre que le problème soit bien expliqué ou ... résolu .

  10. #10
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Le programme n'était apparemment pas le sien... Je trouve cette technique fourbe, et ça aide pas en plus...


    HS : N'empêche que si le cout du code précédent change tout, alors ça c'est un vrai défi >< ! Peut-être assure t'il quelque chose dans eax >< !
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    ...

    Euh j'avais pas fait attention mais apparemment quelqu'un a modifié mon message à 1h01 -__-'

    Ce n'est PAS mon code, c'est juste que j'ai un problème SIMILAIRE
    voici d'où vient le code : http://www.daniweb.com/forums/thread113567.html#

    PS: message original (sauf les trucs en italique )

    Bonjour,

    J'ai le même problème que décrit là -> http://www.daniweb.com/forums/thread113567.html# (comprendre : le même type de problème)

    En gros mon code (le mien pas pas celui qui est dans le lien) est une fonction qui récupère des données sur un socket et qui fait une boucle.
    Donc tout marche parfaitement quand il y a std::cout (ou printf) dans la boucle mais ça plante une fois sur 2 quand il n'y est pas :s

    Mon code est trop long pour être afficher ici, mais je n'ai aucun warning. Qu'est ce qui peut déclencher ceci ?

    Merci

  12. #12
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par tir0nik Voir le message
    uhm, moui mais quand tu veux recevoir des réponses FTP tu fais comment ?
    Il n'y a pas d'en-tête ni de message de fin il me semble.
    Les requêtes et réponses FTP sont terminées par un retour chariot, non ? (plus très sûr, mais de mémoire c'est ça).

    Pour la connexion data, il me semble que la taille du fichier est donnée avant dans l'échange de commandes.

  13. #13
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Oui d'ailleurs le problème a été résolu sur le lien que tu mets... Avec l'explication qui va avec !

    Hum sinon, ben je connais pas trop le protocol FTP... Mais si tu ne connais pas la longueur de ce que tu attends, et qu'il n'y a pas de message de fin, je vois pas comment ça pourrait marcher >< !

    Si tu connais la taille, arrange toi avec la taille de ton buffer et setsockopt.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Lavock Voir le message
    Oui d'ailleurs le problème a été résolu sur le lien que tu mets... Avec l'explication qui va avec !

    Hum sinon, ben je connais pas trop le protocol FTP... Mais si tu ne connais pas la longueur de ce que tu attends, et qu'il n'y a pas de message de fin, je vois pas comment ça pourrait marcher >< !

    Si tu connais la taille, arrange toi avec la taille de ton buffer et setsockopt.
    Oui sur le lien ça a été résolu, en fait c'était le problème qui était le même, pas la source du problème.

    Enfin bref maintenant j'ai tout résolu, merci à tous.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/12/2007, 20h31
  2. Problème avec std::multiplies
    Par Bakura dans le forum SL & STL
    Réponses: 8
    Dernier message: 25/05/2007, 19h07
  3. problème avec std::cin
    Par _LVEB_ dans le forum SL & STL
    Réponses: 4
    Dernier message: 20/02/2007, 00h35
  4. Problème avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 4
    Dernier message: 31/12/2006, 14h27
  5. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18

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