2009-10-16 40 views
1

我有一个C++ SDK,需要一个char [] [512]作为参数。我知道这应该是一个文件名列表和文件数量可能会有所不同。对于我的生活,我无法弄清楚如何声明这一点。我有一个CString的数组,我试图使用strcpy_s复制它们,然后将它们传递给SDK。任何想法如何做到这一点?声明char [] [512]?

回答

4

该声明在用于声明函数参数时有特殊含义。在参数列表中,它相当于char[100][512],char[123][512],char[3][512](您会明白 - 第一个大小可以是任何东西,它会被忽略),也可以是char (*)[512]。实际上,它将接受一个灵活(任意)第一大小的二维字符数组作为参数。

,你会真正传递给这个函数的数组应该用具体的第一大小声明,例如

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函数也会要求您将名称数组的第一个大小作为另一个参数传递。

2

这意味着字符的二维数组。行数可能有所不同,应该/可以在另一个参数中指定。 C/C++编译器在传递二维数组时需要知道数列,所以他们可以构建映射函数。仅仅因为数组在参数传递时衰减为指针,大小信息就会丢失。例如:

void fun(char matrix[][512], int rows); 
... 
char matrix[100][512]; 
... 
fun(matrix, 100); 

映射函数,该编译器构建的2D阵列是类似于:

// arrays in C/C++ are stored in Row-Major Order 
matrix[i][j] == matrix[i*numberOfColumns + j] 

正如你可以看到,当2D阵列被传递和大小的信息丢失,我们只需要列数来索引此数组中的任何元素。

1

以下是将文件名称风格的转换为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。

+1

'strncpy'将无法正常工作,因为您认为它可以在此工作。如果输入数组包含512个字符(或更长)的名称,则最终将在输出数组中包含一个未终止的字符串。另外,既然你做了typedef(“如果有疑问,请使用typedef”),在'new'中使用它也许是有意义的。 – AnT 2009-10-17 01:27:12

+0

是的,'strncpy()'不会终止正好512个字符的目标字符串。 OP(以及他使用的API)可能假设不会达到这个最大值。但那是一个棘手的问题需要处理。 – 2009-10-26 22:06:49

1

只是提醒一下,如果你new[]的东西,你必须delete[](而不是delete)它有时。

相关问题