2011-09-03 4 views
0

자, 여기 c로 쓰고 있습니다. mingw gcc로 컴파일하기.구조체에 어떤 문제가 있습니까?

정말 간단하게하려고합니다. 3 개의 float 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' 대신'->'연산자를 사용할 수 있습니다. 엄청난 괄호를 제거하면 코드를 더 쉽게 읽을 수 있습니다. – Necrolis

답변

4

x, y, z는 부동 소수이지만 정수로 인쇄하려고합니다.

시도 :

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

체크 man printf 또는 문서의 printf의 지정자를 모두 볼 수 있습니다.

0

%dint입니다. float/double에 %f 또는 %g을 사용하십시오.

0

형식 번호 %dfloatsigned int으로 인쇄됩니다. 대신 %f 또는 %g 또는 %e을 사용하십시오.

또한, 당신은 왜하지 않는다 : 눈에

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

그 훨씬 쉽게. (문제는 아니지만).

+2

'% d '은 일반적으로 부호있는 정수가 아닌 부호있는'int'를위한 것입니다 ('long'은 부호있는 정수형이지만'int'가 아닙니다). '% f','% g' 및'% e'는 float 또는 double 인수에 대한 올바른 형식입니다. float 인수는이 컨텍스트에서 두 배로 승격됩니다. –

+0

이 수정되었습니다. 네, 그들은 두 배로 승격됩니다. – phoxis

0

밑줄 문자와 대문자로 시작하는 식별자는 예약되어 있습니다. 자신의 코드에서 사용하지 마십시오.

가드 (#ifndef _PHYSICS_C_ ...)는 헤더 파일 용이며 .c 파일 용은 아닙니다.

printf#include <stdio.h>이 필요합니다.

SUCCESSmain()에서 반환합니다. SUCCESS 0 될 일이 있기 때문에 즉, 괜찮아요,하지만 어느 EXIT_SUCCESS이 (<stdlib.h>에 선언하거나 return 0; 사용하는 것이 명확 할 것이다.

당신 add 함수는 항상 반환 SUCCESS. 그것은뿐만 아니라 무효 기능 (시험 수 있습니다 .. main에서 그 값이) 도움이되지 않습니다 당신이 오류를 추가 할 것으로 예상되는하지 않으면 나중에 확인

캐스트를 당신의 add 함수는 불필요하다, 표현은 이미 형 float의입니다.(*foo).barfoo->bar으로 작성하는 것이 좋습니다. 예를 들어, 첫 번째 할당은 destination->x = a->x + y->x;으로 단순화 될 수 있습니다.

실제 문제는 (이미 지적했듯이) float 값에 "%d" 형식을 사용하고 있다는 것입니다.

일반적으로 float이 아닌 double을 사용합니다. 더 정밀도가 높으며 현대 하드웨어는 종종 배정도 연산에 최적화되어 있습니다.

컴파일러에서 경고를 활성화하면 아마도 이러한 문제 중 일부가 표시됩니다.

+0

왜 downvote? –

관련 문제