C++ 将多维数组向量中单个项的指针传递给函数c++;

C++ 将多维数组向量中单个项的指针传递给函数c++;,c++,arrays,vector,sdl-2,C++,Arrays,Vector,Sdl 2,我正在用SDL编写一个程序。我在主函数之外实例化了以下变量: std::vector<SDL_Rect[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]> gPersonSpriteClips; getBody()返回此角色实例使用的主体类型的向量索引。以下是Character.h中的函数声明: void render(LTexture& characterSpriteSheetTexture, SDL_Rect s

我正在用SDL编写一个程序。我在主函数之外实例化了以下变量:

std::vector<SDL_Rect[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]> gPersonSpriteClips;
getBody()返回此角色实例使用的主体类型的向量索引。以下是Character.h中的函数声明:

void render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]);
std::vector<int> mAnimations[TOTAL_ACTIVITIES];
以下是Character.cpp中的函数本身:

void Character::render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_PERSON_ACTIVITIES][TOTAL_CARDINAL_DIRECTIONS][PERSON_ANIMATION_FRAMES])
{
    characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
MacActivity是字符“当前正在执行的活动”的枚举。方向就是他所面对的方向。人体模型列出帧顺序(因为其中一些动画多次以不同顺序使用相同的精灵)

最后,LTexture的渲染函数是从LazyFoo的SDL教程中直接获得的

CharacterSpriteSheeTexture.render()正在调用具有以下声明的函数(在LTexture.h中):

所以它需要一个SDL_Rect*clip类型的参数。该函数调用:

SDL_RenderCopyEx( gRenderer, mTexture, clip, &renderQuad, angle, center, flip );
我编译代码时出错,指向SDL库中的某个位置。我已经成功地使用了LTexture的渲染函数,将一维SDLrect数组中的索引传递给它,因此我非常确信向量参数中存在问题

忽略关于命名约定的分歧。。。。。。我在这里做错了什么,实现我想要做的事情的正确方法是什么

当然,我可能会在将来大大简化我的动画设计方案;这是我第一次尝试生成玩家角色。不管怎样,我想知道在这种情况下出了什么问题的机制

最后,请不要建议我使用boost。我真的很想避免这个项目的刺激

预计到达时间:

以下是人体模型的特征声明。h:

void render(LTexture& characterSpriteSheetTexture, SDL_Rect spriteClips[TOTAL_ACTIVITIES][TOTAL_DIRECTIONS][ANIMATION_FRAMES]);
std::vector<int> mAnimations[TOTAL_ACTIVITIES];
std::病媒模拟[总活动];
以下是它在默认构造函数中的初始化:

for (int i = 0; i < TOTAL_ACTIVITIES; i++)
    {
        mAnimations[i].resize(ANIMATION_FRAMES);
        for (int j = 0; j < ANIMATION_FRAMES; j++)
        {
            mAnimations[i][j] = j;
        }
    }
for(int i=0;i
如下更改全局数组定义:

using SdlRectArray = std::array<std::array<std::array<SDL_Rect, ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES>;
std::vector<SdlRectArray> gPersonSpriteClips;
void render(LTexture& characterSpriteSheetTexture, SdlRectArray& spriteClips)
{
    characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
myCharacter.render(bodySpritesheetTexture, gPersonSpriteClips[myCharacter.getBody()]);
然后你可以这样称呼它:

using SdlRectArray = std::array<std::array<std::array<SDL_Rect, ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES>;
std::vector<SdlRectArray> gPersonSpriteClips;
void render(LTexture& characterSpriteSheetTexture, SdlRectArray& spriteClips)
{
    characterSpriteSheetTexture.render( mPosition.x, mPosition.y, &spriteClips[mActivity][mDirection][mAnimations[mActivity][mCurrentFrame]] );
}
myCharacter.render(bodySpritesheetTexture, gPersonSpriteClips[myCharacter.getBody()]);

由于无需执行
&*

操作,因此很难从您的问题中分辨出确切的错误是什么,但似乎根本原因可能是“阵列衰减”

<>在C++中(和在C中),数组参数几乎总是被当作指向数组起始点的指针。对于多维数组,这意味着您所期望的多重索引无法工作,因为该语言已经去除了必要的大小和形状信息

唯一的例外是它们不会以这种方式衰减。但是,如果您依赖于此,您(以及处理代码的任何其他人)将需要记住,每次将多维数组传递给另一个函数时,都要使用该精确的引用参数

<>在现代C++中,这个问题通常是用<代码> STD::数组< /COD>来固定的,它是为这个目的而设计的。在您的情况下,这将非常冗长,因此我建议使用类型别名:

typedef std::array< std::array< std::array<SDL_Rect,
  ANIMATION_FRAMES>, TOTAL_DIRECTIONS>, TOTAL_ACTIVITIES> SpriteClip;

std::vector<SpriteClip> gSpriteClips;

这将使您可以轻松地更改表示形式——例如,如果您决定希望不同的精灵具有不同数量的活动和帧。

在代码中没有其他相关部分的情况下,我尝试仅根据原始问题中的内容提供帮助。让我知道这是否有帮助。@ALEMPIRICIST是的,请随时让我知道您想了解更多的部分(例如,如果您认为在LTEXTRARE中查看完整的渲染函数、实际的错误消息等很有价值)。我试着直接放弃这部分的一切。我会尽我所能帮助你。谢谢!也许只要看看
人体模型
是如何在代码中声明的。同时,让我知道我编辑的答案是否有帮助。@怀疑论者,我做了一个ETA。我会看一看你编辑过的答案,过一会儿再给你回复。我会在几个小时后回来,等我能对它进行更多的测试。谢谢我得到了我的角色渲染!非常感谢你的帮助!