2016-07-08 3 views
1

합리적인 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에서 라이너

답변

0

감사 :

GMPlist* nextElem = malloc(sizeof(GMPlist*)); 

당신은 GMPlist의 크기를 원하는,하지만 당신은 있어요 GMPlist *의 크기는 더 작습니다.

대신이 작업을 수행 :

GMPlist* nextElem = malloc(sizeof(GMPlist)); 

당신이 valgrind에서 코드를 실행하면 당신은 안하고 메모리를 읽기/쓰기있는 경우, 그것은을 보여줍니다.

+0

답변으로 문제가 해결되었습니다! 고맙습니다! Valgrind와 GMP는 잘 작동하지 않으며 GMP의 알려진 문제 중 하나입니다. [Click] (https://gmplib.org/manual/Debugging.html#Debugging) –