C++ 编程问题
c++ programming problem
hi我正在尝试编译一个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++ 中的函数范围?
任何人都可以向我解释结构 cuComplex 中的代码行吗 cuComplex( float a, float b ) : r(a), i(b){}
这段代码在做什么?我们可以在结构中制作构造函数,或者这个 R(a)、I(b) 在做什么。请为我解释此代码。
错误告诉您,kernel()
在使用函数之前需要知道函数julia()
的声明。在您的代码中,它是在kernel()
之后定义的
使用前声明。 加
int julia(int x, int y);
在kernel()
定义之前。您还可以在kernel()
之前移动整个julia()
函数定义以避免错误。
任何人都可以向我解释结构体 cuComplex cuComplex( float a, float b ) 中的代码行:r(a), i(b){} 这段代码在做什么?
cuComplex( float a, float b ) : r(a), i(b){}
利用称为Initializer List
的C++概念来初始化您的成员r
和i
。
它在这里的实质作用是:
r = a;
i = b;
我们可以在结构中制作构造函数吗?
是的,您可以在结构中拥有构造函数。除了默认的访问说明符之外,C++结构和类之间没有区别,对于类,它是私有的,但在结构的情况下是公共的。
using namespace std;
行下方插入int julia(int,int);
。
这里不使用函数原型概念...根据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
的值,i
设置为 b
的值。这几乎就像在做
r = a;
i = b;
但更好。
是的,您可以在结构中使用构造函数。 结构只不过是所有成员访问级别默认为公共而不是私有的类。
好的,所以错误告诉你,当你尝试使用julia
时,还没有定义 - 但你在那里看到它,那么问题可能是什么?
答案是它还没有被定义。 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。 这样做之后,就没有什么可做的了,所以你有一个空的身体()。
其他人提到了Julia
函数定义的问题,所以我将在struct cuComplex
中添加有关代码行cuComplex( float a, float b ) : r(a), i(b){}
的说明。
这只是结构的默认构造函数。 构造函数的主体为空(因此括号之间没有任何内容),它使用成员初始化列表来初始化struct
的数据成员元素。 成员初始化列表中的初始化是在评估构造函数的主体之前执行的,因此,如果您必须从派生类初始化基类,它通常是必要的添加......但这里的情况并非如此。 由于它在这里使用,它更多的是方便和形式的问题。 从概念上讲,它与写作是一回事
cuComplex(float a, float b)
{
r = a;
i = b;
}
除非再次说明,否则初始化列表在构造函数主体之前计算。
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 此动态编程问题的自上而下方法
- 返回不停止函数,递归函数问题?(编程练习,动态规划,Levenshtein 回溯)
- 寻找解决这个动态编程问题的提示
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- 竞争性编程问题说错了答案
- 模板编程初学者问题
- 使用虚幻引擎4编程的平台游戏中的偏转问题
- 以编程方式锁定注册表项以避免并发问题
- 如何解决在使用动态 2D 数组进行矩阵乘法的 MPI 进行并行编程时的问题
- 编程:原理与实践 使用C++ 第 4 章演练步骤 6:关于数字范围的一般问题
- 我在用c ++编程时一直遇到LNK2005错误,我似乎无法弄清楚问题是什么
- 罗马数字C++编程转换问题
- 编程问题和概念
- 问题是关于C 的数组,以便在编程主题中有更多的了解
- Stroustrup的代码审查-编程原理-Ch-4-问题:3-错误:矢量下标超出范围
- 代码块上的编译器标志出现问题.编程初学者
- 由于基于接口的编程,遇到 C++ 虚拟模板函数问题
- 有没有更好的方法来解决这个问题 - 编程原理和实践使用C++:第 4 章 - 演练?