В c есть простая программа, которая вычисляет максимальное значение в массиве int.Он использует fork (), чтобы сделать эту работу быстрее.Фактически, он делит массив пополам, и каждая часть делится пополам и т. Д. (Что-то вроде сортировки слиянием). Проблема в том, что строки после вызова функции findMax в main выполняются много раз (количество дочерних процессов).и возвращаемое значение не является правильным.Я думаю, что я должен использовать wait () в другом месте, но я не знаю где.кто-нибудь может мне помочь? Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>
int findMax(int a[], int l, int r);
int main(){
int n;
int max;
int stat;
int i;
int arr[100];
printf("Enter number of numbers:\n");
scanf("%d", &n);
srand(time(0));
printf("The array is:\n");
for(i = 0; i<n; i++){
arr[i] = rand()%128;
printf("%d ", arr[i]);
}
printf("\n");
max = findMax(arr, 0, n-1);
wait(&stat);
printf("the entire maximum number is: %d\n", max);
return 0;
}
int findMax(int a[], int l, int r){
int blockMax;
int i;
if(r-l+1<10){
blockMax = a[l];
for(i = l+1; i<=r; i++){
if(a[i]>blockMax)
blockMax = a[i];
}
printf("maximum from number %d to %d is %d\nPID:%d PPID:%d\n", l+1, r+1, blockMax, (int)getpid(), (int)getppid());
return blockMax;
}
else{
int m;
int max1, max2;
int status;
m = (l+r)/2;
pid_t pid = fork();
if(pid<0){
printf("Fork failed.\n");
return 0;
}
else if(pid == 0){
max1 = findMax(a, l,m);
}
else{
max2 = findMax(a, m+1, r);
}
wait(&status);
if(max1 > max2)
return max1;
else
return max2;
}
}