2015-03-02 38 views
0

我想在我的C代碼中使用一些BLAS例程來進行實驗,並且出於某種原因我出現了一些問題,我不明白。這裏是我的代碼從C中調用daxpy。出了什麼問題?

#include<stdio.h> 

#define N 100000 
void daxpy_(int* n, double* alpha, 
      double* x, int *incx, 
      double* y, int *incy); 

int main(){ 
    static double x[N], y[N]; 
    double a = 0; 
    int i; 
    for (i = 0; i < N; i++){ 
     x[i] = 1; 
     y[i] = 1; 
    } 
    int n = N; 
    int incx = 1; 
    int incy = 1; 
    daxpy_(&n, &a, x, &incx, y, &incy); 
    for (i = 0;i < 10;i++){ 
     printf ("%d ",x[i]); 
    } 
} 

要檢查答案是否正確,我打印y的前幾個條目。我意識到我設置了a = 0,所以y向量應該不變,因爲結果應該是ax + y。請參閱http://www.mathkeisan.com/usersguide/man/daxpy.html。然而,結果給了我所有的零。另外,當我改變一個不同的時候,我得到完全隨機的結果,例如設置a = 0.2我得到的結果是一個只包含858993459的向量。我可能錯過了一些非常微不足道的東西。我正在編譯使用Cygwin和打字

gcc -o daxpy daxpy.c -lblas 

我認爲應該罰款。任何幫助將不勝感激!

編輯:我已經將N等於5,這裏是輸出,當我運行它

0 0 0 0 0 

此外,當我改變= 0.2輸出給

858993459 858993459 858993459 858993459 858993459 
+0

感謝您的提示,但它似乎並沒有工作。當我這樣做時,我實際上根本沒有輸出... – Slugger 2015-03-02 16:27:33

回答

1

有兩個問題,其中一個是未定義的行爲,另一個可能只是在閱讀文檔時的一個小的疏忽:

for (i = 0;i < 10;i++){ 
     printf ("%d ",x[i]); 
    } 

您使用格式說明符%d作爲double值。改爲使用%f

for (i = 0;i < 10;i++){ 
     printf ("%f ",x[i]); 
    //   ^
    } 

此外,根據文檔,輸出將被存儲在y而非x

+0

啊非常感謝,解決了它。愚蠢的錯誤,我的一部分! – Slugger 2015-03-02 16:32:59

+0

用於捕獲格式字符串錯誤,警告標誌。對於GCC,請嘗試-Wall。當你爲一個參數使用錯誤的格式字符串時,它會投訴。 – 2015-03-02 16:55:42

+0

@PegasusEpsilon不應該做任何警告編譯,我同意。我個人通常使用(至少)''WALL- WEXTRA -WShadow -pedantic -Wfatal-errors'。 – stefan 2015-03-02 16:57:47