1

グラフ内のいくつかのドットを表す int の 2 次元配列があります。

int16_t myPoints[][3] = {
  {0, 0},
  {20, 40},
  {14, 92}};

これらの座標を読み取ることができる関数にポインタを渡すにはどうすればよいですか?

何かのようなもの?

void foo(int16_t *coordinates[][]) {
   drawPoint(x[0], y[0]);
   drawPoint(x[1], y[1]);
   ...

助けてくれてありがとう。

4

4 に答える 4

2

関数を宣言するときは最初の次元のみが不明になる可能性があるため、次のように関数を宣言/定義する必要があります。

void foo(int16_t coordinates[][3])
{
    drawPoint(coordinates[0][0], coordinates[1][0]);
    drawPoint(coordinates[0][1], coordinates[1][1]);
    drawPoint(coordinates[0][2], coordinates[1][2]);
}

次に、通常の関数のように呼び出すことができます。

foo(myPoints);

編集:あなたの配列宣言は正しくありません。私もそれを見逃しました。そのはず:

int16_t myPoints[][2] = {
  /* List of points */
};

これで適切な座標配列ができました。これは好きなだけ長くすることができます。

関数がエントリ数を知るには、それを関数に渡す必要があるため、新しい関数宣言は次のようになります。

void foo(int16_t coordinates[][2], int number_of_points);

コピーについて心配する必要はありません。コンパイラは、配列へのポインターを渡すだけの十分な機能を備えているため、配列全体をコピーすることはありません。

于 2012-05-31T11:44:07.177 に答える
1

ルールは、「の N 要素配列」型の式Tがほとんどのコンテキストで出現する場合、「へのポインタ」型の式に変換されるというものTです。

myPoints型「3要素配列の3要素配列」の式int16_tです。したがって、ほとんどのコンテキスト1 (関数呼び出しなど)にmyPoints現れると、「の 3 要素配列へのポインター」、または. int16_tint16_t (*)[3]

fooasを呼び出したい場合foo(myPoints)、プロトタイプは

void foo(int16_t (*coordinates)[3])

また

void foo(int16_t coordinates[][3])

関数パラメーター宣言のコンテキストでは、T a[N]T a[]、およびT *aはすべて等価であり、すべてaへのポインターとして宣言しますT。これは、関数パラメーター宣言でのみ当てはまることに注意してください。


1 - 規則の例外は、配列式がsizeofまたは 単項演算子のオペランドであるか&、宣言で別の配列を初期化するために使用される文字列リテラルである場合です。

于 2012-05-31T13:58:11.563 に答える
0

関数の引数の適切な宣言を繰り返すことにより:

void foo(int16_t coordinates[][3])
{
  ...
}

オプションである変数名の直後の次元を除くすべての配列次元を含める必要があります。

于 2012-05-31T11:43:14.440 に答える
0

しかし、それは配列全体を foo にコピーしますか、それともポインタを渡すだけですか? また、エントリごとに常に 2 つの座標があることも知っていますが、エントリがいくつ来るかはわかりません。

可変長配列を渡す場合は、要素の数を別のパラメーターとして渡すか、配列の最後の要素が最後の要素であることを何らかの方法で示して、while( を使用して関数を終了できるようにする必要があります。 ) ループ (文字列を終了するために NULL を追加するようなもの)。

enum STATUS { OK, END };
STATUS bar(int16_t x, int16_t y);  /* bar() checks to see if this is the last element */

void foo(int16_t coordinates[][2])
{
    int i = 0;
    while( END != bar(coordinates[i][0], coordinates[i][1]) )
    {
        drawPoint(coordinates[i][0], coordinates[i][1]);
        ++i;
    }
}
于 2014-05-20T16:23:08.400 に答える