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

嗨 我正在尝试编译一个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();
}
我做错了什么? 朱莉娅在那里被定义了,为什么它会出现问题呢? 有人能解释一下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)下面编写代码>行。

好的,那么错误告诉您,当您尝试使用
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){}