2011-05-13 57 views
0

喜 我試圖編譯C++程序Julia集我的源代碼是繼C++編程問題

#include<stdio.h> 
#include<stdlib.h> 
#include<iostream> 
#include<cpu_bitmap.h> 
#include<book.h> 

#define DIM 20 
using namespace std; 
struct cuComplex{ 
    float r; 
    float i; 
    cuComplex(float a, float b) : r(a), i(b){} 

    float magnitude2(void) 
    { 
    return r * r + i * i; 
    } 
    cuComplex operator*(const cuComplex& a) 
    { 
    return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i); 
    } 
    cuComplex operator+(const cuComplex& a) 
    { 
    return cuComplex(r+a.r, i+a.i); 
    } 
}; 

void kernel(unsigned char *ptr) 
{ 

    for (int y=0; y<DIM; y++) 
    { 
    for (int x=0; x<DIM; x++) 
    { 
     int offset = x + y * DIM; 
     int juliaValue =julia(x, y); 
     ptr[offset*4 + 0] = 255 * juliaValue; 
     ptr[offset*4 + 1] = 0; 
     ptr[offset*4 + 2] = 0; 
     ptr[offset*4 + 3] = 255; 
    } 
    } 
} 

int julia(int x, int y) 
{ 
    const float scale = 1.5; 
    float jx = scale * (float)(DIM/2 - x)/(DIM/2); 
    float jy = scale * (float)(DIM/2 - y)/(DIM/2); 
    cuComplex c(-0.8, 0.156); 
    cuComplex a(jx, jy); 
    int i = 0; 
    for (i=0; i<200; i++) 
    { 
    a = a * a + c; 
    if (a.magnitude2() > 1000) 
    { 
     return 0; 
    } 
    return 1; 
    } 
} 

int main(void) 
{ 
    CPUBitmap bitmap(DIM, DIM); 

    unsigned char *ptr = bitmap.get_ptr(); 

    kernel(ptr); 
    bitmap.display_and_exit(); 
} 

但是當我編譯它,我得到了以下錯誤:

compiling command : g++ -I /usr/local/cuda/include 5.cpp 

errors:5.cpp: In function ‘void kernel(unsigned char*)’: 
5.cpp:36: error: ‘julia’ was not declared in this scope 

我做錯了什麼? 茱莉亞被定義在那裏,爲什麼它顯示問題? 任何人都可以解釋我有關C++函數的作用域?

任何機構都可以解釋我在struct cuComplex中的代碼行 cuComplex(float a, float b) : r(a), i(b){}這段代碼正在做什麼? 我們可以在結構中做構造函數,或者這個r(a),我(b)在做什麼。 請爲我解釋這段代碼。

+0

如果您可以將示例代碼範圍縮小到產生相同錯誤的最小示例,那麼不僅人們可以更快地幫助您,而且您可能可以自行計算出結果。有時需要很多代碼才能解釋發生了什麼問題,但這不是其中之一。 – 2011-05-13 04:41:07

+0

@Chris它是一個非常明顯的答案,所以它沒有問題。如果他沒有發佈編譯器錯誤,_that_會是一個問題。 – 2011-05-13 04:43:34

+0

@Seth - 這是真的,但之前它一直是個問題,所以我通常在看到大量代碼時關閉。 – 2011-05-13 04:44:57

回答

5

錯誤是告訴你kernel()在使用之前需要知道函數julia()的聲明。在您的代碼中它被定義爲kernel()

在使用前聲明它。 Add

int julia(int x, int y); 

kernel()之前的定義。您也可以在kernel()之前移動整個julia()函數定義以避免錯誤。

任何機構可以解釋我在結構cuComplex cuComplex代碼行(浮起,浮動B):R(A),I(B){}這是什麼代碼是幹什麼的?

cuComplex(float a, float b) : r(a), i(b){} 

使用稱爲Initializer List一個C++的概念來初始化成員r & i
什麼它本質上確實是在這裏:

r = a; 
i = b; 

我們可以做的構造結構?
是的,您可以在結構中有一個構造函數。有除默認訪問說明一個C++結構&類之間沒有區別,這是私人公共的情況下在一個結構的情況下。

+0

+1,因爲您還回答了關於初始化程序列表的問題。 – 2011-05-13 04:42:52

+0

給我「這就是所謂的解釋或解決方案」。這是我從這個網站得到的最好的答案。非常感謝你 – user513164 2011-05-13 04:55:42

+0

@ user513164:謝謝:)快樂學習:) – 2011-05-13 05:05:25

0

在聲明之前,您正在使用julia。添加原型它上面,你在kernel使用它:

int julia(int x, int y); 

這將告訴編譯器將有一個名爲julia函數有兩個int參數。

或者,您可以簡單地將julia的定義移動到kernel以上的位置。隨你便。

至於struct cuComplex cuComplex(float a, float b) : r(a), i(b){}行,:之後的內容是初始值列表。這是一種爲構造函數中的對象設置成員變量值的方法。

要使用它,請將該變量的名稱,然後將其設置爲括號中的值。您應該儘可能使用它,因爲在構造函數本身內部設置變量會更高效。

在您的示例中,您將r設置爲ai的值爲值b。這幾乎就像做

r = a; 
i = b; 

但更好。

是的,你可以在結構中使用構造函數。結構只不過是所有成員訪問級別都默認爲public而不是private的類。

1

這裏沒有使用函數原型概念...根據ANSI標準,我們必須在函數首次使用之前聲明函數,或者在函數的簽名必須在用於成功編譯之前明確聲明。

定義可提供在連接的時候......如果在其他一些文件中的簽名應與關鍵字「的extern」被preeceded功能...

的代碼,否則似乎是正確的....

0

其他人已經提到了Julia的函數定義問題,所以我會在struct cuComplex的內部添加關於代碼行cuComplex(float a, float b) : r(a), i(b){}的註釋。

這只是該結構的默認構造函數。構造函數的主體是空的(因此括號內沒有任何內容),它使用成員初始化列表來初始化struct的數據成員元素。成員初始化列表中的初始化在構造函數的主體評估之前執行,所以如果您不得不從派生類初始化一個基類,那麼它通常是必要的添加......但這不是這種情況。正如它在這裏使用的,它更多的是方便和形式。從概念上講這是同樣的事情寫

cuComplex(float a, float b) 
{ 
    r = a; 
    i = b; 
} 

除非再次如前所述,初始化列表構造函數體之前評估。

2

您需要在您的using namespace std;行下面插入int julia(int,int);

0

好的,所以錯誤告訴你,當你嘗試使用julia還沒有定義 - 但你看到它,那麼問題是什麼?

答案是它尚未定義還有。C,就像很多語言一樣,基本上被安排成一種「一次通過」的語言;也就是說,編譯器從上至下讀取源一次,並且如果您第一次使用它時尚未定義某些內容,則會出現錯誤。

有兩個solutinos這樣:

  1. 它的定義之前,可以使任何時候都不會使用安排您的來源,或
  2. 你可以什麼叫做「前進declaratino」。

在這種情況下,最簡單的方法,只是安排所需順序的東西,所以你必須

struct cuComplex {...} 
    int julia(int x, int y){...} 
    void kernel(unsigned char * ptr){...} 

的特殊語法

cuComplex(float a, float b) : r(a), i(b){} 

defgines一個構造函數,有兩個參數,一個和b。然後它使用a的值初始化成員r,使用b的值成員i初始化成員r。完成之後,沒有什麼可做的了,所以你有一個空的body()。