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



我的意思是,这东西让我感觉像个天真的程序员:')
我会解释一下。
对于我的按钮控制器输入,我使用两个数组,一个用于当前按钮,一个用于最后按下。我要做的是,对于每个帧,将"当前"数组的内容复制到"上一个"数组,然后使用GLFW将按钮状态将其输入"当前"数组。
这是我正在谈论的代码:

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中却没有。它导致上一条和curr阵列相同。
有人可以解释我为什么会发生吗?
如果您需要此信息,我将在Windows下的Linux和Mingw下使用G 。

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

glfwGetJoystickButtons返回const指针,以确保API用户不会尝试修改其值。因此,您不应该将其施加给非const。这通常是您不应该保留该指针的标志,而是使用它来复制值。

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

考虑您提供的代码段,没有理由为什么数组副本在Linux中的性能与Windows中的性能不一样。您的问题可能在其他地方。

我建议您检查以下几点:

  • Input::joyButtonsCount[i]是否在两个平台上正确定义?
  • 在按下按钮#I。
  • 如果您期望的时间发生副本,请检查两个平台;在Linux上,副本可能在您期望之前发生,因此当您检查值时,它们是相同的(因为已经复制了较早);然后,您将不得不了解为什么复制发生在预期时间之前。

for在我的情况下其他所有人(例如像我这样的菜鸟: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上起作用。