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 segmentation en C sous Linux


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut Erreur segmentation en C sous Linux
    Bonjour,
    J'ai un soucis avec un programme:
    Dans le cadre d'un TP, je dois réaliser un programme en C sous linux centOS. Ce programme doit exécuter deux threads. Chaque thread traite la moitié d'un tableau en multipliant cette moitié par lui même puis effectue le tri.
    Mon programme (Voir ci-dessous) se compile correctement mais au moment de l'exécution j'ai le message:"Erreur segmentation"
    Je suis passé par gdb pour déburguer mon programme et le résultat est le suivant:
    Program received signal SIGSEGV, Segmentation fault.
    0x08048846 in main (ac=<value optimized out>, av=<value optimized out>) at td1.c:71
    71 tab1->debut=0;
    je sais pas trop quel est mon erreur. si quelqu'un pouvait me clairer. Merci
    Voici mon 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
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
     
    #define N 14
    static pthread_rwlock_t verrou=PTHREAD_RWLOCK_INITIALIZER; //permet l'exclusion mutuelle
    static int tab[N]={7, 4, 3, 12, 20, 9, 15, 31, 25, 19, 28, 40, 47,39};
    static int i;
     
    struct borne {
    	int debut;
    	int fin;
    	};
     
    struct borne *tab1;
    struct borne *tab2;
     
    //fonction Multiplier exécuté par les deux threads
    void *multi (void * para)
    {
    			tab1=(struct borne *) para;
    			int n=0;
    			sleep(5);
     			pthread_rwlock_rdlock (&verrou);
    			for (i=tab1->debut;i<=tab1->fin;i++){
    				n=tab[i];
    				tab[i]=n*n;
    				printf ("Nouvelle valeur à la position %d du tableau: %d * %d = %d\n",i, n, n, tab[i]);
    				}
    			pthread_rwlock_unlock (&verrou);
    			pthread_exit (0);
    			}
     
    //fonction Trier exécuté par les deux threads
    void *trier (void * para)
    {
    			tab2=(struct borne *) para;
    			int a=0;
    			int changement=1;
    			sleep(5);
     			pthread_rwlock_rdlock (&verrou);
    			while(changement>0){      //tant qu'il ya des valeurs à échanger
    					changement=0;               // on réinitialise changement quand la boucle repart
    					for(i=tab2->debut;i<=tab2->fin;i++){               
    						if(tab[i+1]<tab[i]){                 //on compare chaque élément à son voisin
    							a=tab[i];                           //on les interverti si nécessaire
    							tab[i+1]=tab[i];
    							a=tab[i];
    							changement++;               //on signale qu'il ya eu un changement
    							}
    						}
    					}
    			a=0;
    			printf ("Voici la mmoitié du tableau trié: \n");
    			for (a=tab2->debut;a<=tab2->fin;a++)
    				printf ("N°: %d = %d\n", a, tab2[a]);
    			pthread_rwlock_unlock (&verrou);
    			pthread_exit (0);
    				}
     
    main (int ac, char **av)
    			{
      			//déclaration des threads
      			pthread_t t1, t2;
      			void *attente;
      			i=0;
     			//initilaisation du verrou
     			// pthread_rwlock_init (&verrou, PTHREAD_RWLOCK_INITIALIZER);
     
    			//creation du thread 1
    			tab1->debut=0;
    			tab1->fin=6;
     
    			if (pthread_create (&t1, NULL, multi, (void *) tab1) < 0) {
        			fprintf (stderr, "erreur lors de la creation du thread 1\n");
        			exit (1);
      			}
     
    			if (pthread_create (&t1, NULL, trier, (void *) tab1) < 0) {
        			fprintf (stderr, "erreur lors de la creation du thread 1\n");
        			exit (1);
      			}
     
    			//creation du thread 2
    			tab2->debut=7;
    			tab2->fin=13;
     
    			if (pthread_create (&t1, NULL, multi, (void *) tab2) < 0) {
        			fprintf (stderr, "erreur lors de la creation du thread 1\n");
        			exit (1);
      			}
     
    			if (pthread_create (&t1, NULL, trier, (void *) tab2) < 0) {
        			fprintf (stderr, "erreur lors de la creation du thread 1\n");
        			exit (1);
      			}
     
    			//attente de la fin du thread 1
      			(void)pthread_join (t1, &attente);
      			//attente de la fin du thread 2
    			(void)pthread_join (t2, &attente);
    }

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    tab1 est un pointeur et n'est pas alloué en mémoire, d'où le segfault (pareil pour tab2). Si j'ai bien compris, tu cherche à faire un tableau dynamique de bornes ? Dans ce cas soit tu fait des listes chaînées, soit tu utilises les fonctions du type malloc et du coup à l’initialisation du premier thread tu débute à l'indice 0 du tableau comme dans cet exemple :

    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
    [idriss@hp-dv6:~]$ cat test.c
    #include <stdio.h>
    #include <stdlib.h>
    #define N 1
     
    struct borne {
        int debut;
        int fin;
    };
     
    int main(void){
        struct borne *tab;
        tab = malloc(sizeof(struct borne) * N);
        tab[0].debut = 10;
        printf("%d\n", tab[0].debut);
        return EXIT_SUCCESS;
    }
    [idriss@hp-dv6:~]$ gcc test.c -Wall -Wextra
    [idriss@hp-dv6:~]$ ./a.out 
    10
    Autres petites remarques pas bien méchantes au passages :
    - main est de type int donc renvoie un int (il est plus rigoureux au passage de typer le prototype même si int est le type par défaut) : EXIT_SUCCESS ou 0 en cas de succès, EXIT_FAILURE ou 1 en cas d’échec;
    - si les paramètres de la fonction main ne sont pas utiles au programme, il est préférable d'utiliser le prototype int main(void).

    Cordialement,
    Idriss

  3. #3
    Membre averti
    Homme Profil pro
    securité
    Inscrit en
    Avril 2013
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 18
    Par défaut
    Je teste ca OK.Idriss et je te tiens au courant.
    Merci

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/05/2010, 16h17
  2. Comment gérer les erreurs de la compilation sous linux ?
    Par petitclem dans le forum Autres éditeurs
    Réponses: 15
    Dernier message: 01/08/2008, 15h53
  3. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  4. erreur a la compilation sous linux
    Par superC dans le forum wxWidgets
    Réponses: 40
    Dernier message: 10/03/2007, 12h54
  5. Réponses: 4
    Dernier message: 27/08/2003, 21h34

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