2014-08-27 6 views
3

Я не очень уверен в использовании структур и в настоящее время пытаюсь передать структуру через функцию void. структура определена в заголовке шарда, а также моей ничтожной функции:манипулировать structs in void functions

/* "main.h" */ 

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

void full_view_equ(struct input, struct input); 

Функция выглядит так, что nessecary использовать два различных структур. Struct EQU уже содержит значения, выход будет инициализирован:

/* "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 равны нулю.

Я не могу понять, что с ним не так, прежде чем я использовал массивы вместо структур, и все работало нормально.

+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

Если вы объявляете функцию с параметром структуры, вы будете отправлять в копию из вашей структуры. Как только функция вернется, эта копия будет потеряна.

Вы можете либо изменить свою функцию, чтобы вернуть структуру, и в этом случае вы должны ее скопировать. Кроме того, вы можете изменить свою функцию, чтобы сделать указатель на структуры.

0

Когда вы передаете массив функции, он распадается на указатели в функции. Поскольку имя массива представляет собой базовый адрес. Но структур нет. Итак, передайте указатель на структуру!

Вместо this-

full_view_equ(EQU, OUTPUT); 

потребительной

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 

Затем Вы пройдете копию указателя на функцию, но Указанный адрес будет вашей исходной структурой, поэтому вы сможете его изменить :)

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