无法访问另一个.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; }

我创建了一个复数结构,并编写了如下函数来创建它:在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;
    }

    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文件中调用的方法。分配内存和创建此结构的变量并不重要。如果无法更改标头,则必须创建访问函数才能访问成员。除非可以看到结构定义,否则无法访问成员,而标头中的不透明类型不允许这样做。大脑中一些未实现的功能