0

次のように、コンテンツがユーザーによって定義され、固定関数プロトタイプに渡される2D長方形配列char rect_array [4][20]があります。

int findTarget (char *string, char *nameptr[], int num)

rect_arrayはエラーとして下線が引かれているため、以下は機能しません。

findTarget (user_input, rect_array, no_of_names);

試したことがある:

rect_array[4][20]
&rect_array
rect_array[4]

何が悪かったのかわかりますか?プロトタイプが前述のとおりでなければならない場合は?配列宣言を変更しますか?

4

1 に答える 1

1

編集質問に追加された情報ごとに、OPは関数プロトタイプを変更できません。これは次のようにする必要があります。

int findTarget (char *string, char *nameptr[], int num)

この場合、2Dテーブルをこの関数に「渡す」唯一の方法は、一時的なポインタ配列を使用することです。いくつかの派手なmalloc()-ingは機能しますが、最終的にはこれに帰着します:

char data[4][20];
char *dataptrs[] = { data[0], data[1], data[2], data[3] };
char name[] = "name";

findTarget(name, dataptrs, sizeof(dataptrs)/sizeof(dataptrs[0]));

元の投稿

20文字の長さのテーブルが固定されたCソリューションの場合:

int findTarget (const char *string, const char names[][20], size_t rows)
{
   // each row ("rows" count of them) is fixed at 20 chars wide.
   // ....
}

または...

int findTarget (const char *string, const char (*names)[20], size_t rows)
{
   // each row ("rows" count of them) is fixed at 20 chars wide.
   // ....
}

そのように呼び出されます:

char data[4][20];

findTarget("targetName", data, sizeof(data)/sizeof(data[0]));

注:プラットフォームがそれらをサポートしている場合(およびほとんどすべてがサポートしている場合、CでVLA(可変長配列)を使用して、幅を関数の任意のパラメーターにすることもできます。

int findTarget (const char *string, 
    size_t rows, size_t cols, 
    const char (*names)[cols])
{
   // each row ("rows" count of them) is variable to "cols" columns wide.
   // ....
}

次のように呼び出されます:

char data[4][[20];

findTarget("target", sizeof(data)/sizeof(data[0]), sizeof(data[0]), data);
于 2013-03-14T17:12:32.350 に答える