在这个C++教程的标题为"标准异常"的部分中,有一个示例代码,它使用从STL中的标准异常类派生的类:
// standard exceptions
#include <iostream>
#include <exception>
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex; //Declares an instance of myexception outside of the main function
int main () {
try
{
throw myex;
}
catch (exception& e) //My question is regarding this line of code
{
cout << e.what() << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该代码打印出来My exception happened.但是,如果我删除&符号,它会打印出来std::exception,这是what() …
我正在尝试通过Jason L. McKesson的"学习现代3D图形编程"来学习3D图形编程.
我还没有真正看过其他指南,但本指南似乎强调了3D图形背后的理论和数学.现在,我被困在这个页面上:
http://www.arcsynthesis.org/gltut/Positioning/Tut04%20Perspective%20Projection.html
我不确定他的相机空间意味着什么,以及为什么有必要将3D世界投射到2d表面上.这个问题有点模糊,所以不是一个完整的解释,也可能会给我提供一种解释这些概念的不同方式的链接.
对于图形课程,我们在WebGL中实现粒子系统.在JavaScript中进行粒子模拟计算会非常慢,我们的教授希望我们在GPU上进行粒子模拟.
为了做这个粒子模拟,我想我们上传一个包含我们的粒子数据(位置,速度,质量等)的顶点缓冲区,然后让我的顶点着色器为模拟做一些数学运算,并将结果写入不同的顶点缓冲区,表示粒子的下一个状态.然后我可以gl.POINTS使用不同的着色器程序渲染我的粒子进行渲染.
这似乎是变换反馈,我在这里学习:http://open.gl/feedback
但是,似乎转换反馈目前不包含在WebGL中.这篇博客文章称,WebGL 2.0将提供转换反馈.实际上,当我尝试这样的语句时gl.beginTransformFeedback;,我得到一个错误,说明方法没有定义.
如果变换反馈不可用,我应该如何在WebGL中进行粒子模拟?
(foldr + 0 '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)
回报10这是我所期望的,但是
(foldr and false '(true true false))
Run Code Online (Sandbox Code Playgroud)
给了我错误
and: expected an open parenthesis before and, but found none
Run Code Online (Sandbox Code Playgroud)
foldr采用一个函数(它有两个参数,因为我有一个列表),一个基本情况和一个列表.我希望我的第二行代码返回true如果列表的布尔值超过零并且它们都是真的,那就是我认为它会起作用的方式.但显然不是.
考虑到何时使用哪一个,我仍然不确定指针与引用语义.
现在,我的印象是引用本质上是指针,必须在声明时初始化,然后从那一点开始就不能指向其他任何东西.换句话说,它们就像Type* const(不Type const*),或者,它们不能被重新安置.它基本上成为该对象的"新名称".现在我听说编译器实际上并不需要使用指针来实现引用,但我认为你仍然可以用这种方式来考虑它们,关于它们的可见行为是什么.
但为什么你不能这样做:
int& foo = new int;
Run Code Online (Sandbox Code Playgroud)
我想创建一个动态内存的引用.这不编译.我收到了错误
error: invalid initialization of non-const reference of type 'int&' from a temporary of type 'int*'
Run Code Online (Sandbox Code Playgroud)
这对我来说很有意义.似乎新的操作符将给定类型的指针返回给操作系统的内存地址?动态分配给我.
那么如何创建动态内存的"引用"呢?
编辑:可以理解为精确解释C++中引用和指针之间差异的资源的链接.
我试图了解锁是如何工作的.
假设我想在C++中实现一个非常简单的锁
class Resource{
public:
bool lock();
void unlock();
... methods to change/read the Resource ...
private:
bool isLocked;
}
Run Code Online (Sandbox Code Playgroud)
Resource调用的用户lock(),如果isLocked为true,则lock()返回false,并且Resource的用户必须等待或执行其他操作.如果isLocked为false,则lock()设置isLocked为true,并返回true.然后调用者可以对资源做任何他想做的事情.他之后调用unlock()资源设置isLocked为false.
但是,如果资源的两个用户lock()在同一时间呼叫怎么办?这种情况很少发生吗?我认为更正式地说,这涉及使lock()操作"原子化",尽管我不确定这个词是什么意思.
这有点让我发疯.
int a = 0xffffffff;
int b = 32;
cout << (a << b) << "\n";
cout << (0xffffffff << 32) << "\n";
Run Code Online (Sandbox Code Playgroud)
我的输出是
-1
0
Run Code Online (Sandbox Code Playgroud)
为什么我没有得到
0
0
Run Code Online (Sandbox Code Playgroud) 使用标准的IEEE浮点数,a + -a保证完全0适用于任何值a?
我想象a并且-a具有完全相同的位表示,减去符号位,因此将它们加在一起0肯定会产生,但我不确定.
int main ()
{
try
{
try
{
throw 5;
}
catch (int n)
{
throw;
}
}
catch (...)
{
cout << "Exception occurred";
}
}
Run Code Online (Sandbox Code Playgroud)
这打印出"异常发生"但是
int main ()
{
try
{
try
{
throw;
}
catch (...)
{
throw;
}
}
catch (...)
{
cout << "Exception occurred";
}
}
Run Code Online (Sandbox Code Playgroud)
这只是错误.看起来我正在尝试捕捉完全一样!唯一的区别是,在第一种情况下我抛出一个int,然后是一般异常,但在第二种情况下,我两次抛出一般异常.程序是否混淆了去哪个捕获?
我正在看这段代码,语法有麻烦:
struct Instance
{
typedef glm::vec3(*OffsetFunc)(float);
OffsetFunc CalcOffset;
glm::mat4 ConstructMatrix(float fElapsedTime)
{
glm::mat4 theMat(1.0f);
theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);
return theMat;
}
};
Run Code Online (Sandbox Code Playgroud)
它是C ++代码,与OpenGL有关,但我的问题不是关于OpenGL。的glm::vec3, vec4, mat4是尺寸3和4的只是载体和MAT4是4×4的方阵。glm库中有重载的运算符,因此如下所示:
theMat[3] = glm::vec4(CalcOffset(fElapsedTime), 1.0f);
可以按您期望的那样工作,theMat用一个由1.0fcast或typedef或函数调用组成的4-d向量填充第4列,我不确定是什么,这就是我的问题。
是什么typedef glm::vec3(*OffsetFunc)(float);和CalcOffset(fElapsedTime)意味着什么?
我尝试在这里阅读:http : //en.wikipedia.org/wiki/Typedef#Using_typedef_with_type_casts,但是这种解释对我而言似乎没有任何意义。
编辑:我知道typedef仅在为类型提供另一个别名时是如何工作的。
编辑2:我认为这可能是使用一个指向函数的指针来做的,因为它看起来像一个指针,并且float在那里像它的一个函数参数类型,似乎是这种情况,但我仍然不是确定这类代码究竟是做什么的。
几乎每场比赛都倾向于使用一些游戏循环.Gafferongames有一篇关于如何制作精心设计的游戏循环的精彩文章:http://gafferongames.com/game-physics/fix-your-timestep/
在他的代码中,他使用integrate( state, t, deltaTime );,我相信state包含对象的位置,速度和加速度.他用RK4将其从整合t到t+deltaTime.
我的问题是,为什么使用像RK4这样的数值积分技术,当你可以使用运动学方程(这里)找到确切的值?
这些方程在加速度恒定时起作用.你似乎很少会在一个时间步长内改变加速度.看起来RK4是一种性能更低,精度更低,更复杂的解决方案.
编辑:我认为您可以为对象添加"混蛋"值,如果您真的想要,仍然可以找到加速度,速度和位移的精确表达式.
编辑2:嗯,我没有仔细阅读他的"集成基础知识"文章.我认为他正在对阻尼器和弹簧进行建模,这会在一个时间步长内造成非恒定的加速度.
int d;
cin >> d;
int asdf[d];
Run Code Online (Sandbox Code Playgroud)
这被认为是动态内存分配吗?根据http://www.cplusplus.com/doc/tutorial/dynamic/,似乎我甚至不能编译它,因为不使用new运算符的数组只能声明为常量,也许我读错了.(我正在使用CodeBlocks和GNU CCC编译器)
它和之间的区别是什么?
int d;
int *asdf;
cin >> d;
asdf = new int[d];
Run Code Online (Sandbox Code Playgroud)
在删除之前,使用新生命创建的数组是唯一的区别,而第一个数组在离开范围后会立即释放吗?