C-linux-debian undefined ссылка на функцию в многопоточной программе

Я получил сообщение об ошибке «неопределенная ссылка на функцию». Как я могу это решить? Сообщение об ошибке находится на изображении. Мы пытаемся сделать многопоточную программу сортировки.

Сначала необходимо создать серию из 800 элементов и случайное распределение распределений. Ценности элементов уникальны. Будут созданы три запланированных потока. Первый поток перечисляет первые 300 элементов, а второй поток перечисляет остальные 500 потоков. После того, как две заготовки завершили свою работу, они не нашли третью последовательность заготовок и последовательности второй строки. У нас есть новый набор для слияния. Значит, это нужно соединить. На последнем этапе перечисленные элементы следует перенести в файл с именем «son.txt», который будет создан в рабочем каталоге.

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define NUM_THREADS 3
    int sayilar[800];
    void *Sirala(void *param);
    void quickSort(int[], int, int);
    int partition(int[], int, int);
    int kontrol=0;

int main(int argc, char *argv[]){
int i,j;
    srand(time(NULL));
    for(i=0; i<800; i++){
        sayilar[i] = 1+ (rand() % 800);
        for(j=0; j<1; j++){
            if (sayilar[j]== sayilar[i]){
                i--;
                break;
                }
        }
    }

    pthread_t threads[NUM_THREADS];
    int rc;
    long t;
    for(t=0; t<3; t++){
        rc = threadcreate(&threads[t], NULL, Sirala, (void *)t);
        if (rc){
            printf("Hata, thread oluşturulamadı. Thread: %d\n", rc);
            exit(-1);       
        }
        pthread_join(threads[t], NULL);
    printf("\n\n");
    }
    printf("SON\n");
    for(i=0; i<800; i++)
        printf("%d\n", sayilar[i]);
    printf("/n/n");

    FILE *yaz; //dosya göstericisi
    yaz = fopen("son.txt", "w+");
    if (yaz == NULL){
        puts("Dosya acilmiyor");
        exit(1);
    }
    for(i=0; i<800; i++){
        fprintf(yaz, "%d\n", sayilar[i]);
    }
    fclose(yaz);

    pthread_exit(NULL);

void *Sirala(void *param){
    int i, baslangic, bitis;
    if ((long)param ==0){
        baslangic = 0;
        bitis= 300;
        kontrol =1; 
        printf("Dizinin ilk 300 elemanının sırasız hali:\n\n");
        for(i=baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        }
        printf("/n/n");
    }
    else if ((long)param ==1){
        baslangic = 300;
        bitis= 800;
        kontrol =2; 
        printf("Dizinin diğer 500 elemanının sırasız hali:\n\n");
        for(i=baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        } 
        printf("/n/n");
    }
    else {
        baslangic = 0;
        bitis= 800;
        kontrol =0;
    }
    for(i= baslangic; i<bitis; i++){
        quicksort(sayilar, baslangic, bitis-1);
    }   
    if (kontrol ==1){
    printf("Dizinin 300 elemanının sıralı hali:\n\n");
    for(i = baslangic; i<bitis; i++){
        printf("%d - ", sayilar[i]);
    }   
    }
    else if (kontrol ==2){
    printf("Dizinin diğer 500 elemanının sıralı hali:\n\n");
    for(i = baslangic; i<bitis; i++){
        printf("%d - ", sayilar[i]);
    }   
    }
    printf("\n\n");
    pthread_exit(0);
}

void quickSort(int a[], int sol, int sag){
    int j;
    if (sol<sag){
        j=partition(a,sol, sag);
        quickSort(a, sol, j-1);
        quickSort(a, j+1, sag); 
    }
}

int partition(int a[], int sol, int sag){
    int pivot, i, j, t;
    pivot = a[sol];
    i= sol;
    j= sag+1;
}
}

Сообщение об ошибке:

C-linux-debian undefined ссылка на функцию в многопоточной программе

Опечатки (C чувствителен к регистру) и правильное форматирование кода, другие проблемы должны выделяться, как только вы это сделаете.

Mat 23.05.2018 10:12

Пожалуйста, не отправляйте текстовую информацию как изображение. (Вместо этого скопируйте / вставьте его.)

Scheff's Cat 23.05.2018 10:13

Это ошибка компоновщика, она не имеет ничего общего с кодом потоковой передачи, поэтому, пожалуйста, сократите свой вопрос до минимальный пример. Кроме того, включите сообщение об ошибке в виде текста (прогноз в виде кода) и исправить ваш отступ, потому что, скорее всего, проблема заключается в неправильном креплении.

Frax 23.05.2018 10:21

Я не могу прочитать снимок экрана. Пожалуйста, разместите текст как текст.

alk 23.05.2018 10:26

Проверьте фигурные скобки. Ваши функции находятся внутри main()

qrdl 23.05.2018 11:24

Похоже, вы забыли включить хороший набор предупреждений. Для GCC я рекомендую как минимум -Wall -Wextra -Wwrite-strings; рассмотрите также -Wpedantic -Warray-bounds для выявления некоторых других распространенных ошибок.

Toby Speight 23.05.2018 12:45

Ничто из того, что вы говорите, не заставило меня решить. Я просил помощи, а не унижения.

user9389953 29.05.2018 16:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
112
2

Ответы 2

Функция, которую вы должны использовать для создания нового потока, - это pthread_create, а не threadcreate.

Обновлено: вы также забыли #include<pthread.h> и забыли закрыть основную функцию с помощью } в конце. Вы также написали quicksort, а функция - quickSort.

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

#include <stdio.h> 
#include <stdlib.h>    
#include <time.h>    
#include<pthread.h>
#define NUM_THREADS 3

int sayilar[800];

void *Sirala(void *param);

void quickSort(int[], int, int);

int partition(int[], int, int);

int kontrol=0;



int main(int argc, char *argv[]){

int i,j;

    srand(time(NULL));

    for(i=0; i<800; i++){

        sayilar[i] = 1+ (rand() % 800);

        for(j=0; j<1; j++){

            if (sayilar[j]== sayilar[i]){

                i--;

                break;

                }

        }

    }



    pthread_t threads[NUM_THREADS];

    int rc;

    long t;

    for(t=0; t<3; t++){

        rc = pthread_create(&threads[t], NULL, Sirala, (void *)t);

        if (rc){

            printf("Hata, thread oluşturulamadı. Thread: %d\n", rc);

            exit(-1);

        }

        pthread_join(threads[t], NULL);

    printf("\n\n");

    }

    printf("SON\n");

    for(i=0; i<800; i++)

        printf("%d\n", sayilar[i]);

    printf("/n/n");



    FILE *yaz; //dosya göstericisi

    yaz = fopen("son.txt", "w+");

    if (yaz == NULL){

        puts("Dosya acilmiyor");

        exit(1);

    }

    for(i=0; i<800; i++){

        fprintf(yaz, "%d\n", sayilar[i]);

    }

    fclose(yaz);



    pthread_exit(NULL);
}


void *Sirala(void *param){

    int i, baslangic, bitis;

    if ((long)param ==0){

        baslangic = 0;

        bitis= 300;

        kontrol =1;

        printf("Dizinin ilk 300 elemanının sırasız hali:\n\n");

        for(i=baslangic; i<bitis; i++){

            printf("%d - ", sayilar[i]);

        }

        printf("/n/n");

    }

    else if ((long)param ==1){

        baslangic = 300;

        bitis= 800;

        kontrol =2;

        printf("Dizinin diğer 500 elemanının sırasız hali:\n\n");

        for(i=baslangic; i<bitis; i++){

            printf("%d - ", sayilar[i]);

        }

        printf("/n/n");

    }

    else {

        baslangic = 0;

        bitis= 800;

        kontrol =0;

    }

    for(i= baslangic; i<bitis; i++){

        quickSort(sayilar, baslangic, bitis-1);

    }

    if (kontrol ==1){

    printf("Dizinin 300 elemanının sıralı hali:\n\n");

    for(i = baslangic; i<bitis; i++){

        printf("%d - ", sayilar[i]);

    }

    }

    else if (kontrol ==2){

    printf("Dizinin diğer 500 elemanının sıralı hali:\n\n");

    for(i = baslangic; i<bitis; i++){

        printf("%d - ", sayilar[i]);

    }

    }

    printf("\n\n");

    pthread_exit(0);

}



void quickSort(int a[], int sol, int sag){

    int j;

    if (sol<sag){

        j=partition(a,sol, sag);

        quickSort(a, sol, j-1);

        quickSort(a, j+1, sag);

    }

}



int partition(int a[], int sol, int sag){

    int pivot, i, j, t;

    pivot = a[sol];

    i= sol;

    j= sag+1;

}

Обновлено еще раз: Вы также должны решить это предупреждение:

warning: control reaches end of non-void function
  [-Wreturn-type]
}
^
1 warning generated. 

вы должны настроить threadcreate на pthread_create и настроить quicksort на quickSort

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_THREADS 3

int sayilar[800];
void *Sirala(void *param);
void quickSort(int[], int, int);
int partition(int[], int, int);
int kontrol=0;

int main(int argc, char *argv[]){
    int i,j;
    srand(time(NULL));
    for(i=0; i<800; i++){
        sayilar[i] = 1+ (rand() % 800);
        for(j=0; j<1; j++){
            if (sayilar[j]== sayilar[i]){
                i--;
                break;
            }
        }
    }
    pthread_t threads[NUM_THREADS];
    int rc;
    long t;
    for(t=0; t<3; t++){
        rc = pthread_create(&threads[t], NULL, Sirala, (void *)t);/*here*/
        if (rc){
            printf("Hata, thread oluşturulamadı. Thread: %d\n", rc);
            exit(-1);       
        }
        pthread_join(threads[t], NULL);
        printf("\n\n");
    }
    printf("SON\n");
    for(i=0; i<800; i++){
        printf("%d\n", sayilar[i]);
    }
    printf("/n/n");

    FILE *yaz; //dosya göstericisi
    yaz = fopen("son.txt", "w+");
    if (yaz == NULL){
        puts("Dosya acilmiyor");
        exit(1);
    }

    for(i=0; i<800; i++){
        fprintf(yaz, "%d\n", sayilar[i]);
    }
    fclose(yaz);
    pthread_exit(NULL);
    return 0;
}
void *Sirala(void *param){
    int i, baslangic, bitis;
    if ((long)param ==0){
        baslangic = 0;
        bitis= 300;
        kontrol =1; 
        printf("Dizinin ilk 300 elemanının sırasız hali:\n\n");
        for(i=baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        }
        printf("/n/n");
    }
    else if ((long)param ==1){
        baslangic = 300;
        bitis= 800;
        kontrol =2; 
        printf("Dizinin diğer 500 elemanının sırasız hali:\n\n");
        for(i=baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        } 
        printf("/n/n");
    }
    else{
        baslangic = 0;
        bitis= 800;
        kontrol =0;
    }
    for(i= baslangic; i<bitis; i++){
        quickSort(sayilar, baslangic, bitis-1);/*here*/
    }   
    if (kontrol ==1){
        printf("Dizinin 300 elemanının sıralı hali:\n\n");
        for(i = baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        }   
    }
    else if (kontrol ==2){
        printf("Dizinin diğer 500 elemanının sıralı hali:\n\n");
        for(i = baslangic; i<bitis; i++){
            printf("%d - ", sayilar[i]);
        }   
    }
    printf("\n\n");
    pthread_exit(0);
}
void quickSort(int a[], int sol, int sag){
    int j;
    if (sol<sag){
        j=partition(a,sol, sag);
        quickSort(a, sol, j-1);
        quickSort(a, j+1, sag); 
    }
}
int partition(int a[], int sol, int sag){
    int pivot, i, j, t;
    pivot = a[sol];
    i= sol;
    j= sag+1;
}

Кстати, в исходном коде вы пропустили "}" после pthread_exit (NULL);

Melody 23.05.2018 10:41

Другие вопросы по теме