好了,我最近得到了OpenGL的OpenGL超级,并设置上的目录编号:: Blocks的以freeglut和GLTools.h,但这些#include声明将无法正常工作:
#include <GLtools.h>
#include <GLShaderManager.h>
#include <iostream>
#include <GL/glut.h>
Run Code Online (Sandbox Code Playgroud)
要设置目录,我通过"设置" - >"编译器和调试器..." - >"搜索目录"选项卡,并在"编译器"选项卡下添加它(还有"链接器"和"资源编译器"选项卡):
C:\CodeBlocks\SB5\Src\GLTools\include
Run Code Online (Sandbox Code Playgroud)
和
C:\CodeBlocks\SB5\freeglut-2.6.0\include
Run Code Online (Sandbox Code Playgroud)
这些是我得到的错误:
C:\CodeBlocks\SB5\freeglut-2.6.0\include\GL\freeglut_std.h|60|warning: "NOMINMAX" redefined|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\include\c++\mingw32\bits\os_defines.h|46|warning: this is the location of the previous definition|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|225|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|226|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|227|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|228|error: expected constructor, destructor, or type conversion before 'void'|
c:\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\GL\glu.h|229|error: 'GLAPI' does not name …Run Code Online (Sandbox Code Playgroud) 简短的问题:以下代码使用其他编译器是不安全的(mingw32),还是有效使用?
list<int> l;
/* add elements */
list<int>::iterator i = l.begin();
i--;
i++;
cout << *i << endl;
Run Code Online (Sandbox Code Playgroud)
...或换句话说:被i定义为指向l.begin()此之后?
简而言之:我想要的只是以最基本的方式在屏幕上显示像素数据,而不会失去跨平台兼容性.
我之前曾经问过类似的问题,但他们似乎并没有朝着我正在寻找的方向前进.
基本上,我正在创建自己的小游戏库,我打算将它用于我自己的2D像素艺术游戏.所有像素处理由我自己处理,现在我一直在寻找一个绝对最小的解决方案来启动一个窗口,听它的事件(鼠标,键盘,窗口事件)和绘制我的像素.如果库可以处理线程和/或音频,则会获得奖励.
在这个阶段我不需要任何OpenGL支持,我不确定我会不会.除了提到的那些之外,我真的不需要任何功能.我应该自己开始使用Windows,X11和OSX API,还是在那里有一个真正的极简主义框架?是否让我自己的平台独立的极简主义框架真的很辛苦?如果不是那么大的交易,我可能只是出于纯粹的好奇心来调查这个解决方案.
如果你有任何关于我自己与发现有用的东西的见解,我会全力以赴.
谢谢!
编辑:简而言之......
我有高级语言的编程经验,并且几周前开始使用普通C编码(出于学术原因).我想实现类似于的数据结构map<char,myStruct*>.
如果这还不够清楚:我希望将每个可能的SINGLE"映射" char到指向我在其他地方定义的结构的指针上.如果有一种方法可以确保没有2 char秒可以指向相同的struct(char在将新元素插入地图时不检查其他内容)那将是整洁的,但这不是绝对必要的.我还需要能够从地图中删除配对,并重新插入具有相同键但不同指针的配对.
我已经想到了这一点,并认为我可以创建一个指针数组所有可能的字符长度,并只使用char作为数组索引存储相应的指针(因为它只是一个数字常量).这可能非常有用,但如果我最终在我的应用程序中只使用几个字符,那么为地址分配那么多空间似乎效率低下.
尽管如此,我还是没有想到任何替代解决方案(考虑到我是C新手,不是那么令人惊讶).我会很感激任何,甚至模糊的建议,朝着正确的方向前进.
我对C很新,当他们引用字符串时我会遇到数组和指针.我可以要求输入2个数字(整数),然后返回我想要的那个(第一个数字或第二个数字),没有任何问题.但是,当我请求名称并尝试返回它们时,程序在输入第一个名称后崩溃并且不确定原因.
从理论上讲,我希望为名字保留内存,然后将其扩展为包含第二个名称.任何人都能解释为什么这会破裂
谢谢!
#include <stdio.h>
#include <stdlib.h>
void main ()
{
int NumItems = 0;
NumItems += 1;
char* NameList = malloc(sizeof(char[10])*NumItems);
printf("Please enter name #1: \n");
scanf("%9s", NameList[0]);
fpurge(stdin);
NumItems += 1;
NameList = realloc(NameList,sizeof(char[10])*NumItems);
printf("Please enter name #2: \n");
scanf("%9s", NameList[1]);
fpurge(stdin);
printf("The first name is: %s",NameList[0]);
printf("The second name is: %s",NameList[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我只是偶然发现了一个来自智能指针的演员,想要检查是否static_cast可以在编译时声明以下是无意义的:
int main()
{
char foobar[4] = "Foo";
std::unique_ptr<char[]> myptr = static_cast<decltype(myptr)>(foobar);
myptr.reset();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里发生的是myptr尝试释放foobar.
我不是在问什么是智能指针或如何分配或以其他方式修复上述内容.
我认为这个问题应该在编译时捕获,因为这些类型应该是完全不兼容的.
为什么在编译时没有检测到这个?
我对此处提供的解释有疑问http://www.parashift.com/c++-faq/virtual-functions.html#faq-20.4
在示例代码中的函数mycode(Base *p),调用virt3方法为p->virt3().在这里,编译器如何知道virt3是在第三个插槽中找到的vtable?它如何与之比较?
在我的DirectX程序中,我编写了一个循环,它遍历std :: string然后我运行了性能分析器,并意识到这个循环消耗了极大的CPU时间.当我运行我的程序时,我有大约1300 FPS.所以我决定用这个做点什么,我把基于范围的循环改为典型的迭代.我的意思是我改变了:
for( char c : std_string_name )
Run Code Online (Sandbox Code Playgroud)
至
for(size_t i=0; i<std_string_name.size(); ++i )
{ char c = std_string_name[i]; }
Run Code Online (Sandbox Code Playgroud)
现在我有大约1900 FPS.这不奇怪吗?
接下来我决定测试迭代器本身,没有任何循环体.下面我用我的测试结果链接到屏幕截图.
str是一个长字符串,aa,bb,cc是时钟的倍数.
void main(){
for(int i=0;i<10;++i)
str += str;
clock_t a, b, c;
clock_t aa, bb, cc;
a=clock();
iter1(str);
aa = clock() -a ;
b=clock();
iter2(str);
bb=clock()-b;
c=clock();
iter3(str);
cc=clock()-c;
}
void iter1( std::string str ){
for( char c : str ){
}
}
void iter2( std::string str ){
for( char &c : str ){
} …Run Code Online (Sandbox Code Playgroud) 我正在实现一个简单的状态机如下:
typedef void V_V_StateFunc(void);
static V_V_StateFunc *const fpCurrentStateFunc[STATE_ELEM_SIZE]={
&fn1,/*0*/
};
void Execute_StateMachine(const U8 bCurrent_StateIndex)
{
if(bStateIndex == (~bInvert_StateIndex))
{
if(bCurrent_StateIndex <= STATE_ELEM_SIZE)
{
fpCurrentStateFunc[bCurrent_StateIndex]();
}
else
{
/*this should never enter*/
}
}
else
{
/*this should never enter*/
}
}
void Update_State(U8 bNewIndex)
{
bStateIndex=bNewIndex; //bStateIndex & bInvert_StateIndex are globals
bInvert_StateIndex=(~bNewIndex);
}
Run Code Online (Sandbox Code Playgroud)
在功能方面Execute_StateMachine(),如果我检查bStateIndex == (~bInvert_StateIndex),值始终为0,进入讷韦尔的if语句,虽然bStateIndex=0和~bInvert_StateIndex=0(即0 == 0,这是真的).为什么会这样?
如果我改变了bStateIndex == (!bInvert_StateIndex),它就会进入if声明.
~和!这里有什么区别?
我有一个带有主窗口和子窗口的 Win32 应用程序;在某些情况下,子窗口使用SetCapture.
在这些情况下,如果我使用禁用子窗口,EnableWindow(hChild, FALSE)我会立即停止接收鼠标事件。但是,如果我使用 禁用其父EnableWindow(hMainWindow, FALSE)窗口,则只要捕获鼠标,子窗口就会继续接收事件。一旦它被释放,子窗口就会定期停止接收事件,直到主窗口再次启用。
为什么会有这种差异?当他们的父母被禁用时,子窗口不是也被禁用吗?
(受到我们今天在工作中遇到的一个实际问题的启发,因为没有太多关于SetCapture& co 的讨论。我希望这会对将来的人有所帮助)