C++ c++;程序设计问题
嗨 我正在尝试编译一个C++程序,朱丽亚的程序集我的源代码是遵循C++ c++;程序设计问题,c++,c,C++,C,嗨 我正在尝试编译一个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( f
#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();
}
我做错了什么?
朱莉娅在那里被定义了,为什么它会出现问题呢?
有人能解释一下C++中的函数范围吗?
有人能解释一下struct cuComplex中的代码行吗
cuComplex(float a,float b):r(a),i(b){}
这段代码在做什么?
我们能在结构中构造构造器吗?或者这个r(a),i(b)在做什么。
请给我解释一下这个代码。在声明之前,您正在使用
julia
。将它的原型添加到您在内核中使用它的地方:
int julia(int x, int y);
这将告诉编译器将有一个名为julia
的函数,它接受两个int
参数
或者,您可以简单地将julia
的定义移动到内核中使用它的位置。这取决于你
对于struct-cuComplex-cuComplex(float a,float b):r(a),i(b){}
行,:
后面的内容是初始值设定项列表。它是为构造函数中的对象设置成员变量值的一种方法
要使用它,请将变量名和要设置的值放在括号中。您应该尽可能地使用它,因为它比在构造函数内部设置变量更有效
在您的示例中,您将r
设置为a
的值,将i
设置为b
的值。这几乎就像
r = a;
i = b;
但更好
是的,可以在结构中使用构造函数。结构只不过是所有成员访问级别默认为public而不是private的类。错误告诉您,内核()
在使用函数之前需要知道函数的声明。在您的代码中,它是在kernel()之后定义的
使用前先声明。加
int julia(int x, int y);
在kernel()
定义之前。您还可以将整个julia()
函数定义移动到kernel()
之前,以避免出现错误
有人能解释一下struct cuComplex cuComplex(float a,float b):r(a),i(b){}中的代码行吗?
< P>使用C++概念,称为“代码>初始化器列表”初始化成员:代码> R< /代码>代码> I>代码> BR>
它在这里的基本作用是:
r = a;
i = b;
我们可以在结构中创建构造函数吗?
是,可以在结构中使用构造函数。除了默认访问说明符之外,C++结构和类之间没有区别,在<强>类< /强>情况下,<>强>私下>强,但是<强> >公共< /强>在<强>结构< /强>的情况下。p> 此处不使用功能原型概念。。。根据ANSI标准,我们必须在首次使用函数之前声明函数,或者至少在使用函数之前必须明确声明函数的签名,以便成功编译
链接时可以使用定义…如果其他文件中的函数,则签名应使用关键字“extern”预先放弃
代码在其他方面似乎是正确的。其他人已经提到了Julia
的函数定义问题,因此我将在struct-cuComplex
中添加关于代码行cuComplex(float a,float b):r(a),I(b){/code>的注释
这只是结构的默认构造函数。构造函数的主体是空的(因此括号之间没有任何内容),它使用成员初始化列表初始化结构的数据成员元素。成员初始化列表中的初始化是在计算构造函数主体之前执行的,因此,如果您必须从派生类初始化基类,则它通常是一个必要的添加项。。。但事实并非如此。在这里使用它,更多的是为了方便和形式。从概念上讲,这和写作是一样的
cuComplex(float a, float b)
{
r = a;
i = b;
}
除非另有说明,初始化列表在构造函数主体之前进行计算。您需要插入int julia(int,int)使用名称空间std在下面编写代码>代码>行。好的,那么错误告诉您,当您尝试使用julia
is时,它还没有被定义——但是您在那里看到了它,那么问题出在哪里呢
答案是它还没有被定义。C、 像许多语言一样,基本上被安排成一种“一次性”语言;也就是说,编译器从上到下读取源代码一次,如果您在第一次使用它时没有定义某些内容,则会出现错误
有两种解决方案:
您可以安排您的源,以便在定义之前不使用任何内容,或者
你可以做一个所谓的“前向声明”
在这种情况下,最简单的方法是按照所需的顺序安排事情,因此
struct cuComplex {...}
int julia(int x, int y){...}
void kernel(unsigned char * ptr){...}
独特的语法
cuComplex( float a, float b ) : r(a), i(b){}
定义接受两个参数a和b的构造函数。然后用a值初始化成员r,用b值初始化成员i。这样做之后,就没有什么可以做的了,所以您的正文()是空的。如果您可以将示例代码缩小到产生相同错误的最小示例,不仅人们会更快地帮助您,而且您可能能够自己解决它。有时需要很多代码来解释什么地方出了问题,但这不是其中之一。@Chris这是一个非常明显的答案,所以没有问题。如果他没有发布编译器错误,那将是一个问题。@Seth-这是真的,但它以前是一个问题,所以当我看到大量代码时,我通常会关闭它。+1,因为你也回答了关于初始值设定项列表的问题。对我来说,“这就是所谓的解释或解决方案”。这是我见过的最好的答案
struct cuComplex {...}
int julia(int x, int y){...}
void kernel(unsigned char * ptr){...}
cuComplex( float a, float b ) : r(a), i(b){}