0

私は を持っており、 bool array[size][size] そのポインタを関数に渡してその値を変更したいと考えています。

void change_to_true(???, int i, int j) { // don't know what type it should be
  array[i][j] = 1;
}

配列のポインターを作成するにはどうすればよいですか? また、その値を変更できるようにするには、ポインターを関数に渡すにはどうすればよいですか? ところで、それはcコードです。

ありがとう

編集:試してみました

static bool array[size][size];
bool (*array_t)[index] = array;
void change_to_true(bool array, int i, int j);

subscripted value is neither array nor pointer コンパイラーは、関数パラメーターの型定義を から に変更しようとしたbool arraybool* array、まだ機能しないと言った。

私も試しbool (*array_t)[][size] = &arrayてみbool (*array_t)[size][size] = &array;ましたが、ポインターはまだ機能しません。

また、配列のサイズは実行時に決定されるため、列挙型またはグローバル配列をそのように定義することはできません。

4

4 に答える 4

1

これはうまくいくはずです:

void change_to_true(bool** array, int i, int j)
于 2013-02-03T01:03:32.660 に答える
1

簡単な解決策 — ただし、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);
            }
        }
    }
}

関数宣言では、配列宣言の前にサイズを指定する必要があることに注意してください。はい、これも配列表記へのポインターを使用して記述します (実際には、配列表記へのポインター コードを最初に編集し、次に、より単純なバージョンが必要であることに気付きました)。


どちらを使用しますか?

質問に記載されていないやむを得ない理由がない限り、最初のバージョンが使用するコードです。

于 2013-02-03T01:09:06.963 に答える
0

[編集] C は C 99 以降 bool をサポートしています。その上、そのように宣言することにより、実際の配列は size^2 のすべてのインスタンスを持つメモリ ゾーンへのポインタになります。これは、配列を渡して関数で変更できることを意味し、ヘッダーで bool array[][] を受け取っていることを宣言します。そうすればうまくいくはずです。

于 2013-02-03T01:00:32.740 に答える
0

これはあなたの質問に答えるはずです。

つまり、最初の要素へのポインターを作成し、それを渡します。

于 2013-02-03T00:31:46.183 に答える