Запуск программы C ++ с библиотекой GMP для использования больших чисел приводит к ошибке: C4146: унарный оператор минус применен к типу без знака, результат по-прежнему без знака - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь использовать эту библиотеку для программы больших простых чисел.

Я установил GMP и установил компилятор: Microsoft Visual Studio Community 2019

Я просто пытаюсь для генерации простых чисел:

#include <gmp.h>
int main() {
    gmp_randstate_t state;  // variable state for gmp_randinit, must be initialized 
    mpz_t p, q, N;
    mp_bitcnt_t n;  // number of bits for the number in range 0 to (2^n)-1, inclusive.

    n = 10;
    gmp_randinit_default(state);    // Initialize state with a default algorithm.

    while (true)
    {
        mpz_urandomb(p, state, n);  // Generate a uniformly distributed random integer
        if (mpz_probab_prime_p(p, 50) == 2) // Determine whether p is prime. Return 2 if p is definitely prime
            break;
    }
    while (true)
    {
        mpz_urandomb(q, state, n);  // Generate a uniformly distributed random integer
        if (mpz_probab_prime_p(q, 50) == 2) // Determine whether q is prime. Return 2 if q is definitely prime
            break;
    }

    return 0;
}

Когда я пытаюсь запустить через Visual Studio, я получаю сообщение об ошибке:

C4146: unary minus operator applied to unsigned type, result still unsigned 

в файле gmp.h строка 2230

Когда я пытаюсь запустить через WSL 2, Ubuntu со следующим:

g++ filename.cpp -lgmpxx -lgmp

./a.out

Я получаю этот вывод: Segmentation fault

Я не понимаю, почему это так.

Спасибо.

1 Ответ

3 голосов
/ 21 марта 2020

Предупреждение C4146 - это всего лишь чепуха от Microsoft. Ищите это, чтобы понять это, затем игнорируйте это. Совершенно правильные программы могут выдавать это предупреждение.

Настоящая ошибка в вашем коде (и причина ошибки сегментации) заключается в том, что с GMP mpz_t переменные должны быть инициализированы перед использованием (и уничтожены после использования).

mpz_t p, q, N;
mpz_init(p);
mpz_init(q);
mpz_init(N);

...

mpz_clear(p);
mpz_clear(q);
mpz_clear(N);

GMP является библиотекой C, а не библиотекой C ++, поэтому необходима такая инициализация вручную.

Руководство по GMP довольно хорошее, вам стоит взглянуть.

...