합리적인 GMP 배열 mpq_t
을 데이터로 보유하는 링크 된 목록을 구현하려고합니다. 또한 현재 연결된 목록 lte
의 끝까지 길이를 보유하고 편의상 길이를 유지하려고합니다. 배열 n
.GMP 변수가있는 연결된 목록
테스트하려면 임의의 mpq_t
어레이를 생성하고이를 배열을 보유하는 새 노드를 작성하는 의미 인 GMPlist_push
함수로 공급하십시오.
아래 코드는 작동하지만 사소한 것을 잊었거나 GMP 설치에 문제가 있습니다. 내가 실행할 때 5 개의 난수를 스트리밍 한 다음 어느 노드에 있는지 알려주지 만, 내 MacBook에서는 1, 4294967297, 4294967298, 4294967297이됩니다. 그런 다음 두 개 사이에서 계속 진동합니다. 데비안 데스크탑에서 똑같은 코드가 원하는 1,2,3을 수행합니다 ...
이것은 Linux 머신에서 제 방식으로 작동하는 것처럼 보이며 내 Mac에서는 작동하지 않는 것처럼 보이는 '예측할 수없는'동작처럼 보입니다. 내가 잊은 것을 볼 수 있니? 또한 잘못된 행동을 재현 할 수 있습니까?
실행 파일이 오류없이 실행되지만 lldb가 불명확 한 malloc 오류로 인해 충돌하지만 주목할 것입니다.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gmp.h>
#include <assert.h>
struct GMPlist {
mpq_t* data;
size_t n, lte;
struct GMPlist* next;
};
typedef struct GMPlist GMPlist;
mpq_t *randomVector(size_t n){
mpq_t* retVal;
retVal = malloc(n*sizeof(*retVal));
size_t i;
size_t den,num;
for (i = 0; i < n; i++){
mpq_init(retVal[i]);
den = (size_t)rand();
num = (size_t)rand();
mpq_set_ui(retVal[i],den,num);
mpq_canonicalize(retVal[i]);
}
return retVal;
}
void GMPlist_push(GMPlist** elem, mpq_t* data){
GMPlist* nextElem = malloc(sizeof(GMPlist*));
nextElem->next = *elem;
nextElem->lte = (*elem)->lte + 1;
nextElem->n = (*elem)->n;
nextElem->data = data;
*elem = nextElem;
}
int main(int argc, char const *argv[])
{
GMPlist* elem = malloc(sizeof(GMPlist));
srand(time(NULL));
elem->next = NULL;
elem->lte = 0;
elem->n = 5;
mpq_t* tester;
size_t i,j;
for (j = 0; j<10; j++){
tester = randomVector(5);
GMPlist_push(&elem, tester);
for (i=0; i<5; i++){
mpq_out_str(stdout,10,elem->data[i]);
fprintf(stdout, " ");
}
fprintf(stdout, ", %lu\n", elem->lte);
}
return 0;
}
는 메모리의 적절한 양을 할당하지 않는,
GMPlist_push
에서 라이너
답변으로 문제가 해결되었습니다! 고맙습니다! Valgrind와 GMP는 잘 작동하지 않으며 GMP의 알려진 문제 중 하나입니다. [Click] (https://gmplib.org/manual/Debugging.html#Debugging) –