繁体   English   中英

C ++编程问题

[英]c++ programming problem

嗨,我正在尝试编译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

我做错了什么? 茱莉亚(Julia)被定义在那里,为什么它显示问题? 有人可以向我解释一下c ++中的功能范围吗?

谁能cuComplex( float a, float b ) : r(a), i(b){}我解释struct cuComplex cuComplex( float a, float b ) : r(a), i(b){}的代码行cuComplex( float a, float b ) : r(a), i(b){}该代码在做什么? 我们可以构造结构的构造函数还是r(a),i(b)在做什么。 请为我解释这个代码。

错误告诉您kernel() julia()在使用之前必须知道函数julia()的声明。 在您的代码中,它是在kernel()之后定义的

使用前请声明。

int julia(int x, int y); 

kernel()定义之前。 您也可以将整个julia()函数定义移至kernel()之前,以避免出现错误。

谁能向我解释struct cuComplex cuComplex(float a,float b)中的代码行:r(a),i(b){}该代码在做什么?

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

利用称为Initializer List的C ++概念初始化成员ri
它在这里的主要作用是:

r = a;
i = b;

我们可以在结构中构造构造函数吗?
是的 ,您可以在结构中有一个构造函数。 除了默认的访问说明符外,C ++结构和类之间没有区别,默认访问说明符在类的情况下是私有的 ,而在结构的情况下是公共的。

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

函数原型概念不在此处使用...根据ANSI标准,我们必须在首次使用函数之前声明函数,或者在成功使用函数之前必须明确声明函数的签名。

链接时可以使用定义...如果函数在其他文件中,则签名应以关键字'extern'开头...

该代码否则似乎是正确的.....

您在声明之前使用了julia 将其原型添加到您在kernel使用它的位置上方:

int julia(int x, int y);

这将告诉编译器将存在一个名为julia的函数,该函数带有两个int参数。

另外,您可以简单地将julia的定义移到您在kernel使用它的位置。 由你决定。

至于struct cuComplex cuComplex( float a, float b ) : r(a), i(b){}行, :之后的内容是初始化列表 这是一种在构造函数中为对象设置成员变量的值的方法。

要使用它,请将变量名放在后面,然后将其设置为括号内的值。 您应该尽可能使用它,因为它比在构造函数本身内部设置变量更有效。

在您的示例中,将r设置为a的值, a i设置为b的值。 几乎就像在做

r = a;
i = b;

但更好。

是的,您可以在结构中使用构造函数。 struct只是类,所有成员访问级别默认为public而不是private。

其他人所说的与函数定义中的问题Julia ,所以我会添加有关代码行记cuComplex( float a, float b ) : r(a), i(b){}内部struct cuComplex

这只是该结构的默认构造函数。 构造函数的主体为空(因此括号之间没有任何内容),并且它使用成员初始化列表来初始化struct的数据成员元素。 成员初始化列表中的初始化是在构造函数的主体被求值之前执行的,因此,如果您必须从派生类中初始化基类,那么这通常是必要的补充……但这不是这种情况。 在这里使用时,更多的是方便和形式。 从概念上讲,这与写作是一回事

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

除非另有说明,否则初始化列表在构造函数主体之前进行评估。

好的,所以错误告诉您,当您尝试使用julia未定义-但您在那里看到它,那可能是什么问题?

答案是,它尚未确定。 像许多语言一样,C基本上被安排成一种“单程”语言。 也就是说,编译器从上至下一次读取源代码,并且如果您在首次使用它时未定义某些内容,则会收到错误消息。

有两个解决方案:

  1. 您可以安排您的来源,以便在定义之前不使用任何内容,或者
  2. 您可以进行所谓的“转发声明”。

在这种情况下,最简单的方法是按所需顺序排列事物

   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。 完成此操作后,无需执行任何操作,因此您有一个空的正文()。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM