我创建了一个复数数字结构并编写了函数来创建它:在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;
}
,这在Complex.h中:
typedef struct Complex* ComplexP;
因此,为了检查我做的是否正常,我在Complex.c文件中创建了一个main函数并调用了
ComplexP a = fromCharFunc("0,1i");
a->m_im = 3;
一切都运转正常。
但是当我在另一个.c文件中执行此操作时,请将其放在顶部:
#include "Complex.h"
#include <stdio.h>
#include <stdlib.h>
并且使用相同的main函数,它在main函数的第二行给出了这个错误:“取消引用指向不完整类型的指针”。我在另一篇文章中读到了它,那里的人说没有分配内存......但是我确实分配了内存,而且它没有发生在Complex.c文件中。
请帮忙。感谢
编辑:我不允许更改头文件。学校作业
答案 0 :(得分:2)
你应该移动
typedef struct Complex
{
double m_re;
double m_im;
}Complex;
Complex.h
中的。
那是因为新创建的类型ComplexP
指的是Complex
。
更新问题中的更改:如果不能更改头文件Complex.h
,则必须在另一个中复制Complex
类型的定义.c
个文件,或创建包含类型定义的另一个头文件,并将其包含在.c
文件中。但这显然不是如何使用它。
答案 1 :(得分:1)
&#34;取消引用指向不完整类型的指针&#34;很好。它表明main.c
代码试图访问它不知道的结构的细节 - 或者应该知道。
a->m_im = 3;
这称为信息隐藏。 complex.h
具有以下不透明指针。
typedef struct Complex* ComplexP;
当然还有其他方法(函数原型)允许访问ComplexP
内的complex.h
和,是main()
应该使用的而不是{{ 1}}
答案 2 :(得分:1)
您需要练习良好的封装。您的头文件通过隐藏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));
由于我无法看到标题的其余部分并且您拒绝发布它我不得不猜测函数的调用。我猜其中至少有一个存在。
答案 3 :(得分:0)
您必须在Complex
中(或从主函数可见的某处)定义结构Complex.h
。否则,编译器不会知道成员Complex
具有哪些成员并且无法访问它们。