ubuntu Linux中的数组副本实际上并不起作用

时间:2016-06-14 10:41:30

标签: c++ arrays linux controller glfw

我的意思是,这件事让我觉得自己像个天真的程序员:')
我会解释一下。
对于我的按钮控制器输入,我使用两个数组,一个用于按下当前按钮,另一个用于按下最后一个按钮。我所做的是,对于每一帧,复制"当前"的内容。阵列到"之前"然后使用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。

3 个答案:

答案 0 :(得分:0)

从我看到glfwGetJoystickButtons返回指向某个内部数组的指针。您将其分配给Input::joyCurrButtons[i],并在下一次迭代中假设它将具有先前的值。这可能不是真的(可能是其实现已定义),因为系统可能已在内部使用新值更新此数组。这样,您的第一个循环将复制到joyPrevButtons个新值而不是之前的值。

glfwGetJoystickButtons返回一个const指针,以确保API用户不会尝试修改其值。所以你不应该把它强制转换为非const。此外,它通常表示您不应该保留此指针,而是仅使用它来复制值。

我建议您不要将glfwGetJoystickButtons中的指针存储在Input::joyCurrButtons[i]中,而是将值从glfwGetJoystickButtons复制到Input::joyCurrButtons[i]数组。

答案 1 :(得分:0)

考虑到您提供的代码段,没有理由为什么阵列副本在Linux中的执行方式与在Windows中的执行方式不同。你的问题可能在其他地方。

我建议您检查以下几点:

  • 是否在{2}平台上正确定义了Input::joyButtonsCount[i]
  • 在按两个按钮#i时,两个平台上仔细检查Input :: joyCurrButtons [i]是否正确更改。
  • 检查两个平台是否在您预期的时间发生了复制;很可能在Linux上,副本发生在您预期之前,因此当您检查值时,它们是相同的(因为之前已经复制过);那么你将不得不理解为什么复制在预期时间之前发生。

答案 2 :(得分:0)

对于我所处的其他人(例如像我这样的新手:P),我会发布问题。
似乎我必须将指针复制到数组而不是获取指针并将其用作我的输入数据 以下是此代码的使用方法:

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]);

显然我必须包含字符串标题

#include <string.h>

但我仍然不知道为什么它不适用于Linux,因为它适用于Windows。