【问题标题】:Incompatible types in assignment of variables in C++C ++中变量赋值中的不兼容类型
【发布时间】:2021-01-12 05:23:57
【问题描述】:

最近我一直在尝试使用 arduino 库创建神经网络,我遇到了一个库,字面意思是,George Cousos 称为 Neural Network。我偶然发现了几个错误,我设法很简单地修复了这些错误,但后来我发现了

的错误

sketch_sep22b:24:43: error: incompatible types in assignment of 'float*' to 'float [4]' outputs = NN.FeedForward(inputs[i]);

这是我所有的代码:

#include <math.h> // Include Math Library
#include <NeuralNetwork.h> // Include Neural Network Framework

const unsigned int layers[] = {4, 9, 4}; // First Value (Inputs), Second Value (Neurons / Hidden Layers), Third Value (Outputs)
float outputs[4] = {}; //Outputs Float

const float* /* Pointer */ inputs[1] = {1};

const float expectedOutputs[1] = {1}; //Training Values

void setup()
{
  Serial.begin(9600);
  NeuralNetwork NN(layers, NumberOf(layers));

  for (int i = 0; i < 3000; i++)
  {
    for (int j = 0; j < NumberOf(inputs); j++)
    {

      for (int i = 0; i < NumberOf(inputs) - 1; i++)
      {
        outputs = NN.FeedForward(inputs[i]);
        Serial.println(outputs[0], 7);
      }

      NN.print();
    }
  }
}

编辑:

FeedForward 的声明是:

float *FeedForward(const float *inputs); // Moves Calculated outputs as inputs to next layer.

【问题讨论】:

  • 你能发布 NeuralNetwork::FeedForward 的声明吗?
  • 您不能只将指针复制到带有= 的指针,您需要使用memcpy 之类的东西,或者更好的是,利用C++ 标准库并使用std::vector,如果您可以。
  • 您永远不能分配给数组。他们太愚蠢了。您必须分配给元素。
  • "const float 预期输出[1] = {1};"只有一个元素的数组有什么意义?为什么要把它做成一个数组?
  • @Delta_G 这只是暂时的,我正在为神经网络收集数据,我只是还没有。

标签: c++ arrays neural-network arduino backpropagation


【解决方案1】:

好的,我查看了链接和声明。第一个问题,也是导致编译器错误的问题是返回类型。声明期望输出是一个指针,而不是一个数组。因此,将output 的声明更改为:

float* outputs; //Outputs Float

应该修复编译器错误。我还没有尝试过,但这看起来是编译器正在捕获的问题。这可能会返回一个指向 4 个浮点数的数组的指针,您稍后需要释放该数组(使用 freedelete[],具体取决于库如何分配内存),否则它将创建一个内存泄漏。

正如其他人所指出的,您当前的 input 声明正试图访问导致未定义行为的固定内存位置 (1),因此,您仍然需要解决这个问题。由于库似乎需要一个具有 4 个浮点值的输入,因此您应该给它一个在编译时声明的具有 4 个浮点值的数组,或者您可以在运行时动态分配一个具有 4 个值的数组。

第一个选项如下所示:

const float inputs[4] = {1.0, 2.0, 3.0, 4.0};

第二个选项看起来像:

float* input;

...

input = new float[4];
input[0] = 1.0;
input[1] = 2.0;
input[2] = 3.0;
input[3] = 4.0;

...

output = NN.FeedForward(input);

...

delete[] input;

【讨论】:

  • 这是一个重要的问题,但不是被问到的问题。
  • @user4581301 为什么我的问题被否决了,我遵循了堆栈溢出建议的所有内容。
  • @JamesB 很难确定。可能是缺少minimal reproducible example。除了您询问的一个错误之外,提供的示例应该能够编译,并且您可以在大约三行代码中重现该问题。如果有人可以做出这样的答案,即 100% 正确但解决了不同的问题,那么问题可能不够紧凑。
  • 投反对票可能是因为您没有链接到您的图书馆。将您在 cmets 中的链接放入问题中,我会投票让您回到零。
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2017-03-26
相关资源
最近更新 更多