atmel代码出错?

时间:2013-02-05 04:32:30

标签: c atmel

这是我使用c:

在atmel 6中的代码
#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。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。expected '=', ',', ';', 'asm' or '__attribute__' before 'initialize_hueristic'

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

有人可以告诉我代码中的错误吗?

3 个答案:

答案 0 :(得分:0)

您的代码中有多个错误。第一个当然是函数的返回类型。如果您有一个多维数组,则只能指定最外层维度,所有其他维度必须指定。

另一个错误是编译器无法捕获的错误,但在运行程序时会导致奇怪的行为。而且它是函数返回一个局部变量的“指针”。用于变量hueristic的内存在函数堆栈上,一旦函数返回就不可用。

这两个问题的解决方案是在堆中动态分配内存,并返回该指针。当然,你必须记住在完成后释放已分配的内存。

答案 1 :(得分: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以获得更多帮助。

答案 2 :(得分: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](或适用于这些维度的名称);内部数组维度必须在编译时固定,以便使用[]表示法(这也将消除您的其他两个错误)。

然后你可以这样称呼:

initialize_hueristic(hueristic, grid_size);

您可能认为grid_size数组没有意义(假设维度在编译时是固定的)并且选择对这些维使用一些常量。

我还建议检查启发式的拼写(我认为是你打算用的词)。