Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将opengl窗口转换为std::size\u t,然后再转换回来在Linux中工作,但在OSX中不起作用_C++_Linux_Macos_Opengl_X11 - Fatal编程技术网

C++ 将opengl窗口转换为std::size\u t,然后再转换回来在Linux中工作,但在OSX中不起作用

C++ 将opengl窗口转换为std::size\u t,然后再转换回来在Linux中工作,但在OSX中不起作用,c++,linux,macos,opengl,x11,C++,Linux,Macos,Opengl,X11,我已经成功地将OpenGL窗口转换为std::size\t变量,然后在Linux中将其转换回OpenGL窗口。然而,当我尝试在MacOSX中做同样的事情时,它不起作用。以下是我正在做的: /* our window instance(This is an X Window System Window!) */ Window window_; . . . . std::size_t OSXGLWindow::getWindowHandle() { return window_;

我已经成功地将OpenGL窗口转换为std::size\t变量,然后在Linux中将其转换回OpenGL窗口。然而,当我尝试在MacOSX中做同样的事情时,它不起作用。以下是我正在做的:

/* our window instance(This is an X Window System Window!) */
    Window window_;
.
.


.
.
std::size_t OSXGLWindow::getWindowHandle() {
    return window_;
}
.
.
调用“getWindowHandle()”只会将窗口作为std::size\t返回

我将此大小窗口句柄传递给以下函数:

IInputManager* InputFactory::getInputMgr(std::size_t winHandle) {

    IInputManager* retObj = 0;
#ifdef _WIN32
    // todo: windows input implementation
#endif

#ifdef linux
    Window win = winHandle;
    retObj = new lwis::linuxos::LinuxInputManager(win);
#endif

#ifdef __APPLE__
    Window win = winHandle;
    retObj = new lwis::osx::OSXInputManager(win);
#endif

    return retObj;
}
LinuxInputManager和OSXInputManager都调用以下代码位:

XSelectInput(display_, theWindow,
            KeyPressMask | KeyReleaseMask | KeymapStateMask) == BadWindow)
其中“theWindow”是从“InputFactory::getInputMgr(..)”函数发送到各个对象的构造函数的窗口

“XSelectInput”在Linux的LinuxInputManager对象中成功,但在OS X的OSXInputManager中没有成功

另一个重要的信息是窗口在两个静态库之间传递,这就是为什么它首先被转换为std::size_t(以便于在库之间传递)


有人知道这是为什么吗?有没有更好的方法在库之间传递句柄?“void*”会是一个更好的选择吗?

那么,为什么您希望其他一些不相关的类型
窗口可以转换为
std::size\u t
并返回而不会有任何损失呢?我想,如果看到
unsigned char
在这个角色中不起作用,您不会感到惊讶吧?如果是这样,为什么您会惊讶地看到
size\t
失败


size\u t
只是一些无符号整数类型,具有一定的大小和范围。如果您正在将一些不相关的类型转换为
size\t
,转换结果可能适合
size\t
,也可能不适合,具体取决于平台、源类型的属性等。显然,这正是您的情况下发生的情况。

那么,您为什么期望其他类型呢,不相关类型的
窗口
是否可以转换为
std::size\u t
并返回而不会造成任何损失?我想,如果看到
unsigned char
在这个角色中不起作用,您不会感到惊讶吧?如果是这样,为什么您会惊讶地看到
size\t
失败



size\u t
只是一些无符号整数类型,具有一定的大小和范围。如果要将一些不相关的类型转换为
size\t
,则转换结果可能适合
size\t
,也可能不适合,具体取决于平台、源类型的属性等。显然,这正是在您的情况下发生的情况。

void*是一个不错的选择,如果您不能向getInputMgr提供GL类型信息。我假设您正试图对代码的其余部分隐藏OpenGL定义

void*是一个很好的选项,如果您不能向getInputMgr提供GL类型信息。我假设您正试图对代码的其余部分隐藏OpenGL定义

“OpenGL窗口”到底是什么?每个环境中std::size_t的基本类型是什么?@genpfault抱歉,我忘了提到“窗口”是一个X窗口系统窗口。@geofftnz我的印象是std::size_t始终是一个无符号的int类型。有可能一个是64位,另一个是32位吗?或者两者都是32位,但您试图通过它推送的是64位?什么是“OpenGL窗口”?每个环境中std::size\u t的基本类型是什么?@genpfault抱歉,我忘了提到“Window”是一个X窗口系统窗口。@geofftnz我的印象是std::size_t始终是一个无符号的int类型。有可能一个是64位,另一个是32位吗?或者,它可能是32位,但是你想通过它推64位。嗯。我对C++仍然比较新,但是我想完成的是隐藏被传递到<代码> GETInPuttMGR(..)< /> >方法中的窗口。我可能想发送X窗口以外的内容。我使用std::size\u t的原因是我注意到另一个库以这种方式使用它,我想“我想这就是它的工作方式”@下面的两条说明void*是完全可以接受的,它实现了目标,我只是不确定它是否是正确的方法(正如我所提到的,我正在跟随另一个库的线索使用std::size\t)。谢谢考虑到X11中的
窗口
类型是不透明的,并且您对它一无所知,因此无法将它转换为任何内容。在一个体系结构上有效的可能在另一个体系结构上无效。也就是说,在我见过的每个X11实现中,
Window
被定义为一个32位无符号整数。(这确实让人觉得有点神秘,为什么
size\t
在Mac OS X上不起作用。)我发现我的Mac是64位的架构,我想这可以解释一下。std::size\t是8字节,而Window只有4字节。这可能会导致转换时出现问题。关于
窗口
,这是一个很好的观点。我想
void*
会给我最好的可移植性(我现在刚刚启动我的Windows(XP)端口,所以我想时间会告诉我的):)再次感谢andrew@Jarrett:如果确实需要使用整数类型临时存储指针值,正确的类型是
uintpttr\t
,而不是
size\t
<代码> UntPrTrtt在C++中是不正式的(它是C99 TyPulf),但是很多平台提供它,并且你可以自己定义它。嗯,我对C++还是比较新的,但是我想完成的是隐藏被传递到 GETInPuttMGR(..)< /> >方法的窗口。我可能想发送X窗口以外的内容。我使用std::size\u t的原因是我注意到另一个库以这种方式使用它,我想“我想这就是它的工作方式”@下面的两点表明,void*是完全可以接受的,它实现了目标,我只是不确定这是否是一种“正确”的方式(正如我提到的,我