2012-01-08 73 views
1

我在编译程序时遇到了一些麻烦,现在我认为现在大部分问题都是我一直在寻找它太久......该计划的这一一个部分编译错误C2059,C2061,C2146和偶发性智能感知错误

概述:你有长方形,你要转换到极坐标形式复数(由结构“情结”表示)的复数(由代表结构“pComplex”)

试图建立时,我得到这些错误,每三次:

"error C2059: syntax error: ')'" 
"error C2059: syntax error: ';'" 
"error C2061: syntax error: identifier 'c1'" 
"error C2146: syntax error: missing ')' before identifier 'c1'" 

此外,我收到IntelliSense: identifier "Complex" is undefined,但只有直到点击有问题的线路,然后它消失。

所有错误指向相同的头文件的同一行(pcomplex.h):的pcomplex.h

pComplex NF_convert_c2_pcdouble(Complex c1); 

相关部分:

#ifndef PCOMPLEX_H 
#define PCOMPLEX_H 
#include "complex.h" 
#include <math.h> 
// 
// ... 
// 
typedef struct nf_complex_polar{ 
    double r; 
    double angle; 
} pComplex; 
// 
// ... 
// 
pComplex NF_convert_c2_pcdouble(Complex c1); 
// 
// ... 
// 
#endif 

complex.h相关部分:

#ifndef COMPLEX_H 
#define COMPLEX_H 
#include "pcomplex.h" 
#include <math.h> 
// 
// ... 
// 
typedef struct nf_complex{ 
    double real; 
    double imag; 
} Complex; 
// 
// ... 
// 
Complex NF_convert_pc2_cdouble(pComplex pc1); 
// 
// ... 
// 
#endif 

我注意到,当我悬停ov呃函数名在pcomplex.c

pComplex NF_convert_c2_pcdouble(Complex c1) 
{ 
    //This function converts a rectangular form complex number c1 
    // and returns it as a polar form complex number pc1 
    pComplex pc1; 
    double x, y, r, a; 
    x = c1.real; 
    y = c1.imag; 
    r = sqrt(x*x + y*y); 
    a = atan2(y,x); 
    pc1.r = r; 
    pc1.angle = a; 
    return pc1; 
} 

我得到这个包含一个小弹出框,我不知道是什么,第二行表示:

pComplex NF_convert_c2_pcdouble(Complex c1) 

pComplex NF_convert_c2_pcdouble(<error-type> c1) 

这是足够的信息和代码的优点寻求帮助来搞清楚这一点?两个头文件大约每行100行,相应的源文件大约有1000行...所以我试图保持它的相关性。

+0

请标记功课 – 2012-01-08 08:25:00

回答

1

你是用C还是用C++编码?如果使用C++编码,定义-应该是更好的风格。

同时具有pcomplex.hcomplex.h包括彼此是一个糟糕的设计。包含图应该是DAG

我建议将两个标题合并成一个标题,其中包含CartesianComplexPolarComplex类型。

(我猜你的老师不希望你使用的标准头定义复数)

+0

谢谢您的回复!我在C编码。我合并了两个标题,不再收到错误。 – SVC 2012-01-08 16:30:37

2

你定义两种类型,ComplexpComplex,并且声明两个函数,每个取决于两个类型定义。

无论你如何组织#include指令,编译需要看到类型定义之前,它可以处理函数声明。

但你有一个报头,其限定的类型之一,然后宣称的功能之一,以及定义其他类型的后跟另一功能的另一头。有没有顺序可以编译头,这将使该类型定义可见,他们需要的人。

(注意typedef s的相当奇怪实现用C的语法,其结果是,以typedef的引用尚未一般定义显示为一个语法错误,而不是作为一种更简单的“未声明的标识符”错误。)

一种解决方案是将类型定义和函数定义分成四个单独的头文件,与#include指令所要表达的依赖关系。

一个简单的办法是你的两个头文件合并为一个,与typedef秒,然后由函数声明。

正如Basile所说,拥有两个标题包含对方是很少的,如果永远是一个好主意。在包括警卫阻止无限递归,但他们也阻止了一些声明被以依赖于他们的代码可见。

+0

+1。我认为这留下了两个合理的选择。一个是合并头文件。另一种是选择哪个更低级(例如矩形),哪个更高。较高的头部可以包括较低的头部,并定义引用其类型的函数,但反之亦然。所以这两个转换函数都会在极坐标中。 – ugoren 2012-01-08 20:01:42