这是我使用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'
有人可以告诉我代码中的错误吗?
答案 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
数组没有意义(假设维度在编译时是固定的)并且选择对这些维使用一些常量。
我还建议检查启发式的拼写(我认为是你打算用的词)。