【问题标题】:"initializer element is not constant" and "near initialization"“初始化元素不是常数”和“接近初始化”
【发布时间】:2018-01-27 13:38:43
【问题描述】:

我想返回一个数组,既然被覆盖没关系,我的方法是这样的:

double * kryds(double linje_1[], double linje_2[]){
double x = linje_1[1]*linje_2[2]-linje_1[2]*linje_2[1];
double y = linje_1[2]*linje_2[0]-linje_1[0]*linje_2[2];
double z = linje_1[0]*linje_2[1]-linje_1[1]*linje_2[0];
static double svar[] = {x, y, z};
return svar;
}

但是,static double svar[] = {x, y, z}; 出现错误。有人可以解释一下这是什么意思吗?我已经阅读过其他论坛帖子,例如 this one,但这并不真正适用于我的情况

【问题讨论】:

  • 你的初始化元素不是常量表达式。
  • static 对象的初始值设定项必须是 常量表达式,表示可以在编译时求值的东西(文字、扩展为文字的宏、或仅包含这些元素的表达式)。 xyz 的值直到运行时才建立,因此它们不能用作 static 数组的初始化器。

标签: c initialization


【解决方案1】:

首先,它的意思是它所说的

  • 初始化器必须是常量表达式,

但不仅仅是因为它是未定义的行为而不能返回本地数组(将其设为static 可以解决问题但会导致其他问题),而是尝试使用struct

struct point3d {double x; double y; double z; };
struct point3d kryds(double *linje_1, double *linje_2)
{
    struct point3d result;
    result.x = linje1[1] * linje2[2] - ...
    result.y = ...

    // and so on
    return result;
}

或者,如果您必须返回 double *,请尝试使用比 static double svar[] 更好的 malloc()

double *svar;

svar = malloc(3 * sizeof(*svar));
if (svar == NULL) // This will almost NEVER happen, but you MUST check
    return NULL;
svar[0] = linje_1[1] * linje_2[2] - linje_1[2] * linje_2[1];
// And so on

你需要记住free()稍后当你确定你不会再使用它时。

或者,如果你坚持

static double svar[3];

svar[0] = linje_1[1] * linje_2[2] - linje_1[2] * linje_2[1];
// And so on

在我的回答中提出的任何解决方案中,您都不需要辅助 xyz

【讨论】:

  • 或者,将目标数组作为附加参数传递给函数。
  • 愚蠢的问题,但我如何打印出结构?显然不是 %f
  • struct point3d kryds(double *linje_1, double *linje_2) { return (struct point3d ) { linje_1[1] * linje_2[2] - linje_1[2] * linje_2[1], ..., ... } ; } 使用 C99/C11。
  • @Bassusour 最明显的答案就是答案。一次一个成员。
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2016-06-28
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多