【问题标题】:How to pre-define an array in c?如何在c中预先定义一个数组?
【发布时间】:2016-02-17 11:03:32
【问题描述】:
#include <stdio.h>
#include <math.h>
#define Hey {0.9501, 0.2311, 0.6068, 0.4860, 0.8913, 0.7621, 0.4565, 0.0185, 0.8214, 0.4447, 0.6154, 0.7919, 0.9218, 0.7382, 0.1763, 0.4057, 0.9355, 0.9169, 0.4103, 0.8936, 0.0579, 0.3529, 0.8132, 0.0099, 0.1389, 0.2028, 0.1987, 0.6038, 0.2722, 0.1988, 0.0153, 0.7468, 0.4451, 0.9318, 0.4660, 0.4186, 0.8462, 0.5252, 0.2026, 0.6721, 0.8381, 0.0196, 0.6813, 0.3795, 0.8318, 0.5028, 0.7095, 0.4289, 0.3046, 0.1897, 0.1934, 0.6822, 0.3028, 0.5417, 0.1509, 0.6979, 0.3784, 0.8600, 0.8537, 0.5936, 0.4966, 0.8998, 0.8216, 0.6449, 0.8180, 0.6602, 0.3420, 0.2897, 0.3412, 0.5341, 0.7271, 0.3093, 0.8385, 0.5681, 0.3704, 0.7027, 0.5466, 0.4449, 0.6946, 0.6213, 0.7948, 0.9568, 0.5226, 0.8801, 0.1730, 0.9797, 0.2714, 0.2523, 0.8757, 0.7373, 0.1365, 0.0118, 0.8939, 0.1991, 0.2987, 0.6614, 0.2844, 0.4692, 0.0648,0.9883}
float average(float Hello[]){
    int i;
    float sum;
        for (i=0; i<100;i++) {
            sum+= Hello[i];

    }
    return sum/100;
}
int main(){
    printf("%f\n",average(Hey));

//所以这里编译器说的是预期的错误,但没有告诉我实际的错误是什么。我怀疑是因为我在代码一开始就有的向量定义不好。 }

是的,正如我在评论中所说,问题出在堆栈溢出中提到的 c 预处理。我对数组的预定义是不是错了?为什么?

【问题讨论】:

  • 添加演员表:average((float[])Hey)。另外,初始化你的变量并关闭你的}s。
  • @EOF 不起作用。初始化程序将仅在初始化变量时起作用。它是C 而不是C++,您需要初始化一个变量,然后将它的指针传递给函数。你不能制作这样的数组
  • @Zorgatone:嗯,它当然适用于 gcc。这是 gcc 扩展吗?我不知道。
  • @Zorgatone:嗯,一些测试表明它可以与-std=c99 一起使用,但不适用于-std=c89(两者都与-Wpedantic),所以我想你可以开始研究C99答案的标准。
  • @EOF:(int []){ 1,2,3,4} 之类的东西是 复合文字(自 C99 以来的标准)。 (int []) 部分不是强制转换,而是构造的一部分,它告诉编译器大括号中部分的类型。

标签: c arrays vector constants c-preprocessor


【解决方案1】:

示例:包含 4 个称为 abc 的 int 类型整数值的数组可以表示为:int abc [4]; 默认情况下,本地范围的常规数组(在此示例中,在函数内部声明的数组)被忽略。 但是数组中的元素可以在声明时显式初始化为特定值,方法是将这些初始值括在大括号 {} 中。例如: int abc [4] = { 1, 2, 47, 50, -371 }; 在其他情况下,您可以让括号清空,以便在程序运行时初始化它们,例如int abc [] ;或者您可以使用矩阵,例如 :int abc [] [];带有 X 行和 Y 列。

【讨论】:

  • 您不能定义类型不完整的变量。
  • 我完全同意,但我并不是要展示你必须如何完成一个类型,我指的是一般的数组。
  • "... 在其他情况下,您可以让括号清空,这样您就可以在程序运行时初始化它们,例如 int abc [] ;或者您可以使用类似 :int abc [] [ 的矩阵]; X 行和 Y 列。"
【解决方案2】:

如果你真的想,你可以这样做。

#include <stdio.h>
#include <math.h>

#define HEY_INIT { 0.9501, 0.2311, 0.6068, 0.4860, 0.8913, 0.7621, 0.4565, 0.0185, 0.8214, 0.4447, 0.6154, 0.7919, 0.9218, 0.7382, 0.1763, 0.4057, 0.9355, 0.9169, 0.4103, 0.8936, 0.0579, 0.3529, 0.8132, 0.0099, 0.1389, 0.2028, 0.1987, 0.6038, 0.2722, 0.1988, 0.0153, 0.7468, 0.4451, 0.9318, 0.4660, 0.4186, 0.8462, 0.5252, 0.2026, 0.6721, 0.8381, 0.0196, 0.6813, 0.3795, 0.8318, 0.5028, 0.7095, 0.4289, 0.3046, 0.1897, 0.1934, 0.6822, 0.3028, 0.5417, 0.1509, 0.6979, 0.3784, 0.8600, 0.8537, 0.5936, 0.4966, 0.8998, 0.8216, 0.6449, 0.8180, 0.6602, 0.3420, 0.2897, 0.3412, 0.5341, 0.7271, 0.3093, 0.8385, 0.5681, 0.3704, 0.7027, 0.5466, 0.4449, 0.6946, 0.6213, 0.7948, 0.9568, 0.5226, 0.8801, 0.1730, 0.9797, 0.2714, 0.2523, 0.8757, 0.7373, 0.1365, 0.0118, 0.8939, 0.1991, 0.2987, 0.6614, 0.2844, 0.4692, 0.0648, 0.9883 }

static const float Hey[] = HEY_INIT; // global array

float average(float Hello[]) {
    int i;
    float sum;

    for (i = 0; i < 100; i++) {
        sum += Hello[i];
    }

    return sum / 100;
}

int main(void) {
    printf("%f\n", average(Hey));

    return 0;
}

【讨论】:

  • 这使得宏观超流体(也就是多余的)。也可以说这是无稽之谈和适得其反(如果其他结构做同样的工作,就不要使用宏)。
  • 如果他真的想保留那个宏的话。 IE。他可以在其他地方制作更多类似的数组
  • 这有什么好处?不需要另一个这样的数组,因为他可以引用单个数组。更多的数组(可能)只是更多的内存消耗。
  • 我知道它在我的代码中没用。但我的假设是,@reddevil 可能出于某种原因想要使用定义
【解决方案3】:

通常这是如何在 C 中预定义数组,省略大小并在括号中提供值。例如,

const float Hey[] = {0.9501, 0.2311, 0.6068 };

【讨论】:

  • 也许添加一个const,这样语义更接近于OP试图通过#define实现的目标
  • 如果你比较它也可能是一个全局的定义
  • 一个小问题是这不能出现在头文件中(除非你也把它设为static
  • @M.M:可以在header中声明,在对应的实现文件中定义。因为它是 C 中的标准。
  • @Olaf 我的意思是 artm 发布的代码不能出现在标题中。
猜你喜欢
  • 2022-11-23
  • 2018-11-01
  • 1970-01-01
  • 2011-10-17
  • 2018-11-14
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多