Вы пытаетесь передать число из одной функции (bar
или find_pivot
) вызывающей стороне (foo
или quicksort
).
Использование глобальной переменной - плохой шаблон для этого.Измените ваши тесты, которые не позволяют вам сделать это.Попытка обойти это дает вам нечитаемый, не поддерживаемый и просто мучительно сложный код.На самом деле, это делает его настолько бесполезно сложным, что вы даже не можете понять, как написать это самостоятельно, в то время как альтернативы очень просты.
Сравните это:
int find_pivot(int *arr, int low, int high)
{
return ...;
}
void quicksort(int *arr, int low, int high)
{
...
int pivot_index = find_pivot(arr, low, high);
quicksort(arr, low, pivot_index - 1);
quicksort(arr, pivot_index + 1, high);
}
Или используяуказатель (обычно, если у вас есть несколько значений или сложное значение для возврата):
void find_pivot(int *arr, int low, int high, int *pivot_index)
{
*pivot_index = ...;
}
void quicksort(int *arr, int low, int high)
{
...
int pivot_index = -1;
find_pivot(arr, low, high, &pivot_index);
quicksort(arr, low, pivot_index - 1);
quicksort(arr, pivot_index + 1, high);
}
со следующим (неправильно!), что близко к тому, что вы написали:
int pivot_index;
void find_pivot(int *arr, int low, int high)
{
pivot_index = ...;
}
void quicksort(int *arr, int low, int high)
{
...
find_pivot(arr, low, high);
// What happens if two tasks call pivot_index simultaneously?
// Which value will you get for quicksort? No way of knowing!
quicksort(arr, low, pivot_index - 1);
// pivot_index has changed value due to recursive quicksort() ! The next call is wrong!
quicksort(arr, pivot_index + 1, high);
}
Он не только менее читабелен (например, при чтении быстрой сортировки, откуда берется pivot_index?), Но также должен быть исправлен (не используйте это, это ужасно!):
// can be set from several threads simultaneously
int pivot_index;
#pragma omp threadprivate(pivot_index)
void find_pivot(int *arr, int low, int high)
{
pivot_index = ...;
}
void quicksort(int *arr, int low, int high)
{
...
find_pivot(arr, low, high);
// save value to protect from recursive calls
int my_pivot_index = pivot_index;
quicksort(arr, low, my_pivot_index - 1);
quicksort(arr, my_pivot_index + 1, high);
}