在C ++ MinGW中使用Pow。工作硬编码,但没有变量

时间:2013-05-18 06:46:49

标签: c++ variables pow

希望这是一个简单的链接器问题,但我花了几个小时搜索,并且在那个时候没有向前推进。我试图使用

 #include <cmath>
 double aA = 2;
 double result = pow((double)2.0,(double)aA);

我没有收到错误消息,它编译没有问题。但是我用openGL绘制的无关网格无法显示。如果我将aA替换为2则显示网格。喜欢

 #include <cmath>
 double aA = 2;
 double result = pow((double)2.0,(double)2);

按预期输出4。前面的例子没有输出。好像程序挂起但没有错误。

这个计算并没有在任何地方使用,实际上只是位于main(或其他任何地方),变量是唯一的并且未使用。

我在Windows 7中使用code :: blocks和minGW GNU GCC编译器。-g -Wall - WExtra

使用glew + freeglut进行渲染,其他一切正常,直到我使用带变量的变量。

我已经尝试了我能想到的每一个铸造组合,并且我尝试过具有完全相同结果的powf。我使用sqrt和其他函数,所以相信包含是有效的。我也尝试过math.h,但也遇到了同样的问题。

我从来没有希望看到来自编译器的错误消息比我现在更多。

所以1.为什么我看到它停止整个程序的轨道时没有出现错误? 2.我错过了什么让pow()使用变量?

更新:创建新项目并尝试后,我没有任何问题,因此我的设置中必定存在某些干扰。我会一直在试验。感谢您的快速回复,确保在这里快速行动!

更新2:

很奇怪。

  float aAs = 1.0;
  float amplitudeA = (float)pow((float)2.,(float)aAs);

  char str[50];
  int test = (int) (amplitudeA);
  sprintf (str, "out - %d", test);
  MessageBox(NULL,str,NULL,NULL);

此消息框中输出2。然后我的网格绘制和程序行为。如果我只注释消息框,那么:

  float aAs = 1.0;
  float amplitudeA = (float)pow((float)2.,(float)aAs);

  char str[50];
  int test = (int) (amplitudeA);
  sprintf (str, "out - %d", test);
  //MessageBox(NULL,str,NULL,NULL);

没有绘制我的网格。可能是什么导致了这个?

  char str[50];
  int test = (int) (1);
  sprintf (str, "out - %d", test);
  MessageBox(NULL,str,NULL,NULL);

  float aAs = 1.0;
  float amplitudeA = (float)pow((float)2.,(float)aAs);

交换消息框重新创建问题。没有绘制网格。当我在pow中使用变量时,好像需要将焦点从程序中删除。我完全不知所措。

另一个更新:我通过编写自己的简单powerOf函数暂时解决了这个问题。但是现在我对cos()函数有同样的问题。

sigh 谁能告诉我这个图像是否有问题?这个问题源于错误的链接。这是你对gcc中代码:: blocks中的coz悬停所期望的吗?

这个错误仅在通过带有错误的cos调用的程序运行时发生。有趣的是,自从我开始使用此应用程序以来,我一直在使用cos进行相机计算。

Error #667: UNADDRESSABLE ACCESS: reading 0x00000003-0x00000007 4 byte(s)
# 0 ntdll.dll!RtlImageNtHeader          +0x124c   (0x77ca43d0 <ntdll.dll+0x343d0>)
# 1 ntdll.dll!RtlImageNtHeader          +0x422    (0x77ca35a7 <ntdll.dll+0x335a7>)
# 2 ntdll.dll!RtlImageNtHeader          +0x30d    (0x77ca3492 <ntdll.dll+0x33492>)
# 3 KERNEL32.dll!HeapFree               +0x13     (0x775e14dd <KERNEL32.dll+0x114dd>)
# 4 atioglxx.dll!atiPPHSN               +0x11afaa (0x66538f3b <atioglxx.dll+0xeb8f3b>)
# 5 atioglxx.dll!DrvSwapBuffers         +0x33fb   (0x6569b9cc <atioglxx.dll+0x1b9cc>)
# 6 atioglxx.dll!DrvSwapBuffers         +0x3cad   (0x6569c27e <atioglxx.dll+0x1c27e>)
# 7 atioglxx.dll!DrvSwapBuffers         +0x7c57   (0x656a0228 <atioglxx.dll+0x20228>)
# 8 atioglxx.dll!DrvSwapBuffers         +0x12c    (0x656986fd <atioglxx.dll+0x186fd>)
# 9 atioglxx.dll!DrvValidateVersion     +0x28     (0x65697c19 <atioglxx.dll+0x17c19>)
#10 OPENGL32.dll!wglSwapMultipleBuffers +0xc5d    (0x66c8af0b <OPENGL32.dll+0x3af0b>)
#11 OPENGL32.dll!wglSwapMultipleBuffers +0xe45    (0x66c8b0f3 <OPENGL32.dll+0x3b0f3>)
Note: @0:00:05.233 in thread 3136
Note: instruction: mov    0x04(%ecx) -> %ecx

1 个答案:

答案 0 :(得分:0)

解决。有一个未初始化的变量位于我用来绘制网格的顶点缓冲区对象的底部。无论出于何种原因,将变量提供给其中一个数学函数会导致此缓冲区对象出现意外结果。

感谢Angew和Kos指点我的记忆。