私は、有理なGMP配列mpq_t
をデータとして保持するリンクリストを実装しようとしています。さらに、現在のリンクリストlte
の終わりまで長さを保持したいと思います。配列n
。リンクされたリストとGMP変数
私は任意のmpq_t
配列を生成し、それを配列を保持する新しいノードを作成するための私のGMPlist_push
関数に送ります。
以下のコードは動作しますが、私は何か些細なことを忘れてしまったか、自分のGMPインストールに問題があります。私はそれを実行すると、5つの乱数をストリームして、どのノードにあるのかを教えてくれるが、私のMacBookでは1、4294967297、4294967298、4294967297となり、私のDebianデスクトップ上で同じコードを使ってみてください...
これは、Linuxマシンで私の好きなところで動作するように見える「予測できない」動作のようです。私が忘れたものを見ることができますか?また、誤った動作を再現できますか?
実行可能ファイルはエラーなしで実行されますが、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の既知の問題の1つです。 [クリック](https://gmplib.org/manual/Debugging.html#Debugging) –