2010-03-23 71 views
0

我正在使用GMP C庫中的類型mpz_t的某個項目。我有一些問題傳遞一個結構數組(包含mpz_ts)地址到一個函數: 我試圖用一些代碼來解釋我的問題。將結構數組(包含兩個mpz_t數字)傳遞給函數

因此,這裏的結構:

struct mpz_t2{ 
    mpz_t a; 
    mpz_t b; 
    }; 
    typedef struct mpz_t2 *mpz_t2; 


void 
mpz_t2_init(mpz_t2 *mpz_t2) 
{ 
    mpz_init(mpz_t2->a); 
    mpz_init(mpz_t2->b); 
} 


void 
petit_test(mpz_t2 *test[]) 
{ 
    printf("entering petit test function\n"); 
    for (int i=0; i < 4; i++) 
    { 
    gmp_printf("test[%d]->a = %Zd and test[%d]->b = %Zd\n", test[i]->a, test[i]->b); 
    } 
} 



/* IN MAIN FUNCTION */ 

mpz_t2 *test = malloc(4 * sizeof(mpz_t2 *)); 

    for (int i=0; i < 4; i++) 
    { 
     mpz_t2_init(&test[i]); // if I pass test[i] : compiler error 
     mpz_set_ui(test[i].a, i); //if test[i]->a compiler error 
     mpz_set_ui(test[i].b, i*10); //same problem 
     gmp_printf("%Zd\n", test[i].b); //prints correct result 
    } 
    petit_test(test); 

的PROGRAMM打印預期的結果(在主),但在進入petit_test功能之後產生一個分段錯誤。

我需要編輯petit_test中的mpz_t2結構數組。 我嘗試了一些其他的方式分配和傳遞數組到函數,但我沒有設法得到這個權利。

如果有人解決了這個問題,我會非常感謝!

Regards, jérôme。

+0

這裏真正的問題是,無數的程序員一旦暴露於C,就會認爲像這樣的問題是80%的開發者的任務。按照Miguel並切換到C#。 – reinierpost 2010-03-23 22:56:50

+0

好吧,但我必須做到這一點,即使我不喜歡這樣做^^ – jerome 2010-03-23 22:58:32

回答

2

在您已顯示的代碼中,您正在爲指針數組分配內存,但您並未初始化指向任何內容的指針。您需要分配mpz_t2的一些實例,然後將您的指針指向它們。

---------------這裏編輯---------------

它看起來這是你想要什麼要做的事:

mpz_t2 **test = (mpz_t2**)malloc(4 * sizeof(mpz_t2 *)); 

for (int i=0; i < 4; i++) 
{ 
    test[i] = (mpz_t2*)malloc(sizeof(mpz_t2)); 
    mpz_t2_init(test[i]); 
    ... 
} 
petit_test(test); 
+0

對不起,我忘了添加初始化函數: void mpz_t2_init(mpz_t2 * mpz_t2);它在結構的每個成員上使用gmp library mpz_init函數。 – jerome 2010-03-23 22:54:45

+0

你還沒有分配任何mpz_t2實例....我會添加一些東西給我的答案。 – jwismar 2010-03-23 23:03:44

+0

這個作品,非常感謝! – jerome 2010-03-23 23:20:22