mpz_t
определяется как массив длиной 1 из struct __mpz_struct
, что предотвращает присвоение. Это сделано потому, что обычное присвоение C - это мелкая копия, а различные числовые типы gmp хранят указатели на массивы "limbs" , которые необходимо глубоко копировать. Вам необходимо использовать mpz_set
или mpz_init_set
(или даже mpz_init_set_si
) для назначения целых чисел MP, убедившись, что вы инициализировали пункт назначения перед использованием первого.
Кроме того, вы должны вызывать mpz_clear
самое большее один раз для каждого mpz_init
(они похожи на malloc и свободны в этом отношении и по тем же причинам). Вызывая mpz_init(new_nom)
во внешнем цикле mpz_clear(new_num)
во внутреннем цикле, вы вводите ошибку, которая станет очевидной при рассмотрении результатов make_triangle
. Тем не менее, вам даже не нужно new_num
; инициализируйте следующий элемент triangle
и используйте его в качестве пункта назначения mpz_add
.
mpz_init(triangle[position]);
mpz_add(triangle[position++], triangle[last_row_pos + i], triangle[last_row_pos + i + 1]);
Небольшая числовая оптимизация: вы можете обновить last_row_pos
, используя сложение и вычитание, а не два вычитания, умножение и деление. Посмотри, сможешь ли ты выяснить как.