0

これはcを使用したatmel6の私のコードです:

#include <avr/io.h>
#include <stdio.h>
#include <math.h>
int a[][][] initialize_hueristic(int[]);



int main(void)
{
    int goal[3],grid_size[3];
    int i, j, k;
    int hueristic[grid_size[0]][grid_size[1]][grid_size[2]];

    hueristic = initialize_hueristic(grid_size);
    hueristic[0][1][0] = 10;
    PORTA = hueristic[0][1][0];






}


int a[][][] initialize_hueristic(int grid_size[])
{
    int hueristic[grid_size[0]][grid_size[1]][grid_size[2]];
    int i, j, k;
    for(i = 0; i < grid_size[0] ; i++)
    {
        for(j = 0; j < grid_size[1]; j++)
            {
                    for(k = 0; grid_size[2]; k++)
                    {
                            hueristic[i][j][k] = 0;
                    }
            }
    }

    return hueristic;
}

atmelスタジオは私に次のエラーを教えてくれます:

1.1。incompatible types when assigning to type 'int[(unsigned int)(grid_size[0])][(unsigned int)(grid_size[1])][(unsigned int)(grid_size[2])]' from type 'int'

2.2。expected '=', ',', ';', 'asm' or '__attribute__' before 'initialize_hueristic'

3.3。expected '=', ',', ';', 'asm' or '__attribute__' before 'initialize_hueristic'

誰かが私のコードのエラーを教えてもらえますか?

4

3 に答える 3

0

重要なエラー (番号 1) は次の行にあります。

hueristic = initialize_hueristic(grid_size);

この行は、配列が C でどのように管理されるかについての誤解を要約しています。

配列全体を割り当てたり、関数に渡したり、関数から返したりすることはできません。配列を要素ごとにコピーするか、(できれば) ポインターを配列の先頭に渡す必要があります。

配列を動的に割り当てる必要はありません (埋め込みコンテキストでの動的割り当ては一般的ではありません)。hueristicただし、それを操作する各関数に (ポインターとして)渡したい場合があります。

void initialize_hueristic(int hueristic[][A][B], int grid_size[])
{
    int i, j, k;
    for(i = 0; i < grid_size[0] ; i++) {
        for(j = 0; j < grid_size[1]; j++) {
            for(k = 0; grid_size[2]; k++) {
                hueristic[i][j][k] = 0;
            }
        }
    }
}

[A]コンパイル時に値と[B](またはこれらのディメンションに適した名前)を定義する必要があります。表記法を使用するには、コンパイル時に内部配列の次元を修正する必要があります[](これにより、他の 2 つのエラーも解消されます)。

これを次のように呼び出すことができます。

initialize_hueristic(hueristic, grid_size);

grid_size(ディメンションがコンパイル時に固定されている場合) 配列が意味をなさないと判断し、これらのディメンションにいくつかの定数を使用することを選択する場合があります。

また、ヒューリスティックのスペルを確認することをお勧めします(これは、使用するつもりだった単語だと思います)。

于 2013-02-05T04:53:05.597 に答える
0

コードに複数のエラーがあります。1 つ目はもちろん、関数の戻り値の型です。多次元配列がある場合、最も外側の次元のみを指定できません。他のすべての次元を指定する必要があります。

もう 1 つのエラーは、コンパイラがキャッチしませんが、プログラムの実行時に奇妙な動作を引き起こすものです。そして、関数がローカル変数への「ポインター」を返すということです。変数に使用されるメモリhueristicは関数スタック上にあり、関数が戻ると使用できなくなります。

これらの問題の両方に対する解決策は、ヒープにメモリを動的に割り当て、そのポインタを返すことです。もちろん、使い終わったら、割り当てられたメモリを解放することを忘れないでください。

于 2013-02-05T04:38:31.320 に答える
0

動的メモリでカンニングしようとしています。ヒューリスティックにポインターを渡し、malloc を使用する必要があります。このようなより:

void initialize_hueristic(int grid_size[], int ***hueristic)
{
    int i, j, k;
    hueristic = (int*)malloc(grid_size[0])
    for (the inner variable)
        malloc the internal memory
        //etc


for(i = 0; i < grid_size[0] ; i++)
{
    for(j = 0; j < grid_size[1]; j++)
        {
                for(k = 0; grid_size[2]; k++)
                {
                        hueristic[i][j][k] = 0;
                }
        }
}

return hueristic;
}

これにより、この関数の外に存在するメモリが作成されます。詳細については、動的メモリと malloc を参照してください。

于 2013-02-05T04:40:30.880 に答える