передача массива структур (содержащих два числа mpz_t) в функцию - PullRequest
0 голосов
/ 24 марта 2010

Я работаю над проектом, в котором я использую тип mpz_t из библиотеки GMP C. У меня есть некоторые проблемы при передаче массива структур (содержащих mpz_ts) адрес функции: Я попытаюсь объяснить мою проблему с помощью некоторого кода.

Итак, вот структура:

 struct mpz_t2{
    mpz_t a;
    mpz_t b;
  };
  typedef struct mpz_t2 *mpz_t2;


void
mpz_t2_init(mpz_t2 *mpz_t2)
{
  mpz_init(mpz_t2->a);
  mpz_init(mpz_t2->b);
}


void
petit_test(mpz_t2 *test[])
{
  printf("entering petit test function\n");
  for (int i=0; i < 4; i++)
  {
    gmp_printf("test[%d]->a = %Zd and test[%d]->b = %Zd\n", test[i]->a, test[i]->b);
  }
}



/* IN MAIN FUNCTION */

mpz_t2 *test = malloc(4 * sizeof(mpz_t2 *));

  for (int i=0; i < 4; i++)
    {
      mpz_t2_init(&test[i]); // if I pass test[i] : compiler error
      mpz_set_ui(test[i].a, i); //if test[i]->a compiler error
      mpz_set_ui(test[i].b, i*10); //same problem
      gmp_printf("%Zd\n", test[i].b); //prints correct result
    } 
  petit_test(test);

Программа печатает ожидаемый результат (в основном), но после входа в функцию petit_test выдает ошибку ошибки сегментации.

Мне нужно отредактировать структурный массив mpz_t2 в petit_test. Я попробовал некоторые другие способы выделения и передачи массива в функцию, но мне не удалось сделать это правильно.

Если у кого-то есть решение этой проблемы, я был бы очень благодарен!

С уважением, Иероним.

1 Ответ

2 голосов
/ 24 марта 2010

В показанном вами коде вы выделяете память для массива указателей, но не инициализируете указатели, чтобы указывать на что-либо. Вам нужно выделить несколько экземпляров mpz_t2, а затем назначить указатели для указания на них.

--------------- отредактировано здесь ---------------

Похоже, это то, что вы пытаетесь сделать:

mpz_t2 **test = (mpz_t2**)malloc(4 * sizeof(mpz_t2 *));

for (int i=0; i < 4; i++)
{
    test[i] = (mpz_t2*)malloc(sizeof(mpz_t2));
    mpz_t2_init(test[i]); 
    ...
} 
petit_test(test);
...