2014-08-27 6 views
3

저는 구조체를 사용하지 않고 현재 void 함수를 통해 구조체를 전달하려고합니다. 구조체 내 무효 기능뿐만 아니라, 파편 헤더에 정의되어void 함수에서 구조체를 조작합니다.

/* "main.h" */ 

struct input{ 
    unsigned int NO; 
    double RA; 
    double DE; 
    double MV; 
}; 

void full_view_equ(struct input, struct input); 

기능은 다음과 같습니다, 두 개의 서로 다른 구조체를 사용하는 nessecary입니다. 구조체 EQU 이미 값, OUTPUT이 초기화되지 않은 것 포함

/* "transformations.c" */ 

#include "main.h" 

void full_view_equ(struct input EQU, struct input OUTPUT){ 
    OUTPUT.NO = EQU.NO; 
    OUTPUT.RA = -radian2degree(EQU.RA); 
    OUTPUT.DE = radian2degree(EQU.DE); 
    OUTPUT.MV = EQU.MV; 
} 

내가 이런 두 구조체 EQU와 출력 함수를 호출하고 있습니다 :

struct input EQU, OUTPUT; 

full_view_equ(EQU, OUTPUT); 

문제는, 그 함수 내에서, OUTPUT에 예상 값이 있습니다. 함수 외부에서는 OUTPUT의 모든 항목이 대신 0입니다.

구조체 대신 배열을 사용하고 모든 것이 정상적으로 작동하기 전에 무엇이 잘못되었는지 알 수 없습니다.

+2

배열은 함수에 전달 될 때 포인터로 변합니다. 구조체는 그렇지 않습니다. 구조체에 포인터를 전달하십시오. – mafso

답변

3

구조체에 포인터를 사용하여 함수에 전달해야합니다. 코드에서 함수의 OUTPUT 구조체는 실제로 원래 구조체의 복사본이고 복사본을 변경하면 원래 구조체가 변경되지 않습니다.

struct input *OUTPUT; 

및 함수에 대해이 헤더를 사용 : 것

void full_view_equ(struct input EQU, struct *input OUTPUT) 

하고 함수를 호출 :

full_view_equ(EQU, &OUTPUT); 
단순히이 코드를 사용하는 구조체에 대한 포인터를 선언
+1

그리고 반드시 "->"연산자를 사용하십시오. 운영자. 일부 IDE는이를 통과하지만 표준 방법입니다. – Amen

+0

감사합니다. 예상대로 작동합니다. – van

1

함수 인수는 값으로 전달됩니다. 그래서 당신은 함수 외부 값을 수정하기 위해 포인터를 사용합니다 : 당신이 구조체 매개 변수로 함수를 선언하면

void full_view_equ(struct input EQU, struct input *OUTPUT){ 
    OUTPUT->NO = EQU.NO; 
    OUTPUT->RA = -radian2degree(EQU.RA); 
    OUTPUT->DE = radian2degree(EQU.DE); 
    OUTPUT->MV = EQU.MV; 
} 

full_view_equ(EQU, &OUTPUT); 
0

과 같이 호출, 당신의 사본를 전송한다 당신의 구조체. 함수가 반환되면 해당 복사본은 손실됩니다.

struct를 반환하도록 함수를 수정할 수도 있습니다.이 경우 구조체를 다시 복사해야합니다. 또는 함수를 수정하여 구조체에 대한 포인터를 가져올 수 있습니다.

0

배열을 함수에 전달할 때 함수에서 포인터로 사라집니다. 배열 이름은 기본 주소를 나타 내기 때문입니다. 그러나 구조는 그렇지 않습니다. 포인터를 구조체에 전달하십시오! 대신 this-

full_view_equ(EQU, OUTPUT); 

use-

full_view_equ(EQU, &OUTPUT); // pass a pointer to a structure 

가변으로 전달할 때 -> 연산자

void full_view_equ(struct input EQU, struct input *OUTPUT){ 
OUTPUT->NO = EQU.NO; 
OUTPUT->RA = -radian2degree(EQU.RA); 
OUTPUT->DE = radian2degree(EQU.DE); 
OUTPUT->MV = EQU.MV; 
} 
0

의해 . 교체 함수 구조 포인터를 잡을 함수가 있으면이 변수의 복사본이 만들어집니다.

은 당신이 여기에서 필요로하는 것은 그런 다음 함수에 포인터의 사본을 전달합니다 다음, 당신의 구조에 대한 포인터를 전달

my_struct->data 

대신

my_struct.data 

의 사용하는 것입니다,하지만, pointed 주소는 원래 구조체가 될 것이므로 수정할 수 있습니다 :)

0

구조체에 대한 포인터를 전달하십시오.

void full_view_equ(struct input *EQU, struct input *OUTPUT){ 
    OUTPUT->NO = EQU->NO; 
    OUTPUT->RA = -radian2degree(EQU->RA); 
    OUTPUT->DE = radian2degree(EQU->DE); 
    OUTPUT->MV = EQU->MV; 
} 

int main(void) { 
    struct input a, b; 
    memset(&b, 0, sizeof(b)); 
    full_view_equ(&a, &b) 
} 

또는 함수에서 구조체를 반환은 :

struct input full_view_equ(struct input EQU){ 
    struct input OUTPUT; 
    OUTPUT.NO = EQU.NO; 
    OUTPUT.RA = -radian2degree(EQU.RA); 
    OUTPUT.DE = radian2degree(EQU.DE); 
    OUTPUT.MV = EQU.MV; 
    return OUTPUT; 
} 

int main(void) { 
    struct input a, b; 
    memset(&b, 0, sizeof(b)); 
    a = full_view_equ(b); 
} 

이론적으로, 구조체의 복사본 두 번째 경우에 할 필요가 있지만, 컴파일러는 그것을 멀리 최적화 할 수 있습니다.

+1

'struct * input'또는'struct input *'입니까? 확인 해봐! – Sathish

+0

Ouuups, 그것을 알아 차리지 못했습니다! 고맙습니다! – michaelmeyer

관련 문제