【问题标题】:Expected expression in CC 中的预期表达式
【发布时间】:2018-10-17 20:43:06
【问题描述】:

我正在尝试在 C 中测试一个算法,但是在尝试调用该函数时,我在我的主函数中调用该函数的那一行出现错误“预期表达式”。有人能发现其中的错误吗?

#include <math.h>
#include <stddef.h>

int fwsubst(
            unsigned long n,
            double alpha,
            double **R,  /* two-dimensional array, row-major */
            double *b    /* one-dimensional array */
);

int main(void){


    fwsubst(2 ,5.0,{{2.0,2.0},{4.0,2.8}}, {1.0, 9.6});

    return 0;
}

int fwsubst(
            unsigned long n,
            double alpha,
            double **R,  /* two-dimensional array, row-major */
            double *b    /* one-dimensional array */
){
    double x;

    for (size_t k = 0; k < n; k++) {
        double sum = 0.0;
        for (size_t i = 0; i < k; i++) {
            sum +=  b[i] * R[i][k];
        }
        x = (b[k] - sum)/(alpha + R[k][k]);
        if (!isfinite(x))
            return -1;
        if(alpha + R[k][k] == 0)
            return -1;
        b[k] = x;
    }
    return 0;
}

【问题讨论】:

  • compound literals 可能很有趣,但对于多维数组,单独的变量更容易且更惯用。
  • 旁白:if (!isfinite(x)) return -1; 真的是编码目标吗?我希望if (isfinite(x)) return -1; 寻找一根杆子。 (没有!
  • 注意:double **R 不是二维数组。这是一个pointer to pointer to doubleR[i] 是指向 double 的指针。对于double A[3][4]A 是一个二维数组。

标签: c xcode clang


【解决方案1】:

OP 的代码无效

//             v-------------------v  v--------v Invalid
fwsubst(2 ,5.0,{{2.0,2.0},{4.0,2.8}}, {1.0, 9.6});

对于 C99,代码可以使用 compound literals

由括号括起来的类型名称后跟大括号括起来的初始值设定项列表组成的后缀表达式是复合文字。 C11dr §6.5.2.5 3

int fwsubst(unsigned long n, double alpha, double **R, double *b);

int main(void) {
  fwsubst(2, 5.0,
  //  v------------------------------------------------------------v  nested literal
  //                 v--------------------v, v--------------------v  literal
      (double *[2]) {(double[2]) {2.0, 2.0}, (double[2]) {4.0, 2.8}},
      (double[2]) {1.0, 9.6});
  //  ^--------------------^ literal
}

无需更改函数定义。

【讨论】:

  • 注意:[2] 中的 2 是可选的。例如(double *[]) {(double[]) {2.0, 2.0}, (double[]) {4.0, 2.8}}。取决于需要什么检查。
【解决方案2】:

这不是数组字面量的正确语法。你需要:

fwsubst(2 ,5.0,(double[2][2]){{2.0,2.0},{4.0,2.8}}, (double[2]){1.0, 9.6});

您需要更改函数定义以匹配,因为double[2][2] 不会转换为double **,而是转换为double (*)[2]

int fwsubst(
            unsigned long n,
            double alpha,
            double R[n][n],  /* two-dimensional array, row-major */
            double b[n]      /* one-dimensional array */
);

...

int fwsubst(
            unsigned long n,
            double alpha,
            double R[n][n],  /* two-dimensional array, row-major */
            double b[n]      /* one-dimensional array */
){
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多