2012-01-08 39 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