1

戻り行でエラーが発生しています。「結果型が 'int' の関数から 'int (*)[2]' を返す整数変換への互換性のないポインター」 誰かがこのエラーの背後にある理論とその修正方法を説明できますか? それでも正しい結果が得られますが、このエラーについてはわかりません。(ヒント: 私は非常に初心者です) これが私のテスト コードです。

#include <stdio.h>
#include<string.h>
/* two diminsanl array testing*/
int array_function(int phase,int array[][2]);
int main()
{
    int phase =1;
    int array[][2]={};
    array_function(phase, array);

    phase =2;
    array_function(phase, array);
    return 0;
}

int array_function(int phase, int array[][2])
{
    if(phase==1)
{
    array[0][0]=1;
    array[0][1]=2;
    array[1][0]=3;
    array[1][1]=4;
}
    if(phase==2)
{
    printf("%d\n",array[0][0]);
}
return array;  //<------------- error line
}
4

5 に答える 5

0

最初のこの行は、正当な割り当てではありません:

int array[][2]={};  

あなたがしていることについては、この行が機能します:

int array[][2]={0,0,0,0};  

他の人が指摘したように、この行は返そうとしていますint[][]。これには 2 つの問題があります。1) C は int の配列の値表現を返すことができません (ただし、 などのポインターを返すことはできint **ますが、ここでは必要ありません。下部の注を参照してください)。そして 2) プロトタイプは明らかにint

return array;  //<------------- error line  

とりあえず、行を次のように変更します。

return 0;  

これら 2 つの変更により、コードarray[][] にエラーが表示されなくなります。

注:配列を参照渡ししているため、(array_function(phase, array);) 内の配列に割り当てられた値array_function()main()return. (つまりint ** array_function(phase, array))

于 2013-11-08T22:35:45.627 に答える
0

配列を静的に作成する場合は、両方の次元を指定する必要があります。配列はポインターとして渡されます。静的配列を渡す場合は、関数のパラメーターで次元を指定することをお勧めします。動的に割り当てた場合でも、配列名を任意の関数に渡すだけです。配列を返したい場合は、2D 配列の int* または int** を返す必要があります。

関数で配列を作成し、呼び出し元にそれを持たせたいとしましょう。

int *createArray(int size)
{
    int *array = malloc(size * sizeof(int));
    return array;
}

この関数はメインから呼び出すことができます。

int *list;

list = createArray(2);

他の配列と同様にリストを変更します。

これはあなたのコードです。

#include <stdio.h>

/* two diminsanl array testing*/
void array_function(int phase, int array[2][2]);

int main()
{
    int phase = 1;
    int array[2][2];
    array_function(phase, array);

    phase = 2;
    array_function(phase, array);
    return 0;
}

void array_function(int phase, int array[2][2])
{
    if (phase == 1)
    {
        array[0][0] = 1;
        array[0][1] = 2;
        array[1][0] = 3;
        array[1][1] = 4;
    }
    if (phase == 2)
    {
        printf("%d\n",array[0][0]);
    }
}
于 2013-11-08T22:37:08.580 に答える
0

というわけで、まず式の型arrayarray_functionint (*)[2]つまり「の2要素配列へのポインタint」です。

sizeofor 単項演算子のオペランドである場合、または宣言で別の配列を初期化するために使用される文字列リテラルである場合を除き、&「N 要素配列」型の式は、次の式Tに変換 (「減衰」) されます。 「ポインタT」と入力すると、式の値が配列の最初の要素のアドレスになります。

phase_arrayから呼び出すと、次mainのようになります。

array_function(phase, array);

式のarray型は「2 要素配列の 2 要素配列int」です。sizeofor の単項演算子のオペランドではないため、&「 の 2 要素配列へのポインタ」型の式に変換され、intその値は最初の要素 ( &array[0]) のアドレスに設定されます。このポインター値が に渡されarray_functionます。

関数パラメーター リストのコンテキストでは、フォームの宣言T a[N]T a[]は として解釈されT *aます。a3 つすべてが へのポインタとして宣言しますT。そう、

int array_function(int phase, int array[][2])

と同じです

int array_function(int phase, int (*array)[2])

これにより、エラーメッセージが表示されます。(関数で使用することはありません)array_functionを返すように宣言しましたが、式のタイプは; です。したがって、エラーメッセージ。The two types are not *compatible" であり、コンパイラはこれをエラーとしてフラグ付けします。intmainarrayint (*)[2]

toの最初の要素のアドレスを渡したので、配列の内容に加えた変更は に反映されるため、実際には配列を返す必要はありません。他の人が示唆しているように、関数の型をに変更するだけで、何も返さないでください。 arrayarray_functionmainvoid

于 2013-11-08T23:00:32.683 に答える