【问题标题】:Error in atmel code?atmel 代码错误?
【发布时间】:2013-02-05 04:32:30
【问题描述】:

这是我在 atmel 6 中使用 c 的代码:

#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'

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

【问题讨论】:

  • 什么是int a[][][]
  • “启发式”的“e”和“u”正好相反。
  • @AbhishekVJoshi :如果有帮助,请为答案投票。您也可以接受最佳答案。

标签: c atmel


【解决方案1】:

你试图用动态内存作弊。您需要将指针传递给您的启发式方法并使用 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】:

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

    另一个错误是编译器不会捕捉到的,但在运行程序时会导致奇怪的行为。就是该函数返回一个指向局部变量的“指针”。变量hueristic使用的内存在函数栈上,一旦函数返回就无法使用了。

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

    【讨论】:

      【解决方案3】:

      不平凡的错误(数字 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 数组没有意义(假设维度在编译时是固定的)并选择对这些维度使用一些常量。

      我还建议检查 heuristic 的拼写(我认为这是您打算使用的词)。

      【讨论】:

        猜你喜欢
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        相关资源
        最近更新 更多