在void函数中操作结构

时间:2014-08-27 10:10:56

标签: c struct

我不太坚定地使用结构并且当前尝试通过void函数传递结构。 结构在一个分片头中定义,以及我的void函数:

/* "main.h" */

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

void full_view_equ(struct input, struct input);

该函数看起来像这样,使用两个不同的结构是很麻烦的。 Struct 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和OUTPUT调用函数:

struct input EQU, OUTPUT;

full_view_equ(EQU, OUTPUT);

问题是,在函数中,OUTPUT具有预期值。在函数外部,OUTPUT的所有条目都为零。

在我使用数组而不是结构之前,我看不出它有什么问题。所有这些工作正常。

6 个答案:

答案 0 :(得分:3)

您必须使用指向结构的指针并将其传递给函数,在您的代码中,函数中的OUTPUT结构实际上是原始结构的副本,更改副本不会更改原始结构。<登记/> 声明指向结构的指针只需使用以下代码:

struct input *OUTPUT;

并将此标题用于您的函数:

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

并且对函数的调用将是:

full_view_equ(EQU, &OUTPUT);

答案 1 :(得分: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);

答案 2 :(得分:0)

如果使用struct参数声明函数,则将向其发送结构的副本。函数返回后,该副本将丢失。

您可以修改函数以返回结构,在这种情况下,您必须将其复制回来。或者,您可以修改函数以获取指向结构的指针。

答案 3 :(得分:0)

当您将数组传递给函数时,它会衰减到函数中的指针。因为数组名称代表基址。但结构不是。所以将Pointer传递给结构!

而不是这个 -

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;
}

答案 4 :(得分:0)

将变量传递给函数时,会生成此变量的副本。

这里需要的是将指针传递给您的结构,然后使用

my_struct->data

而不是

my_struct.data

然后,您将指针的副本传递给函数,但指向的地址将是您的原始结构,因此您将能够修改它:)

答案 5 :(得分:0)

将指针传递给struct ...

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);
}

理论上,需要在第二种情况下制作结构的副本,但编译器可以对其进行优化。