将整个结构数组传递给函数
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::array
或 std:vector
,通过引用传递给函数,然后它可以使用它们的 size()
方法。
我正在学习 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::array
或std:vector
,通过引用传递给函数,然后它可以使用它们的size()
方法。