2015-09-21 3 views
0

У меня возникла ошибка «Ошибка сегментации 11» со следующим кодом: Я создал поток, который дает в параметрах struct.Ошибка сегментации 11 программа потока

Я думаю, что проблема заключается в объявлении функции *MARIT.

Извините за мой плохой английский Я французский.

struct parametres { 
     double *T; 
int N; //taille 
}; 

void *MARIT(struct parametres parametres) 
{ 
int *somme =0; 
float *moyenne = 0; 
int i; 
for(i = 0; i < parametres.N; i++) 
*somme = *somme + parametres.T[i]; 
printf("somme : %d",somme); 
*moyenne = (*somme/(parametres.N+0.0)); 
pthread_exit(moyenne); 
}` 


int main(int argc, char* argv[]) 
{ 
float temps; 
clock_t t1, t2; 
t1 = clock(); 
struct parametres params; 
printf("Salut à toi !\n"); 
printf("Donnez la taille du tableau :"); 
scanf("%d", &params.N); 
params.T = malloc(params.N * sizeof(double)); 
int i = 0; 
int nombre_aleatoire = 0; 
for(i=0; i<params.N; i++){ 
nombre_aleatoire =  (rand() % 1000) + 1; 
params.T[i]=nombre_aleatoire; 
} 
pthread_t arith,quadrat,cubi; 
if(pthread_create(&arith, NULL, MARIT, (void*)&params) != 0) 
{ 
perror("pthread_create"); 
exit(1); 
} 
double *result=0; 
pthread_join(arith, (void**)&result); 
printf("le resultat du thread : %f",result); 

return 0; 
} 

Я не знаю, в чем проблема.

+1

'недействительными * MARIT (структура параметров параметры) {' ​​'-> недействительным * Марит (недействительными * данные) {структура параметров параметры = * данные; '. Также удалите все звездочки ('*') перед 'somme' и' moyenne'. –

+0

Предупреждение: несовместимые типы указателей, передающих 'void * (struct paramètres)' to paramètre типа 'void * (*) (void *)' В строке "pthread_create" – FlorianSL

+0

Прохладный Парень, есть ошибка: инициализация 'struct parameter' выражение несовместимого типа 'void' Спасибо – FlorianSL

ответ

1

Есть пара проблем с вашим кодом.

Во-первых, подпись MARIT. Он должен принять параметр sinlge void*.

Во-вторых,и moyenne объявлены как указатели, но вы не выделяете для них никакой памяти. Это то, что вызывает segfault.

В-третьих, возвращаемое значение должно быть указателем на пустоту. Это означает, что он должен иметь размер указателя, а значение, на которое оно указывает, должно сохраняться после вызова (возврат адреса автоматической переменной внутри MARIT - это не нормально).

В-четвертых, main ожидает возвращения к двойному обозначению, поэтому измените тип moyenne.

Закрепление все три вопроса можно было бы сделать так:

void *MARIT(void *param) 
{ 
    struct parametres *parametres = (struct parametres*)param; 
    int somme =0; 
    double moyenne = 0, *ret; 
    int i; 
    for(i = 0; i < parametres->N; i++) 
     somme = somme + parametres->T[i]; 
    printf("somme : %d",somme); 
    moyenne = (somme/(parametres->N+0.0)); 
    ret = malloc(sizeof ret); 
    *ret = moyenne; 
    pthread_exit(ret); 
} 

Обратите внимание, что, когда функция main производится обработка значение Retrun должно free его. В этом случае, когда программа заканчивается сразу же, освобождение памяти действительно не требуется.

Кроме того, необходимо изменить Printf в main:

printf("le resultat du thread : %f", *result); 
+0

Спасибо, теперь он работает, но поток не возвращает прекрасный ответ для среднего, он всегда возвращает 0 – FlorianSL

+0

@FlorianSL Добавлено исправление 4-й проблемы в 'MARIT' (тип' moyenne' должен соответствовать типу 'result' в' main'). Кроме того, небольшое изменение в 'printf' в' main'. –

+0

Ницца, все работает сейчас. Спасибо! – FlorianSL

0
int *somme =0; 

... 

*somme = ... // segmentation fault here 

потому что вы указали somme в качестве указателя (указатель NULL кроме того) в неориентированную память. Решение: int somme = 0;

То же самое относится к varible Moyenne: float moyenne = 0;

0
> SYNOPSIS 
>  #include <pthread.h> 
> 
>  int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
>       void *(*start_routine) (void *), void *arg); 

ваша функция должна иметь подпись, как

void * start_routine (void *); 

момент, что неправильно почти все неопределенное поведение. , и вы должны всегда выделять память указателю перед выполнением операций в пространстве, на которые они указывают на * somme и * moyenne сбой по той же причине. Хотя я совершенно не осведомлен о вашем выборе использования указателей вместо обычных переменных.

void *MARIT(void *arg) // change <--here 
     { 
      struct parametres *parametres = (struct parametres *) arg; // change <--here 
      int *somme = malloc(sizeof(int)); // change <-- here 
      float *moyenne = malloc(sizeof(float)); // change <-- here 

      int i; 
      for(i = 0; i < parametres->N; i++) // change <--here 
       *somme = *somme + parametres->T[i]; // change <--here 
      printf("somme : %d",somme); 
      *moyenne = (*somme/(parametres->N+0.0)); // change <--here 
      pthread_exit(moyenne); 
     }` 
+0

Спасибо, теперь он работает, но поток не возвращает правильный ответ для среднего, он всегда возвращается 0 – FlorianSL

Смежные вопросы