Recherche à la fourchette en C

Je suis censé être à l’aise avec fork et j’ai vu un exercice qui consistait à utiliser un appel fork pour rechercher un tableau indexé de 0 à 15. Nous supposons que chaque processus ne peut faire que deux choses … 1) est de vérifier si un tableau est de longueur 1, et (2) comparer un seul élément d’un tableau au nombre recherché. Fondamentalement, je lui passe un nombre, et je suis supposé faire un nombre fini de forks et renvoyer l’index de ce nombre. Voici mon code ..

#define MAXINDEX 16 int forkSearch(int a[], int search, int start, int end){ if(start == end){ if(*(a + end) == search){ return end; } } else{ pid_t child = fork(); if(child == 0) return forkSearch(a, search, start, end/2); else return forkSearch(a, search, (start + end)/2, end); } } int main(int argc, char* argv[]){ int searchArray[MAXINDEX] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3,\ 15, 7}; printf("Should be 1. Index of 12 = %d\n", forkSearch(searchArray, 12, 0, MAXINDEX)); return 0; } 

Tout dans le retour de ce programme qui explose rapidement semble être soit 1, 10, 11 ou 13. Pourquoi cela ne fonctionne pas comme il se doit.

 if(child == 0) return forkSearch(a, search, start, end/2); 

C’est la mauvaise end , il devrait être (start+end)/2 , et l’index de début de la recherche dans la moitié droite devrait être (start+end)/2 + 1 . Sinon, si la moitié droite est (start+end)/2 .. end , lorsque end == start+1 , le start de l’appel récursif est l’ancienne valeur de start et vous avez une boucle infinie.

Votre programme a un comportement indéfini car

 int forkSearch(int a[], int search, int start, int end){ if(start == end){ if(*(a + end) == search){ return end; } } 

ne renvoie pas de valeur si start == end , mais *(a+end) != search . Ajouter une exit(0); après le if intérieur pour quitter les processus qui n’ont pas trouvé la cible.

 int searchArray[MAXINDEX] = {...}; forkSearch(searchArray, 12, 0, MAXINDEX) 

conduira à un access searchArray[MAXINDEX] limites à searchArray[MAXINDEX] , également à un comportement non défini.