foo(A, 1, 2, 3)
выглядит как вызов функции а не определение. И ошибка возникает изза того что в конце этой строки нет ;void foo(int* A, int p, int q, int r); // объявление
/*
код в котором используется foo();
*/
void foo(int* A, int p, int q, int r) // определение
{
}
nums[N];
с N=0;
. Когда вы в него пишете, каждый раз рискуете поймать ошибку доступа к памяти.nums[i] = min;
, должно быть наоборот))int min = nums[0];
. min должен быть тоже float, иначе вы получите немного не то что ожидаете. unique_ptr
- просто хранит динамический объект, когда будет уничтожен unique_ptr он автоматически освободит память с этим объектом.shared_ptr
нужен когда есть несколько объектов работающих с одним экземпляром. shared_ptr
указывающие на один и тот же объект сами считают свое количество и память будет очищена при уничтожении последнего.weak_ptr
нужен если существует два объекта хранящих умные указатели друг на друга. Если их обоих сделать shared_ptr
то программа не очистит память при попытке удалить один из них, так как уйдет в бесконечную рекурсию в попытке удалить их. Для решения есть weak_ptr
он просто следит за своим объектом и не мешает его удалению, но может принять право владения если не будет других shared_ptr
. FILE* res
тебе в ней вообще не нужен. i
так же можно отказаться.int recursion(int* x, int n)
{
if(n > 2) {
return recursion(x, n/2) * recursion(x + n/2, n - n/2);
} else if(n ==2) {
return x[0] * x[1];
} else {
return x[0];
}
}
n - n/2
используется потому что происходит целочисленное деление и округление.