Ожидаемое выражение в C - PullRequest
0 голосов
/ 17 октября 2018

Я пытаюсь протестировать алгоритм в 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;
}

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Код OP недействителен

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

В C99 код может использовать составные литералы .

Постфиксное выражение, которое состоит из имени типа в скобках, за которым следует заключенный в скобки список инициализаторов, представляет собой составной литерал .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
}

Нет необходимости изменять определение функции.

0 голосов
/ 17 октября 2018

Это неправильный синтаксис для литерала массива.Вам нужно:

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 */
){
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...