2009-10-16 64 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)它有時。