2011-09-03 30 views
0

好的,我在這裏寫c。在mingw gcc編譯。我的結構有什麼問題?

我試圖做一些事情真的很簡單。創建一個包含3個浮點數x,y,z的矢量結構體。

那麼我希望能夠做一些數學和他們在一起。

這是我的短的測試程序:

#ifndef _PHYSICS_C_ 
#define _PHYSICS_C_ 


    #define SUCCESS 0 
    #define FAILURE 1 


    typedef struct { 
     float x; 
     float y; 
     float z; 
    }vector; 

    int add (vector* a, vector* b, vector* destination){ 
     (*destination).x = (float)(((*a).x) + ((*b).x)); 
     (*destination).y = (float)(((*a).y) + ((*b).y)); 
     (*destination).z = (float)(((*a).z) + ((*b).z));  
     return SUCCESS; 
    } 

    int main(int argc, char** argv){ 

     printf("creating vectors\n\n"); 
     vector a = {1.0f,5.0f,3.0f}; 
     vector b = {2.0f,3.0f,6.0f}; 
     vector destination; 

     printf("adding vectors\n\n"); 
     if(add(&a, &b, &destination) == SUCCESS){  
      printf("result: (%d, %d, %d)\n\n",destination.x,destination.y,destination.z); 
     } else { 
      printf("the program failed somehow...\n\n"); 
     } 

     printf("Press any key to continue...\n"); 
     getchar(); 

     return SUCCESS; 
    } 

#endif 

當我編譯和運行它,則它應該返回(3,8,9)的矢量a和b的總和。

而是返回(0,1074266112,0)...

我無法弄清楚什麼是錯的。

由於某種原因,我認爲我必須以某種方式記錄下我不應該記憶的內容。

+2

您可以使用' - >'運算符而不是'*(x).y',同時刪除superflous圓括號,這將使您的代碼更具可讀性。 – Necrolis

回答

4

的x,y,z是浮動,但你正嘗試將它們打印爲整數。

嘗試:

 printf("result: (%f, %f, %f)\n\n",destination.x,destination.y,destination.z); 

檢查man printf或文檔的查看所有符爲的printf。

0

%d預計int。漂浮物/雙人使用%f%g

0

您正在打印float,其格式說明符%d打算用於signed int。改爲使用%f%g%e

而且,你爲什麼不這樣做:

destination->x = a->x + b->x; 

及其對眼睛容易得多。 (雖然不是問題)。

開始以下劃線後跟大寫字母
+2

'%d'用於簽名的'int',而不是用於一般的有符號整數('long'是一個有符號的整數類型,但它不是'int')。 '%f','%g'和'%e'對於float或double參數都是正確的格式;在這種情況下,float參數被提升爲double。 –

+0

已更正。是的,他們提升了一倍。 – phoxis

0

標識符被保留;不要在你自己的代碼中使用它們。

包括守衛(#ifndef _PHYSICS_C_ ...)用於頭文件,而不用於.c文件。

printf要求#include <stdio.h>

您從main()返回值SUCCESS。這是確定的,因爲SUCCESS恰好是0,但它會更清楚爲使用EXIT_SUCCESS(在<stdlib.h>聲明或只是return 0;

add函數總是返回SUCCESS,它很可能會成爲一個void函數(和測試。其在main值是沒有用的),除非你預計將錯誤檢查以後

的強制轉換在add功能是不必要的,表達的是已float類型。(*foo).bar最好寫成foo->bar。例如,第一個作業可以簡化爲destination->x = a->x + y->x;

真正的問題(已經指出)是,您正在使用"%d"格式的值爲float類型的值。

通常使用double而不是float。它具有更高的精度,現代硬件通常針對雙精度操作進行優化。

如果您在編譯器中啓用了警告,它可能會告訴您其中一些問題。

+0

爲什麼downvote? –

相關問題