ubuntu Linux 中的数组复制实际上不起作用
Array copy in ubuntu Linux doesn't actually work
我的意思是,这件事让我觉得自己像个天真的程序员:')
我会解释的。
对于我的按钮控制器输入,我使用了两个数组,一个用于当前按下的按钮,一个用于最后按下的按钮。我正在做的事情是,对于每一帧,将 "current" 数组的内容复制到 "previous" 数组,然后使用 glfw 将按钮状态获取到 "current" 数组中。
这是我正在谈论的代码:
for(int j=0; j<Input::joyButtonsCount[i]; j++)
Input::joyPrevButtons[i][j] = Input::joyCurrButtons[i][j];
Input::joyCurrButtons[i] = (char*)glfwGetJoystickButtons(i, &Input::joyButtonsCount[i]);
现在,在 Windows 下一切正常,但在 Linux 下则不然。
它导致 prev 和 curr 数组相同。
谁能解释一下为什么会这样?
如果您需要此信息,我在 Linux 下使用 g++,在 Windows.
下使用 MinGW
据我所知glfwGetJoystickButtons
returns 指向某个内部数组的指针。您将其分配给 Input::joyCurrButtons[i]
并且在下一次迭代中您假设它将具有先前的值。这可能不是真的(可能是它的实现定义了),因为系统可能已经在内部用新值更新了这个数组。这样你的第一个循环将复制到 joyPrevButtons
新值而不是以前的值。
glfwGetJoystickButtons
returns 一个 const 指针,以确保 API 用户不会尝试修改其值。所以你不应该把它转换成非常量。它通常也表明您不应保留此指针,而应仅将其用于复制值。
我的建议是不要将来自 glfwGetJoystickButtons
的指针存储在 Input::joyCurrButtons[i]
中,而是将值从 glfwGetJoystickButtons
复制到 Input::joyCurrButtons[i]
数组。
考虑到您提供的代码片段,数组复制在 Linux 中的执行方式没有理由与在 Windows 中不同。您的问题可能出在其他地方。
建议您检查以下几点:
Input::joyButtonsCount[i]
在两个平台上的定义是否正确?
- 在两个平台上仔细检查当您按下按钮 #i 时 Input::joyCurrButtons[i] 是否正确更改。
- 在两个平台上检查复制是否在您期望的时间发生;很可能在 Linux 上,复制发生在您预期之前,因此当您检查值时,它们是相同的(因为之前已经复制过);那么你将不得不理解为什么复制发生在预期时间之前。
对于和我情况相同的其他人(比如像我这样的菜鸟 :P),我会 post 解决问题。
看来我不得不将指针复制到一个数组而不是获取指针并将其用作我的输入数据。
现在这段代码是这样的:
Input::joyPrevButtons[i] = (char*)memcpy(Input::joyPrevButtons[i], Input::joyCurrButtons[i], Input::joyButtonsCount[i]);
Input::joyCurrButtons[i] = (char*)memcpy(Input::joyCurrButtons[i], glfwGetJoystickButtons(i, &Input::joyButtonsCount[i]), Input::joyButtonsCount[i]);
显然我必须包含字符串 header
#include <string.h>
但我仍然不知道为什么它在 Linux 上不起作用,因为它在 Windows 上起作用。
我的意思是,这件事让我觉得自己像个天真的程序员:')
我会解释的。
对于我的按钮控制器输入,我使用了两个数组,一个用于当前按下的按钮,一个用于最后按下的按钮。我正在做的事情是,对于每一帧,将 "current" 数组的内容复制到 "previous" 数组,然后使用 glfw 将按钮状态获取到 "current" 数组中。
这是我正在谈论的代码:
for(int j=0; j<Input::joyButtonsCount[i]; j++)
Input::joyPrevButtons[i][j] = Input::joyCurrButtons[i][j];
Input::joyCurrButtons[i] = (char*)glfwGetJoystickButtons(i, &Input::joyButtonsCount[i]);
现在,在 Windows 下一切正常,但在 Linux 下则不然。
它导致 prev 和 curr 数组相同。
谁能解释一下为什么会这样?
如果您需要此信息,我在 Linux 下使用 g++,在 Windows.
据我所知glfwGetJoystickButtons
returns 指向某个内部数组的指针。您将其分配给 Input::joyCurrButtons[i]
并且在下一次迭代中您假设它将具有先前的值。这可能不是真的(可能是它的实现定义了),因为系统可能已经在内部用新值更新了这个数组。这样你的第一个循环将复制到 joyPrevButtons
新值而不是以前的值。
glfwGetJoystickButtons
returns 一个 const 指针,以确保 API 用户不会尝试修改其值。所以你不应该把它转换成非常量。它通常也表明您不应保留此指针,而应仅将其用于复制值。
我的建议是不要将来自 glfwGetJoystickButtons
的指针存储在 Input::joyCurrButtons[i]
中,而是将值从 glfwGetJoystickButtons
复制到 Input::joyCurrButtons[i]
数组。
考虑到您提供的代码片段,数组复制在 Linux 中的执行方式没有理由与在 Windows 中不同。您的问题可能出在其他地方。
建议您检查以下几点:
Input::joyButtonsCount[i]
在两个平台上的定义是否正确?- 在两个平台上仔细检查当您按下按钮 #i 时 Input::joyCurrButtons[i] 是否正确更改。
- 在两个平台上检查复制是否在您期望的时间发生;很可能在 Linux 上,复制发生在您预期之前,因此当您检查值时,它们是相同的(因为之前已经复制过);那么你将不得不理解为什么复制发生在预期时间之前。
对于和我情况相同的其他人(比如像我这样的菜鸟 :P),我会 post 解决问题。
看来我不得不将指针复制到一个数组而不是获取指针并将其用作我的输入数据。
现在这段代码是这样的:
Input::joyPrevButtons[i] = (char*)memcpy(Input::joyPrevButtons[i], Input::joyCurrButtons[i], Input::joyButtonsCount[i]);
Input::joyCurrButtons[i] = (char*)memcpy(Input::joyCurrButtons[i], glfwGetJoystickButtons(i, &Input::joyButtonsCount[i]), Input::joyButtonsCount[i]);
显然我必须包含字符串 header
#include <string.h>
但我仍然不知道为什么它在 Linux 上不起作用,因为它在 Windows 上起作用。