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 :

erreur de segmentation


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut erreur de segmentation
    Bonjour,
    j'ai une erreur de segmentation quand je compile :
    - je suis débutant en C.
    - j'utilise un thread selon ce simple et court exemple : http://www.yolinux.com/TUTORIALS/Lin...ixThreads.html
    - je veux passer en param la structure thread_handle_t

    Ma question :
    - est ce que c'est la bonne manière d'écrire l'argument de ask_for_login :
    thread_handle_t *th;
    pthread_create(&thread_lp, NULL, ask_for_login,(void *)th)
    - est ce que j'aurai du déclarer une structure au lieu d'un pointeur vers une structure, cad :
    thread_handle_t th;

    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
     
    void* ask_for_login(void* data) {
        thread_handle_t *th;
        th = (thread_handle_t *)data;
     
      while((*th->use_lp == 0) && (*th->use_sc == 0)){
          printf("ask_for_login...\n");
          login = getchar();
          *th->use_lp = 1;
       }   
      pthread_exit(NULL);
      return  NULL;
    }
     
     
     
    int main (void) { 
     
      pthread_t thread_lp;
      void* status;
      int cpt = 0;
     
      thread_handle_t *th;
      *th->use_sc = 0;
      *th->use_lp = 0;
     
      printf("veuillez inserer votre carte ou entrer votre login\n");
     
     /* On attend que l'user entre son login */
      if (pthread_create(&thread_lp, NULL, ask_for_login,(void *)th)) { 
        perror("pthread_create"); 
        printf("erreur : pthread_create\n");
        exit(EXIT_FAILURE); 
      }
     
        while((*th->use_lp == 0) && (*th->use_sc == 0)){
          printf("j'attend l'insertion d'une carte...\n");
          sleep(1);
          cpt ++;
          if(cpt == 6){
    	*th->use_sc = 1;
    	//pthread_kill(thread_lp, 1);
          }
        }
     
        if(*th->use_sc == 1){
          //tuer thread_L;
          printf("Carte inseree, bonjour Aro. Veuillez entrer votre code PIN :\n");
          sleep(3);
        }
        else{
          printf("Veuillez entrer votre mot de passe\n");
          sleep(3);
        }
     
        printf("Authentification terminee\n");
        return (EXIT_SUCCESS);
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Code ikuzar : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    thread_handle_t *th;
    *th->use_sc = 0;
    *th->use_lp = 0;

    Attention tu ne peux pas déréférencer un pointeur non initialisé, de plus je vois un peu partout ceci :
    Code ikuzar : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *th->use_lp
    *th->use_sc

    j'ai un gros doute, peux-tu nous montrer ta structure thread_handle_t, car ici tu supposes que use_sc et use_lp sont des pointeurs et vu ton initialisation en début de main je pense que ce n'est pas le cas et donc il faut virer l'étoile, bref voilà ce que j'obtiens en sortie :

    veuillez inserer votre carte ou entrer votre login
    ask_for_login...
    j'attend l'insertion d'une carte...
    j'attend l'insertion d'une carte...
    j'attend l'insertion d'une carte...
    j'attend l'insertion d'une carte...
    j'attend l'insertion d'une carte...
    j'attend l'insertion d'une carte...
    Carte inseree, bonjour Aro. Veuillez entrer votre code PIN :
    Authentification terminee

    Appuyez sur ENTRÉE ou tapez une commande pour continuer

  3. #3
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    j'ai modifié mon programme : use_lp et use_sc ne sont plus des pointeurs.
    voici le code :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct pam_handle pam_handle_t;
    typedef struct thread_handle thread_handle_t;
     
    struct thread_handle{
      unsigned int use_lp;
      unsigned int use_sc;
    };
    puis j'ai modifié le programme :
    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
     
    void* ask_for_login(void* data) {
      printf("debut ask_for_login\n");
      thread_handle_t *th;
      th = (thread_handle_t *) data;
     
      while(((*th).use_lp == 0) && ((*th).use_sc == 0)){
        printf("ask_for_login...\n");
        login = getchar();
        (*th).use_lp = 1;
      }   
     
      printf("fin ask_for_login\n");
      pthread_exit(NULL);
      return  NULL;
    }
     
     
     
    int main (void) { 
     
      pthread_t thread_lp;
      void* status;
      int cpt = 0;
     
      thread_handle_t *th;
      (*th).use_sc = 0;
      (*th).use_lp = 0;
      //(*th)->thread_pamh = NULL;
      printf("veuillez inserer votre carte ou entrer votre login\n");
     
     /* On attend que l'user entre son login */
      if (pthread_create(&thread_lp, NULL, ask_for_login,(void *)th)) { 
        perror("pthread_create"); 
        printf("erreur : pthread_create\n");
        exit(EXIT_FAILURE); 
      }
     
      /* On attend qu'une carte soit inseree */
        sleep(5);
     
        while(((*th).use_lp == 0) && ((*th).use_sc == 0)){
          printf("j'attend l'insertion d'une carte...\n");
          sleep(1);
          cpt ++;
          if(cpt == 6){
    	(*th).use_sc = 1;
    	//pthread_kill(thread_lp, 1);
          }
        }
     
        if((*th).use_sc == 1){
          //tuer thread_L;
          printf("Carte inseree, bonjour Aro. Veuillez entrer votre code PIN :\n");
          sleep(3);
        }
        else{
          printf("Veuillez entrer votre mot de passe\n");
          sleep(3);
        }
     
        printf("Authentification terminee\n");
        return (EXIT_SUCCESS);
    }
    Mais j'ai toujours cette erreur de segmentation.
    peux tu me montrer la modification que t'a faite pour obtenir le résultat que t'a montré.
    Merci d'avance.

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par ikuzar Voir le message
    Mais j'ai toujours cette erreur de segmentation.
    peux tu me montrer la modification que t'a faite pour obtenir le résultat que t'a montré.
    Merci d'avance.
    Citation Envoyé par ssmario2 Voir le message
    j'ai un gros doute, peux-tu nous montrer ta structure thread_handle_t, car ici tu supposes que use_sc et use_lp sont des pointeurs et vu ton initialisation en début de main je pense que ce n'est pas le cas et donc il faut virer l'étoile, bref voilà ce que j'obtiens en sortie :
    En gros, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      thread_handle_t *th;
      (*th).use_sc = 0;
      (*th).use_lp = 0;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      thread_handle_t th;
      th.use_sc = 0;
      th.use_lp = 0;
    Et adapter le reste en conséquence.

  5. #5
    Membre éclairé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Par défaut
    Ok. ca marche maintenant.
    Merci

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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