0

配列とポインターに問題があります。何が間違っているのかはわかっていますが、簡単な解決策を見つけることができません。

私はこのコードを持っています:

void faceRotateACW(char *face[CUBE_DIM][CUBE_DIM]){
    char tempFace[CUBE_DIM][CUBE_DIM];
    for (int y=0;y<CUBE_DIM;y++){
        for (int x=0;x<CUBE_DIM;x++){
            tempFace[y][CUBE_DIM-x]=face[x][y];
        }
    }
    for (int a=0;a<CUBE_DIM;a++){
        for (int b=0;b<CUBE_DIM;b++){
            face[a][b]=tempFace[a][b];
        }
    }
}

問題は、char ポインターを char に割り当てようとしていることがわかりましたが、それはノーノーですが、どのように複製し、配列を変更して、参照によって渡された配列に戻すことができますか? 関数に渡す配列内の値を取得するにはどうすればよいですか?

わかりました、すべて順調に進んでいます。少なくとも、問題をよりよく理解し始めています (ありがとうございます)。私がこの機能を使用している方法もおそらく最善の方法ではないので、より多くの情報を提供する必要があります。明確にさせてください。

配列を次のように定義します。

char *faces[NUM_FACES][CUBE_DIM][CUBE_DIM]={{{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}},
        {{"o","o","o"},{"o","o","o"},{"o","o","o"}}}; 

ただし、関数を呼び出すと、次のように外側の配列を取り除こうとしています。

 faceRotateACW(faces[currentFace]);

みんなのことをいじってごめんなさい、それは私の最初の投稿です:)

4

4 に答える 4

2

上から始めましょう。

main関数(または を呼び出す人faceRotateACW)には、次のような配列があります

char theFace[CUBE_DIM][CUBE_DIM];

sizeofまたは 単項演算子のオペランドである場合、または宣言で別の配列を初期化するために使用される文字列リテラルである場合を除いて&、型 "N-element array of T" の式は / "decay" に変換 / 置換されます。T値が配列の最初の要素のアドレスである"pointer to " 型の式。

関数を次のように呼び出す場合

rotateFaceACW(theFace);

関数呼び出しの式theFaceは、タイプ「CUBE_DIM 要素配列へのポインタchar」、またはの式に置き換えられchar (*)[CUBE_DIM]ます。したがって、関数プロトタイプは次のようにする必要があります

void rotateFaceACW(char (*face)[CUBE_DIM]) {...}

また

void rotateFaceACW(char face[][CUBE_DIM]) {...}

これは、このコンテキストでは同じことです。関数では通常の配列として扱います。

void rotateFaceACW(char (*face)[CUBE_DIM])
{
  char tempFace[CUBE_DIM][CUBE_DIM];
  ...
      tempFace[y][(CUBE_DIM-1)-x] = face[x][y];  // thanks Anthales
  ...
      face[x][y] = tempFace[x][y];

faceは配列の最初の要素へのポインタであるため、 で行わtheFaceれた変更はrotateFaceACWに反映されtheFaceます。

サイズが一定の NxN 行列 (CUBE_DIM) を常に処理するように見えるため、おそらく行数を明示的に渡す必要はありませんが、一般的には渡す必要があります。

任意の数の行と列の2D 配列を処理したい場合は、別のアプローチを取る必要があります。問題とは関係がないように思われるため、ここでは説明しません。

于 2012-04-13T15:37:42.943 に答える
1

私が理解しているように、文字列の行列を「逆の列の順序で」転置しようとしています。次の実装では、O(1) 空間と O(CUBE_DIM^2) 時間で実行します

void faceRotateACW(char* face[CUBE_DIM][CUBE_DIM])
{
    for (int i = 0;i< CUBE_DIM;++i) {
        for (int j = i; j<CUBE_DIM;++j) {
            char* tmpFace = face[i][j];
            face[i][j] = face[j][i];
            face[j][i] = tmpFace;
        }
        for (int j = 0;j < CUBE_DIM/2;++j) {
            char* tmpFace = face[i][j];
            face[i][j] = face[i][CUBE_DIM - 1 - j];
            face[i][CUBE_DIM - 1 - j] = tmpFace;
        }
    }

}
于 2012-04-13T15:29:14.727 に答える
0

ポインタ配列を使用する必要があります。構文は faceRotateACW(char *face[],int cube_dim) のようになり、多次元配列のすべての値にアクセスして、それらの値を変更できます。

于 2012-04-13T15:31:06.337 に答える
0

定義したように、 s の× マトリックスへのポインターではなく、ポインターの ×マトリックスsCUBE_DIMに渡します。これを修正するには、使用する必要がありますCUBE_DIMcharCUBE_DIMCUBE_DIMchar

char (*face)[CUBE_DIM][CUBE_DIM]

face配列に格納されている値ではなく、ポインターであることを示します。これを行うと、コードはコンパイルされなくなります。これは、 (である) が代入先および代入元face[x][y]( である) に間違った型であるためです。char[]tempFace[_][_]char

これは、 が( のオフセットで)face[x]のポインターの外側の層を参照解除し、型が であるため、わかります。は の1 層を剥ぎ取るため、 のタイプはではなくです。facexchar[][][y][]face[x][y]char[] char

これを修正するには、faceインデックス付けを開始する前に、指す配列を取得する必要があります。つまり、逆参照faceしてからインデックス付けする必要があります。あれは:

(*face)[x][y]

したがって、最終的なコードは次のとおりです。

void faceRotateACW(char (*face)[CUBE_DIM][CUBE_DIM]){
    char tempFace[CUBE_DIM][CUBE_DIM];
    for (int y=0;y<CUBE_DIM;y++){
        for (int x=0;x<CUBE_DIM;x++){
            tempFace[y][CUBE_DIM-1-x]=(*face)[x][y];
        }
    }
    for (int a=0;a<CUBE_DIM;a++){
        for (int b=0;b<CUBE_DIM;b++){
            (*face)[a][b]=tempFace[a][b];
        }
    }
}
于 2012-04-13T15:34:55.730 に答える