Вам нужно хранить нули в foo
независимо от значений, возвращаемых find_zeros
, как в Python, где у вас будут отдельные переменные zeros_list
и zeros
.
* 1006. * Python
list.append
метод реализуется в два этапа: сначала массив перераспределяется на новую емкость с
realloc
(у вас уже есть эта часть), а затем новое значение присваивается вновь доступному пространству. Поскольку вы создаете массив массивов, вам также необходимо скопировать значения из их временного местоположения в новое с помощью
memcpy()
. Например (непроверенный, в отсутствие MWE):
struct floatvec {
double *values;
int length;
}
struct floatvec *foo(int *howmany) {
struct floatvec *zeros_list = NULL;
int zeros_cnt = 0;
static double zeros[N];
while (1) {
int z = find_zeros(kappa, zeros);
if (z == 0)
break;
struct floatvec new = {
.values = malloc(z * sizeof(double)),
.length = z
};
if (!new.values)
return NULL;
memcpy(new.values, zeros, sizeof(double) * z);
zeros_list = realloc(zeros_list, sizeof(struct floatvec) * (zeros_cnt + 1));
if (!zeros_list)
return NULL;
zeros_list[zeros_cnt++] = new;
}
*howmany = zeros_cnt;
return zeros_list;
}
Пример использования:
int cnt;
struct floatvec *all_zeros = foo(&cnt);
for (int i = 0; i < cnt; i++) {
struct floatvec *curr = all_zeros[i];
for (int j = 0; j < curr->length; j++)
printf("%lf\n", curr->values[j]);
}
Пара несвязанных примечаний:
- don 't приведите результат
malloc
и realloc
. - , проверьте, вернул ли
malloc
NULL, и прервите вашу программу или сделайте ошибку, возвращающуюся к вызывающей стороне.
РЕДАКТИРОВАТЬ : обновлен ответ в соответствии с отредактированным вопросом.