无法访问另一个.c文件中结构的字段成员
我创建了一个复数结构,并编写了如下函数来创建它:在complex.c中:无法访问另一个.c文件中结构的字段成员,c,pointers,struct,forward-declaration,C,Pointers,Struct,Forward Declaration,我创建了一个复数结构,并编写了如下函数来创建它:在complex.c中: typedef struct Complex { double m_re; double m_im; }Complex; ComplexP fromCharFunc(char *s) { double *values = extractValuesFromString(s); if(values == NULL) { return NULL; }
typedef struct Complex
{
double m_re;
double m_im;
}Complex;
ComplexP fromCharFunc(char *s)
{
double *values = extractValuesFromString(s);
if(values == NULL)
{
return NULL;
}
double re = values[0], im = values[1];
free(values);
return createComplexNumber(re, im);
}
static ComplexP createComplexNumber(double re, double im)
{
ComplexP complexNumber = (ComplexP)malloc(sizeof(Complex));
complexNumber->m_re = re;
complexNumber->m_im = im;
return complexNumber;
}
这在复合体中。h:
typedef struct Complex* ComplexP;
为了检查我所做的是否正确,我在Complex.c文件中创建了一个主函数,并调用
ComplexP a = fromCharFunc("0,1i");
a->m_im = 3;
一切都很顺利
但是,当我在另一个.c文件中执行此操作时,它位于顶部:
#include "Complex.h"
#include <stdio.h>
#include <stdlib.h>
#包括“Complex.h”
#包括
#包括
对于相同的主函数,它在主函数的第二行给了我这个错误:“将指针解引用到不完整类型”。我在另一篇博文中读到过,那里的人说没有分配内存。。。但我确实分配了内存,这并没有发生在Complex.c文件中
请帮忙。谢谢
编辑:不允许我更改头文件。学校作业你应该搬家
typedef struct Complex
{
double m_re;
double m_im;
}Complex;
在Complex.h中
这是因为新创建的类型ComplexP
指的是Complex
更新问题中的更改:如果头文件Complex.h
不能更改,则必须在其他.c
文件中复制Complex
类型的定义,或者创建另一个包含类型定义的头文件,并将其包含在.c
文件中。但这显然不是它的用途。你应该移动
typedef struct Complex
{
double m_re;
double m_im;
}Complex;
在Complex.h中
这是因为新创建的类型ComplexP
指的是Complex
更新问题中的更改:如果头文件
Complex.h
不能更改,则必须在其他.c
文件中复制Complex
类型的定义,或者创建另一个包含类型定义的头文件,并将其包含在.c
文件中。但这显然不是它的用途。您必须在Complex.h
中定义结构Complex
(或从主函数可见的地方)。否则,编译器将不知道Complex
有哪些成员,并且将无法访问它们。您必须在Complex.h
中定义结构Complex
(或从主函数可见的某处)。否则,编译器将不知道复杂的成员有哪些,并且将无法访问它们。“取消对不完整类型的引用指针”很好。它显示main.c
code试图访问它不知道或应该知道的结构的详细信息
a->m_im = 3;
这就是所谓的信息隐藏。complex.h
具有以下不透明指针
typedef struct Complex* ComplexP;
当然,还有其他方法(函数原型)允许访问ComplexP
内部的complex.h
,这就是main()
应该使用的方法,而不是a->m\u im=3代码>“取消对不完整类型的指针引用”很好。它显示main.c
code试图访问它不知道或应该知道的结构的详细信息
a->m_im = 3;
这就是所谓的信息隐藏。complex.h
具有以下不透明指针
typedef struct Complex* ComplexP;
当然,还有其他方法(函数原型)允许访问ComplexP
内部的complex.h
,这就是main()
应该使用的方法,而不是a->m\u im=3代码>您需要实践良好的封装。头文件通过只向前声明类型来隐藏Complex
的类型来实现这一点
头文件中必须有一些其他方法可以帮助您。你可以比较两个复数,看看它们是否相同
ComplexP a = fromCharFunc("0,1i");
ComplexP b = createCompleNumber(0,1);
if (compareComplex(a, b)) {
printf("Success\n");
} else {
printf("Try again\n");
}
或者有打印功能,例如
ComplexP a = fromCharFunc("0,1i");
printComplexNumber(a);
或者可能存在返回实部和虚部的函数:
ComplexP a = fromCharFunc("0,1i");
printf("Real: %f, Imaginary: %f\n", complexRealComponent(a), complexImaginaryComponent(a));
因为我看不到标题的其余部分,而您拒绝发布它,所以我不得不猜测函数的调用。我猜至少有一种存在。您需要实践良好的封装。头文件通过只向前声明类型来隐藏Complex
的类型来实现这一点
头文件中必须有一些其他方法可以帮助您。你可以比较两个复数,看看它们是否相同
ComplexP a = fromCharFunc("0,1i");
ComplexP b = createCompleNumber(0,1);
if (compareComplex(a, b)) {
printf("Success\n");
} else {
printf("Try again\n");
}
或者有打印功能,例如
ComplexP a = fromCharFunc("0,1i");
printComplexNumber(a);
或者可能存在返回实部和虚部的函数:
ComplexP a = fromCharFunc("0,1i");
printf("Real: %f, Imaginary: %f\n", complexRealComponent(a), complexImaginaryComponent(a));
因为我看不到标题的其余部分,而您拒绝发布它,所以我不得不猜测函数的调用。我猜其中至少有一个是存在的。因为头文件是固定的,所以发布它。有些东西是有用的,没有其他相关的东西。只是一些我还没有机会在新的.c文件中调用的方法。分配内存和创建此结构的变量并不重要。如果无法更改标头,则必须创建访问函数才能访问成员。除非可以看到结构定义,否则无法访问成员,而标头中的不透明类型不允许这样做。标题中一些未实现的函数可能提供了您所需的访问权限。正是这些“我还没有机会调用的方法”才是问题的解决方案。我理解@JonathanLeffler answer的问题。谢谢大家!!因为头文件是固定的,所以发布它。有些东西是有用的,没有其他相关的东西。只是一些我还没有机会在新的.c文件中调用的方法。分配内存和创建此结构的变量并不重要。如果无法更改标头,则必须创建访问函数才能访问成员。除非可以看到结构定义,否则无法访问成员,而标头中的不透明类型不允许这样做。大脑中一些未实现的功能