Я получил сообщение об ошибке «неопределенная ссылка на функцию». Как я могу это решить? Сообщение об ошибке находится на изображении. Мы пытаемся сделать многопоточную программу сортировки.
Сначала необходимо создать серию из 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;
}
}
Сообщение об ошибке:

Пожалуйста, не отправляйте текстовую информацию как изображение. (Вместо этого скопируйте / вставьте его.)
Это ошибка компоновщика, она не имеет ничего общего с кодом потоковой передачи, поэтому, пожалуйста, сократите свой вопрос до минимальный пример. Кроме того, включите сообщение об ошибке в виде текста (прогноз в виде кода) и исправить ваш отступ, потому что, скорее всего, проблема заключается в неправильном креплении.
Я не могу прочитать снимок экрана. Пожалуйста, разместите текст как текст.
Проверьте фигурные скобки. Ваши функции находятся внутри main()
Похоже, вы забыли включить хороший набор предупреждений. Для GCC я рекомендую как минимум -Wall -Wextra -Wwrite-strings; рассмотрите также -Wpedantic -Warray-bounds для выявления некоторых других распространенных ошибок.
Возможный дубликат Что такое ошибка неопределенной ссылки / неразрешенного внешнего символа и как ее исправить?
Ничто из того, что вы говорите, не заставило меня решить. Я просил помощи, а не унижения.





Функция, которую вы должны использовать для создания нового потока, - это 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);
Опечатки (C чувствителен к регистру) и правильное форматирование кода, другие проблемы должны выделяться, как только вы это сделаете.