2016-03-12 2 views
0

я работаю с GMP Lib в первый раз и, похоже, этот код делает некоторые грязные обманы памяти:C++ GMP управления странно памяти

void addition (const point p,const point q,const mpz_t fp, point* result){ 
    mpz_t ld; 
    mpz_init(ld); 
    lambda_add(p,q,fp,ld); 

    gmp_printf("WTFCHECK1: %Zx, %Zx\n", p.x ,p.y); 
    mpz_mul(result->x,ld,ld); 
    gmp_printf("WTFCHECK2: %Zx, %Zx\n", p.x ,p.y); 
    mpz_sub(result->x,result->x,p.x); 
    gmp_printf("WTFCHECK3: %Zx, %Zx\n", p.x ,p.y); 
... 
} 

где лямбда выглядит

void lambda_add (const point p,const point q,const mpz_t fp, mpz_t result){ 
    mpz_t ydiff,xdiff; 
    mpz_init (ydiff);  
    mpz_init (xdiff); 

    mpz_sub (ydiff,q.y,p.y); 
    mpz_sub (xdiff,q.x,p.x); 
...//no more usage of p or q 
} 

Но выход программы по-прежнему выглядит следующим образом:

WTFCHECK1: 7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978, 7775510db8ed040293d9ac69f7430dbba7dade63ce982299e04b79d227873d1 
WTFCHECK2: de8a6886d284cb85d49a93b707475ed3d277242444ba9e860207f9a59a9ef351, 7775510db8ed040293d9ac69f7430dbba7dade63ce982299e04b79d227873d1 

As yo u может видеть, переменная p.x типа mpz_t (x и y - тип mpz_t в typedef struct point) изменился без меня, введя что-либо в него. В чем причина такого поведения? Благодарю.

+0

Возможно, вам потребуется опубликовать настройки 'p',' q' и 'result', а также вызов' add'. Что произойдет, если вы прокомментируете вызов 'lambda_add'? –

+2

Не могу сказать много без MCVE. Обратите внимание, что вы, вероятно, сэкономили бы массу проблем, если бы использовали заголовок '', который поставляется с GMP, и тип 'mpz_class', который он предоставляет. –

ответ

0

Хорошо, D проблема была на моей стороне, я звонил addition (const point p,const point q,const mpz_t fp, point* result) с той же структурой, что и точка p, и как результат пункта *, поэтому вместе с изменением результата я также изменял точку p. Я все равно ценю вашу помощь.

Смежные вопросы