簡體   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