簡単な解決策 — ただし、2D 配列へのポインタはありません
関数は単純にする必要があります。
#include <stdbool.h>
enum { size = 24 };
extern void change_to_true(bool array[][size], int i, int j);
void change_to_true(bool array[][size], int i, int j)
{
array[i][j] = true;
}
int main(void)
{
bool array[size][size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
array[i][j] = false;
change_to_true(array, i, j);
}
}
}
もちろん、C99 または C2011 コンパイラを使用していると仮定しています。C89 に行き詰まっている場合は、 and の定義を提供する必要がbool
ありtrue
ます。残りは変更する必要はありません。の割り当てと比較して、関数呼び出しに価値があるとは確信していませんfalse
。
2D配列へのポインターを使用したソリューション
上記のコードは、厳密には 2D 配列へのポインターを作成しないことに注意してください。それが本当にあなたが望むものであると確信している場合は、表記が変わります:
#include <stdbool.h>
enum { size = 24 };
extern void change_to_true(bool (*array)[][size], int i, int j);
void change_to_true(bool (*array)[][size], int i, int j)
{
(*array)[i][j] = true;
}
int main(void)
{
bool array[size][size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
array[i][j] = false;
change_to_true(&array, i, j);
}
}
}
ただし、私が考えることができる正式な「配列へのポインター」を使用する利点はありません。このコンテキストではありません。
C99 可変長配列を使用したソリューション
C99 では、次のように VLA (可変長配列) を使用することもできます。
#include <stdbool.h>
extern void change_to_true(int size, bool array[][size], int i, int j);
void change_to_true(int size, bool array[][size], int i, int j)
{
array[i][j] = true;
}
int main(void)
{
for (int size = 2; size < 10; size++)
{
bool array[size][size];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
array[i][j] = false;
change_to_true(size, array, i, j);
}
}
}
}
関数宣言では、配列宣言の前にサイズを指定する必要があることに注意してください。はい、これも配列表記へのポインターを使用して記述します (実際には、配列表記へのポインター コードを最初に編集し、次に、より単純なバージョンが必要であることに気付きました)。
どちらを使用しますか?
質問に記載されていないやむを得ない理由がない限り、最初のバージョンが使用するコードです。