我不太坚定地使用结构并且当前尝试通过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的所有条目都为零。
在我使用数组而不是结构之前,我看不出它有什么问题。所有这些工作正常。
答案 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);
}
理论上,需要在第二种情况下制作结构的副本,但编译器可以对其进行优化。