【问题标题】:Initialize an array in C在 C 中初始化一个数组
【发布时间】:2018-02-27 00:35:51
【问题描述】:

由于在初始化后无法为 const 赋值,我该如何实现呢?

const double input1[1000][2];
for(int i = 0; i < 1000; i++){
    input1[i][0] = i;
    input1[i][1] = i*2;
}

【问题讨论】:

  • 您为什么要这样做?用户代码可以使用i 代替input1[i][0]i*2 代替input1[i][1],而不是使用input1
  • 如果它是 const,你需要在编译期间使用常量值初始化它。
  • 您将一个显然不是const 的数组声明为const,这没有任何意义。如果您希望您的 const 数组使用值进行初始化,那么您必须以艰难的方式进行 const double input1[1000][2] = { {0,1}, {0,2}, {0,3}, ... };
  • 如果您使用适当的构建系统,那么您可以使用脚本生成初始化程序。如果数据必须是const。请注意,const 只是一个限定符,你总是可以用它做错事,特别是在c 中。当然const 会保护你免于意外做错事,我认为它会帮助编译器优化。但也许不值得。
  • 它的目的是作为计算乘法结果的神经网络练习的训练数据(我知道它没用,但它有学习目的)。网络由第三方库编写的带有 const double[][] 参数的函数调用。我是 C 新手,所以我不知道是否还有其他方法可以做到这一点,例如,传递一个非常量 double[][]。感谢您的回复。

标签: c arrays initialization double constants


【解决方案1】:

您必须生成显式初始化(​​即{ {0, 0}, {1, 2}, {2, 4}, ... etc etc ... {1000, 2000} }

您可以使用map/apply 宏或您的构建系统来执行此操作 - 让它运行一些脚本来生成该初始化序列并将其植入文件中。

【讨论】:

  • 谢谢。我要试试!
【解决方案2】:

您在 cmets 中提到此数据是神经网络的训练会话数据。

我假设您不想手动输入 2000 个值,我假设这些值 来自另一个文件,可能是 csv 或另一个程序的输出 生成训练数据。

在这种情况下,我会编写一个脚本,从训练中生成一个头文件 如下所示的数据:

// training_data.h
// trainng data, automatically generated by script gen_training_data.py
// do not modify this file

#ifndef TRAINING_DATA_H
#define TRAINING_DATA_H

const double traing_data[1000][2] = {
    { 0, 1 },
    { 0, 2 },
    ....
};

#endif

脚本(您可以使用其他语言、bash、python、perl 编写)将 获取训练数据并为您生成头文件,因此您没有 手写 2000 个值。然后你可以像这样在你的 C 程序中使用它:

#include <stdio.h>
#include "training_data.h" // include auto generated file

int main(void)
{
    ...
    feed_to_neural_network(training_data);
    ...
}

如果你使用像 cmake 这样的构建系统,你可以让 cmake 执行你的脚本,这样 它在编译之前自动生成头文件。这样可以节省你 从长远来看很多时间。

【讨论】:

  • 这就是我需要的!谢谢!
【解决方案3】:

我不明白为什么要将索引值存储在第一个索引中。但是删除const 可以解决您的问题。但更好的做法是只存储值而不是索引。如下:

double input1[1000];

for (int i = 0; i < 1000; i++)
{
    input1[i] = i * 2;
}

【讨论】:

  • 嗨 Chux,我知道不能对 const 对象进行赋值,因此我在上面的答案中建议删除 const。而且,如果您看到我建议的代码,它会显示 double 而不是 const double
  • 由于他希望为索引赋予特定值(索引的两倍),因此将它们一一初始化似乎并不可行或有效。因此我建议删除 const 并运行一个循环进行赋值。
猜你喜欢
  • 2013-04-26
  • 2014-05-11
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多