2011-05-13 58 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()。