Menu

Problème do while

Messages postés
38
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
17 mai 2019
-
Bonjour,

J'ai problème que si la condition de "do While" est présente le programme ne sort pas de cette boucle et il ne m'affiche pas le message après ce dernière. Voilà mon code :
Comptage *  iris_http_tcp_Counting_Passengers()
{// Initialize Winsock.

 //int i;
 char *DoorState1;
 char *DoorState2;
 char *DoorState3;
 char Value1[] ="SingleDoorClose";
 char Value2[] ="SingleDoorClose";
 char Value3[] ="SingleDoorClose";
 char recvbuf[1024] = "";
    int recvbuflen = DEFAULT_BUFLEN;
    struct sockaddr_in service;
    WSADATA wsaData;
    SOCKET ListenSocket;
    SOCKET AcceptSocket;
 char *reply = "HTTP/1.1 200 OK\nContent-Type: text/plain\nContent-Length: 12\n\nAll received";
  SYSTEMTIME st;
  char buffer[80];
  int count = 0;
  Comptage Count_Pass[512];
  char TagValue[100]= {0};
  char TagValue1[100]= {0};
  char TagValue2[100]= {0};
  char TagValue3[100]= {0};
  char Tag1[] = "Value";

  int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);

  if (iResult != NO_ERROR)

    LOG_INFO("Server: Error at WSAStartup().\n");

  else

    LOG_INFO("Server: WSAStartup() is OK.\n");






  // The sockaddr_in structure specifies the address family,

  // IP address, and port for the socket that is being bound.


  service.sin_family = AF_INET;

  service.sin_addr.s_addr = inet_addr("192.168.0.95");

  service.sin_port = htons(8080);


  
  // Create a SOCKET for listening for

  // incoming connection requests.

  ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  if (ListenSocket == INVALID_SOCKET)

  {

    LOG_INFO("Server: Error at socket(): %ld\n", WSAGetLastError());

    WSACleanup();

    return 0;

  }

  else

    LOG_INFO("Server: socket() is OK.\n");


  if (bind(ListenSocket, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR)

  {

    LOG_INFO("Server: bind() failed.\n");

    WSACleanup();

    return -1;

  }

  else

    LOG_INFO("Server: bind() is OK.\n");



   // Listen for incoming connection requests on the created socket
  if (listen(ListenSocket, 10) == SOCKET_ERROR)
  {
    LOG_INFO("Server: Error listening on socket.\n");
 WSACleanup();
 return -1;
  }

  else

    LOG_INFO("Server: listen() is OK.\n");



  // Create a SOCKET for accepting incoming requests.

  // Accept the connection if any...



 DoorState1 = iris_http_tcp_doorState1();
 DoorState2 = iris_http_tcp_doorState2();
 DoorState3 = iris_http_tcp_doorState3();
 LOG_INFO("DoorState1  =%s  DoorState2  =%s  DoorState3  =%s\n\n", DoorState1, DoorState2, DoorState3);
 do
 {
      AcceptSocket = accept(ListenSocket, (struct sockaddr*)&IRMAClient, &iIRMAClientLen);

            if (AcceptSocket == INVALID_SOCKET)

           {

                LOG_INFO("Server: accept() error %d\n", WSAGetLastError());

                WSACleanup();

                return -1;

            }

           else

              LOG_INFO("Server: accept() is OK.\n");

              LOG_INFO("Server: accepted connection from %s, port %d\n", inet_ntoa(IRMAClient.sin_addr), htons(IRMAClient.sin_port)) ;


        iResult = recv(AcceptSocket, recvbuf, 1024, 0);
  //time (&rawtime);
   //timeinfo = localtime (&rawtime);

  //strftime (buffer,80,"%Y%m%d-%X",timeinfo);

        if (iResult == SOCKET_ERROR)

              {

            LOG_INFO("Server: recv() failed: error %d\n", WSAGetLastError());

            closesocket(AcceptSocket);

            continue;

        }

       else

            LOG_INFO("Server: recv() is OK.\n");

  if (iResult == 0)

        {

            printf("Server: Client closed connection.\n");

            closesocket(AcceptSocket);

            continue;

        }
  GetLocalTime(&st);
  sprintf(Count_Pass[count].Heure, "%04d%02d%02d-%02d:%02d:%02d" ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
  GetXmlTagValue(recvbuf,"DoorID",Tag1,TagValue);
  GetXmlTagValue(recvbuf,"In",Tag1,TagValue1);
  GetXmlTagValue(recvbuf,"Out",Tag1,TagValue2);
  Count_Pass[count].ID = atoi(TagValue);
  Count_Pass[count].Nombre_Mont = atoi(TagValue1);
  Count_Pass[count].Nombre_Desc = atoi(TagValue2);
        LOG_INFO("Server: recvbuf = %s\n  Time = %s , ID= %d  Nombre de Montée=%d, Nombre de Desc=%d", recvbuf, Count_Pass[count].Heure, Count_Pass[count].ID, Count_Pass[count].Nombre_Mont, Count_Pass[count].Nombre_Desc);


 send(AcceptSocket, reply, strlen(reply), 0);
 LOG_INFO("%s\n",reply);
 closesocket(AcceptSocket);
 count++;
 continue;
}while (DoorState1 != Value1 && DoorState2 != Value2 && DoorState3 != Value3);
 LOG_INFO("DoorState1  =%s  DoorState2  =%s  DoorState3  =%s\n\n", DoorState1, DoorState2, DoorState3);
  return Count_Pass;
}


Avez-vous une idée pourquoi le message DoorState = etc ne s'apparait pas ? Malgré que quand les portes sont fermées dès le début il ne rentre pas dans le do while et il affiche le message mais au moment que les portes sont ouvertes je fais mes traitements et quand je ferme les portes il ne sort pas de la boucle.
Merci par avance de votre aide

Configuration: Windows / Chrome 73.0.3683.103
Afficher la suite 

Votre réponse

1 réponse

Messages postés
25570
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
21 mai 2019
1977
0
Merci
Bonjour,

Je ne programme pas en C ... mais....
A quel endroit, dans ta boucle, mets tu à jour les variables Valeur1, Valeur2, Valeur3 ?
A moins que ça ne soit les DoorState1 DoorState2 DoorState3 que tu ne remets pas à jour à l'intérieur de ta boucle...
Dans tous les cas, ces variables n'étant pas modifiées (DANS la boucle), elles ne validerons jamais ta condition WHILE

emmy_2019
Messages postés
38
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
17 mai 2019
> [Dal]
Messages postés
5103
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
20 mai 2019
-
oui c'est bien cela : Boucler tant une porte au moins est ouverte, et si elles sont toutes fermées, sortir de la boucle et afficher "all closed".
emmy_2019
Messages postés
38
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
17 mai 2019
> [Dal]
Messages postés
5103
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
20 mai 2019
-
Dal mon soucis que quand l'une de portes est ouverte cela se passe bien mais au moment que les portes se ferment il sort pas de la boucle penses-tu qu'il manque un "sleep"
voilà mon code
do
  {
    LOG_INFO("-------START--------\n");
    AcceptSocket = accept(ListenSocket, (struct sockaddr*)&IRMAClient, &iIRMAClientLen);

       if (AcceptSocket == INVALID_SOCKET)

         {

        LOG_INFO("Server: accept() error %d\n", WSAGetLastError());

        WSACleanup();

        return -1;

       }

         else

         LOG_INFO("Server: accept() is OK.\n");

         LOG_INFO("Server: accepted connection from %s, port %d\n", inet_ntoa(IRMAClient.sin_addr), htons(IRMAClient.sin_port)) ;
      
      iResult = recv(AcceptSocket, recvbuf, 1024, 0);
      //time (&rawtime);
       //timeinfo = localtime (&rawtime);

      //strftime (buffer,80,"%Y%m%d-%X",timeinfo);

      if (iResult == SOCKET_ERROR)

         {

       LOG_INFO("Server: recv() failed: error %d\n", WSAGetLastError());

       closesocket(AcceptSocket);


      }

      else if  (iResult == 0)

      {

       LOG_INFO("Server: Client closed connection.\n");

       closesocket(AcceptSocket);

      }
      else

       LOG_INFO("Server: recv() is OK.\n");

      GetLocalTime(&st);
      sprintf(Count_Pass[count].Heure, "%04d%02d%02d-%02d:%02d:%02d" ,st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
      GetXmlTagValue(recvbuf,"DoorID",Tag1,TagValue);
      GetXmlTagValue(recvbuf,"In",Tag1,TagValue1);
      GetXmlTagValue(recvbuf,"Out",Tag1,TagValue2);
      Count_Pass[count].ID = atoi(TagValue);
      Count_Pass[count].Nombre_Mont = atoi(TagValue1);
      Count_Pass[count].Nombre_Desc = atoi(TagValue2);

      LOG_INFO("Server:  Time = %s , ID= %d  Nombre de Montée=%d, Nombre de Desc=%d", Count_Pass[count].Heure, Count_Pass[count].ID, Count_Pass[count].Nombre_Mont, Count_Pass[count].Nombre_Desc);


     send(AcceptSocket, reply, strlen(reply), 0);
     //LOG_INFO("%s\n",reply);
     //LOG_INFO("DoorState1  =%s  DoorState2  =%s  DoorState3  =%s\n\n", DoorState1, DoorState2, DoorState3);
     closesocket(AcceptSocket);
     count++; 
     memcpy(count, count, 1);
     sleep(3);
    door1=get_door_state1();
    door2=get_door_state2();
    door3=get_door_state3();
    
  }while((door1 == 0 ) ||(door2 == 0 ) || (door2 == 0 ));
   LOG_INFO("count = %d", count);
  LOG_INFO("The doors are closed");


Je remercie par avance de ton retour
[Dal]
Messages postés
5103
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
20 mai 2019
937 -
C'est ce que fait le code que j'ai posté.

Dans la boucle, tu dois mettre à jour les valeurs de DoorState1, DoorState2 et DoorState3 en fonction de leur état avec la fonction qui va bien, et la condition de la boucle do/while ci-dessus sortira de la boucle lorsque toutes les portes seront fermées (en tenant pour acquis que les portes ne peuvent avoir que 2 états).
emmy_2019
Messages postés
38
Date d'inscription
mardi 23 avril 2019
Statut
Membre
Dernière intervention
17 mai 2019
> [Dal]
Messages postés
5103
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
20 mai 2019
-
Regardes stp mon dernier commentaire. J'ai fait comme tu l'as posté .
[Dal]
Messages postés
5103
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
20 mai 2019
937 -
Non, tu utilises une fonction get_door_state renvoyant un entier et tu compares cet entier à zéro en comparant à l'intérieur de la fonction les chaînes par rapport à "SingleDoorClosed", alors que mon code compare directement des chaînes par rapport à "SingleDoorOpen" comme tu le faisais le 2 mai...

... donc, comme ta fonction telle que tu l'as postée là https://www.commentcamarche.net/forum/affich-36003651-probleme-do-while#8 compare autre chose, il est naturel que tu aies un résultat différent.

C'est pour cela que je te disais le 3 mai qu'avec ton code du jour précédent, la condition que je proposais le 2 mai sort correctement de la boucle. Tu ne peux pas changer ton code et ensuite prétendre que ma condition de sortie (proposée par rapport à ton code précédent) ne fonctionne pas...

Entre nous, ce n'est bien sûr pas une mauvaise idée d'utiliser des fonctions pour simplifier ton code, mais si tu oublies en cours de route ce que tes fonctions doivent tester, ou ce qu'elles doivent retourner c'est quand même un problème.

Et si tu veux vraiment faire quelque chose d'efficace, tu pourrais nommer ta fonction sous forme de prédicat, comme par exemple
int is_door_opened(int num_door);
ou
int is_door_closed(int num_door);
(décide ce que tu veux tester) avec un nom explicite indiquant ce qu'elle fait selon ce que tu testes et clair quant à ce qu'elle retourne, obtenant en paramètre le numéro de porte à tester, et retournant 0 si le prédicat est faux et toute autre valeur si le prédicat est vrai, au lieu de faire 3 fonctions différentes, avec des noms prêtant à confusion.

Avec de telles fonctions, par exemple, tu peux écrire :

if (is_door_opened(3)) {
    /* do something when Door3 is opened */
}

et en lisant le code, on sait tout ce suite ce qu'il est sensé faire.
Commenter la réponse de jordane45