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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    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 confirmé
    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 : 39
    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
    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 chevronné 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
    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.

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    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 chevronné 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
    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 ?

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    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;
    }

+ 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