【发布时间】:2009-10-16 23:48:02
【问题描述】:
我有一个需要 char[][512] 作为参数的 C++ SDK。我知道这应该是一个文件名列表,文件的数量可能会有所不同。对于我的一生,我无法弄清楚如何声明这一点。我有一个 CString 数组,我正在尝试使用 strcpy_s 将它们复制过来,然后将它们传递给 SDK。关于如何做到这一点的任何想法?
【问题讨论】:
标签: c++ arrays multidimensional-array
我有一个需要 char[][512] 作为参数的 C++ SDK。我知道这应该是一个文件名列表,文件的数量可能会有所不同。对于我的一生,我无法弄清楚如何声明这一点。我有一个 CString 数组,我正在尝试使用 strcpy_s 将它们复制过来,然后将它们传递给 SDK。关于如何做到这一点的任何想法?
【问题讨论】:
标签: c++ arrays multidimensional-array
当用于声明函数的参数时,此声明具有特殊含义。在参数列表中,它等价于char[100][512]、char[123][512]、char[3][512](你明白了——第一个大小可以是任何东西,它被简单地忽略)和char (*)[512]。实际上,它将接受具有灵活(任意)第一大小的 2D 字符数组作为参数。
您将实际传递给此函数的数组应使用具体的第一个大小声明,例如
char names[3][512] = { "abc", "cde", "fgh" };
当然,如果您在编译时知道第一个大小。
如果第一个大小仅在运行时已知(例如,n),则必须动态分配数组
char (*names)[512] = new char[n][512];
// Now fill it with names
或者,更优雅的是,使用 typedef
typedef char TName[512];
TName* names = new TName[n];
// Now fill it with names
我希望您所说的 SDK 功能也要求您将名称数组的第一个大小作为另一个参数传递。
【讨论】:
表示二维字符数组。行数可能会有所不同,应该/可以在另一个参数中指定。 C/C++ 编译器需要知道传递二维数组时的列数,因此他们可以构建映射函数。仅仅因为数组在作为参数传递时会衰减为指针,大小信息就会丢失。例如:
void fun(char matrix[][512], int rows);
...
char matrix[100][512];
...
fun(matrix, 100);
编译器为二维数组构造的映射函数类似于:
// arrays in C/C++ are stored in Row-Major Order
matrix[i][j] == matrix[i*numberOfColumns + j]
如您所见,当传递一个 2D 数组并且丢失了大小信息时,我们需要仅列数来索引该数组中的任何元素。
【讨论】:
这是一种将 argv 样式的文件名数组转换为 SDK 所需格式的方法。
typedef char Char512[512];
Char512 * convert(const char *names[], int n)
{
Char512 * arr;
arr = new char[n][512];
for (int i = 0; i < n; n++)
::strncpy(arr[i], names[i], 512);
return arr;
}
如有疑问,请使用 typedef。
【讨论】:
strncpy() 不会终止正好为 512 个字符的目标字符串。 OP(和他正在使用的 API)可能假设不会达到这个最大值。但那是一个完全需要处理的问题。
提醒一下,如果你 new[] 某事,你必须在某个时候 delete[](而不是 delete)它。
【讨论】: