Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme de structure

Sujet résolu
    23 novembre 2007 à 20:00:38

    salut

    je suis en train de coder un client qui doit entrer en contact avec un serveur via un thread, cependant lorsque je lance mon client il m'indique l'erreur : client.exe a rencontré une erreur et doit fermé.

    Lorsque je lance le debug il m'indique une erreur de segmentation cependant je ne comprend pas pourquoi

    Voici les codes

    fonction thread :
    1. DWORD WINAPI fonction_thread(void* x)
    2. {
    3.       EnterCriticalSection(&Sync);
    4.       thread_param param;
    5.       bool continuer = false;
    6.       if( x!= NULL)
    7.       {
    8.              struct thread_param *params = reinterpret_cast<struct thread_param *>(x);
    9.              param.position = params->position;
    10.              param.activer = false;
    11.       }
    12.       else
    13.       {
    14.           continuer = false;
    15.       }
    16.       SOCKET sock_env;
    17.       SOCKADDR_IN sin_env;
    18.       sock_env = socket(AF_INET, SOCK_STREAM, 0);//creation de la socket
    19.       sin_env.sin_addr.s_addr =    inet_addr("127.0.0.1");//initialisation des parametres
    20.       sin_env.sin_family =         AF_INET;
    21.       sin_env.sin_port =           htons(5000);
    22.       LeaveCriticalSection(&Sync);
    23.       int pre_message;
    24.       char message[5] ="";
    25.       EnterCriticalSection(&Sync);
    26.       if(connect(sock_env, (SOCKADDR *)&sin_env, sizeof(sin_env))!= SOCKET_ERROR)
    27.       {
    28.              send(sock_env,message, sizeof(message),0);
    29.              *param.activer = true;//le compilo m'indique une erreur de fragmentation ici
    30.              continuer = true;
    31.       }
    32.       LeaveCriticalSection(&Sync);
    33.       while(continuer)
    34.       {
    35.              EnterCriticalSection(&Sync);
    36.              creermessage(*param.position, message);
    37.              LeaveCriticalSection(&Sync);
    38.              send(sock_env,message, sizeof(message),0);
    39.              if(*param.activer == false)
    40.              {
    41.                      continuer = false;
    42.              }
    43.              Sleep(50);
    44.       }
    45.       send(sock_env,"sp", sizeof("sp"),0);//envoie
    46.       closesocket(sock_env);
    47. }


    voici la création et la structure thread param
    1. struct thread_param{
    2.        SDL_Rect *position;
    3.        bool *activer;
    4. };
    5. [...]
    6. bool activer = false;
    7.     thread_param x;
    8.     x.activer =&activer;
    9.     x.position = &posobjet;


    Voilà tout merci d'avance à ceux qui prendront le tmeps de lire et de m'aider

    icare

    P.S : si vous avez besoin de plus de code dite le moi
    • Partager sur Facebook
    • Partager sur Twitter
      23 novembre 2007 à 20:31:27

      Citation : icare14

      1. // ...
      2.       if( x!= NULL)
      3.       {
      4.              // ...
      5.              param.activer = false; <----
      6.       }
      7.       // ...
      8.       *param.activer = true;//le compilo m'indique une erreur de fragmentation ici
      9.       //...


      voici donc ce que tu fais :

      1) affectation de la valeur du pointeur param.activer à false (0)
      2) accède à la valeur pointée par param qui vaut 0 (SEGFAULT!)

      il te manque ton opérateur de déréférencement devant la première ligne
      • Partager sur Facebook
      • Partager sur Twitter
        23 novembre 2007 à 20:33:28

        1. if( x!= NULL)
        2.       {
        3.              struct thread_param *params = reinterpret_cast<struct thread_param *>(x);
        4.              param.position = params->position;
        5.              *param.activer = false;
        6.       }


        J'ai modifié comme ci dessus (c'est bien comme ça qu'il faut modifier ?)

        mais maintenant l'erreur de segmentation s'est déplacée à cet endroit

        EDIT : j'ai trouvé en fait ça pointait sur rien donc j'ai mis :
        1. param.activer = params->activer;


        et ça a l'air de marcher

        • Partager sur Facebook
        • Partager sur Twitter
          23 novembre 2007 à 20:35:48

          normal ton pointeur n'est pas initialisé non plus
          1. param.activer = new bool( false );
          • Partager sur Facebook
          • Partager sur Twitter
            23 novembre 2007 à 20:42:26

            juste une dernière question : quelqu'un connaitrais un moyen d'attendre la fin d'execution d'un thread ?
            • Partager sur Facebook
            • Partager sur Twitter
              23 novembre 2007 à 20:50:22

              Windows : WaitForSingleObject, WaitForSingleObjectEx, WaitForMultipuleObjects

              sinon tu peux intégré ton thread dans une classe et avoir une méthode disant si le thread est vivant... il ne te reste qu'à faire un :

              1. while( thread.isAlive() )
              2.     Sleep( 1000 );

              • Partager sur Facebook
              • Partager sur Twitter
                23 novembre 2007 à 20:51:16

                ok merci beaucoup pour ta précieuse aide
                • Partager sur Facebook
                • Partager sur Twitter

                probleme de structure

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown