我试图从io.h中调用main.c中的一个函数,该函数从文件中读取数据,将该数据存储到多个结构中,然后以某种方式让我将不同的结构作为参数传递给main中的后续函数。后面的那些函数将在其他文件中定义,例如alg.h。
我该怎么做呢?我是否使用extern并使结构全局并将它们放在一个单独的文件中?是否有可能从alg.h的函数有一个结构的返回类型?它取决于我的包含顺序吗?
下面粘贴的代码符合并且有效,但是任何移动任何结构的尝试都会导致程序无法编译。
此外,是否可以使用例如在alg.h中声明的结构,然后将具有该结构的函数作为稍后在alg.h中声明的参数。然后在main.c中,初始化并将结构传递给在io.h中声明的函数,给结构赋一些值,让它返回到main.c,然后将它传递给alg.h中声明的函数?我知道这听起来像一个类,但我需要一个C解决方案,我只需要一个结构的实例浮动。
感谢。
io.h
struct s1 {
int num1;
double num2;
};
struct s2 {
int num3;
double num4;
};
void io_init(struct s1*, struct s2*);
io.c中
#include <stdio.h>
#include <stdlib.h>
#include "io.h"
void io_init(struct s1* s1i, struct s2* s2i)
{
s1i->num1 = 5;
s1i->num2 = 2.4;
FILE *fp;
char line[80];
fp = fopen("input.txt","rt");
fgets(line, 80, fp);
sscanf(line,"%i",&s2i->num3);
fgets(line, 80, fp);
sscanf(line,"%i",&s2i->num4);
fclose(fp);
}
alg.h
void ga_init(struct s1);
alg.c
#include <stdio.h>
#include "io.h"
#include "ga.h"
void ga_init(struct s1 s1i)
{
printf("%i", s1i.val1);
}
main.c中:
#include <stdio.h>
#include "io.h"
#include "ga.h"
int main() {
struct s1 s1i;
struct s2 s2i;
io_init(&s1i, &s2i);
ga_init(s1i);
return 0;
}
答案 0 :(得分:1)
每个需要声明你的类型的文件(即想要使用它们)必须包含你的头文件(好的,所以前向声明和指针都可以工作,但是如果没有定义那么它们就不能被解引用了#39;无论如何都不适用于此。)
因此,详细说明,如果文件X需要使用struct Y
,那么它需要包含包含其声明的头文件,即它。
/* X.c */
#include "Y.h" /* <-- that's it! */
void foo(Y *obj) {
/* ... */
}
答案 1 :(得分:0)
这是一些建议。
您的.h
文件未定义结构对象。它只是定义类型。它的方式很好。触及这些类型的任何结构的每个人都应该包含此文件。
在调用ga_init
时,很少需要按值传递结构。您基本上总是希望通过引用来调用,就像使用io_init
。
是的,你可以返回一个结构,但同样,返回一个结构的引用几乎总是更好。
您当然可以共享全局定义的结构,除非您的链接器非常糟糕,否则您不需要extern
。但是,共享对main()
中分配的结构的引用大致相同。