0

我正在将脚本移植到 C++ 中,但遇到了一些大问题。

我定义了一个带有值的浮点数组(这是一个非常短的数组,我的真实数组是 100k 个元素),如下所示:

float gRandomPlayerSpawns[4][3] = {
    {2194.7808,1024.5272,79.5547},
    {2099.8562,1158.2679,11.6484},
    {1953.1841,1342.9954,15.3746},
    {2000.6274,1519.7140,17.0625}
};

现在,当我执行以下代码时:

void SetPlayerRandomSpawn(int playerid)
{
    int rnd = rand() % (sizeof(gRandomPlayerSpawns));
    ServerLog::Print(playerid,-1,Functions::string_format(
    "Setting position to: %f %f %f",
    gRandomPlayerSpawns[rnd][0], gRandomPlayerSpawns[rnd][1], gRandomPlayerSpawns[rnd][2]).c_str());
    SetPlayerPos(playerid, gRandomPlayerSpawns[rnd][0], gRandomPlayerSpawns[rnd][1], gRandomPlayerSpawns[rnd][2]); // Warp the player
    SetPlayerFacingAngle(playerid, 45.0);
}

我从来没有得到数组中的任何值..总是奇怪的值,或 0,0,0,或类似的东西:

Setting position to: 283969270356831250000000000000.000000 18523600588218255000000000000.000000 72697250258806125000000000000000.000000

或 #INF:00000 / infinity 等。

我还使用了我在上面发布的数组并添加f到每个数字的末尾,但它没有帮助,我仍然得到未定义(?)的行为,我做错了什么?

4

1 回答 1

1
int rnd = rand() % (sizeof(gRandomPlayerSpawns));

这条线是错误的。将 sizeof 应用于此数组将为您提供 4 * 3 * sizeof(float) (在我的机器上)为 48,因为浮点数占用 4 个字节的内存。即使您要除以 sizeof(float),您仍然会得到 12,这超出了以下计算的范围,预计范围为 [0, 4[。

如果我可以建议另一种方法:

    struct PlayerSpawn {
        float x, y, z;
    };

    // There may be a slighting cleaner way of doing this.
    std::vector<PlayerSpawn> spawnsLocations;
    {
        PlayerSpawn spawns[4] = { {2194.7808,1024.5272,79.5547},
            {2099.8562,1158.2679,11.6484},
            {1953.1841,1342.9954,15.3746},
            {2000.6274,1519.7140,17.0625}
        };
        std::copy(&spawns[0], &spawns[4], std::vector<PlayerSpawn>::emplace_back);
    }   // The static array will go out of scope here, it's somewhat of a needless optimization though
    int rand = 0 % spawnsLocations.size();  // call rand here instead of 0, size of the vector should be 4 here

但实际上,您可以使用 push_back 直接将值添加到向量中,或者使用特定大小(例如 4)初始化数组,然后将值分配给每个索引(从 0 到 3)。由你决定。

于 2013-07-06T01:39:22.600 回答