将整个结构数组传递给函数

Passing entire struct array to function

我正在学习 C++ 和图形编程,并遵循教程,但我似乎无法找到解决此问题的方法。

这是代码:

struct CUSTOMVERTEX { FLOAT X, Y, Z; DWORD COLOR; };

void writetovram(struct CUSTOMVERTEX *verticies)
{
    ...
    memcpy(pVoid, verticies, sizeof(verticies));
    ...
    return;
}

void createshapes() 
{
    //simple square
    CUSTOMVERTEX verticies[] =
    {
        { -3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255), },

    };
    writetovram(&verticies);
}

我需要能够将这个结构数组作为函数指针完整传递。我发现如果我没有使用指针,则数据无法正确传输。

我试过:

void writetovram(struct CUSTOMVERTEX *verticies)
void writetovram(struct CUSTOMVERTEX verticies)
void writetovram(struct CUSTOMVERTEX &verticies)
void writetovram(struct CUSTOMVERTEX *verticies[])
void writetovram(struct CUSTOMVERTEX verticies[])

writetovram(&verticies);
writetovram(*verticies);
writetovram(verticies);

编辑:当我这样输入代码时,它起作用了:

void writetovram()
{
    CUSTOMVERTEX verticies[] =
    {
        { -3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255), },

    };
    ...
    memcpy(pVoid, verticies, sizeof(verticies));
    ...
    return;
}

基本上,我能想到的所有指针和语法的组合。但是 none 起作用了。

有人能帮忙吗?

我也在网上搜索,发现none有这个问题。

writetovram() 内部,sizeof(verticies) 并不像您想象的那样 return。您不能仅从指针获取数组的大小。 Whosebug 上有很多关于这个问题的问题。

您最简单的选择是将数组大小作为另一个参数传递,例如:

struct CUSTOMVERTEX { FLOAT X, Y, Z; DWORD COLOR; };

void writetovram(CUSTOMVERTEX *verticies, int num_verticies)
{
    ...
    memcpy(pVoid, verticies, sizeof(*verticies) * num_verticies);
    ...
}

void createshapes() 
{
    //simple square
    CUSTOMVERTEX verticies[] =
    {
        { -3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
        { 3.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
        { -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
        { 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 255), },

    };

    writetovram(verticies, 4);
    // or:
    // writetovram(verticies, sizeof(verticies)/sizeof(verticies[0]));
    // or:
    // writetovram(verticies, std::size(verticies));
}

其他选项包括:

  • 通过引用传递数组,但前提是大小在编译时已知。但是,如果需要使用多个不同大小的数组,则必须将 writetovram() 制成模板函数,以便可以在编译时为每个调用站点推导出数组大小。

  • 将数组更改为使用 std::arraystd:vector,通过引用传递给函数,然后它可以使用它们的 size() 方法。