Ошибка «Ожидаемое выражение» на языке Си - PullRequest
0 голосов
/ 14 февраля 2019

Итак, я делаю эту C-программу для расчета стоимости в зависимости от типа транспорта.Код, который вы видите здесь, - это действительно небольшая позиция моего реального кода, но он очень похож на тот, который у меня есть (мне пришлось изменить термины на английский, чтобы облегчить понимание).

ТакжеЯ знаю, как правильно кодировать в Java, и, поскольку C очень похож на Java, я думаю, что моя логика здесь в порядке.Так что я думаю, что здесь просто отсутствует какая-то синтаксическая ошибка, так как я новичок в языке C.

Где я положил «Ожидаемое выражение», где я получаю ошибку в.

#include <stdio.h>
#include <string.h>
#include <unistd.h>

#define MONTANT_METRO_BUS = 8.00
#define MONTANT_OMNIBUS = 9.00;
#define MONTANT_TRAIN_RAPIDE = 10.00;
#define MONTANT_INTEGRE = 12.00;
#define MONTANT_ORANGE_CARD = 65.00;  

#define CODE_METRO_BUS 'm'
#define CODE_OMNIBUS 'o'
#define CODE_RAPIDE 'r'
#define CODE_INTEGRE 'i'
#define CODE_CARTE_ORANGE 'c'

void lireTransport();

char codeTransport;
double costTransport;

int main {
    lireTransport();
}

void lireTransport() {
    printf("Enter transport code: ");
    scanf("%c",&codeTransport);
    while (codeTransport != CODE_METRO_BUS &&
            codeTransport != CODE_OMNIBUS &&
            codeTransport != CODE_RAPIDE &&
            codeTransport != CODE_INTEGRE &&
            codeTransport != CODE_CARTE_ORANGE){
        printf("Error! Retry: ");
        fflush(stdin);
        scanf("%c",&codeTransport);
    }

    switch (codeTransport) {
        case CODE_METRO_BUS:    costTransport = COST_METRO_BUS;  //Expected expression
                                break;
        case CODE_OMNIBUS:      costTransport = COST_OMNIBUS;  //Expected expression
                                break;
        case CODE_RAPIDE:       costTransport = COST_TRAIN_RAPIDE; //Expected expression
                                break;
        case CODE_INTEGRE:      costTransport = COST_INTEGRE; //Expected expression
                                break;
        case CODE_CARTE_ORANGE: costTransport = MONTANT_ORANGE_CARD; //Expected expression
                                break;
    }
}

Но когда я заменяю константы на прямые значения, ошибки не возникает

switch (codeTransport) {
            case CODE_METRO_BUS:    costTransport = 1.25;
                                    break;
            case CODE_OMNIBUS:      costTransport = 2.50;
                                    break;
            case CODE_RAPIDE:       costTransport = 3.75;
                                    break;
        case CODE_INTEGRE:          costTransport = 4.2;
                                    break;
        case CODE_CARTE_ORANGE:     costTransport = 5.25
                                    break;
    }
}

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Макрос, созданный с помощью #define, выполняет прямую подстановку в исходный код.Это не переменная, которая присваивается.Итак, учитывая это:

#define MONTANT_OMNIBUS = 9.00;

Тогда это:

case CODE_OMNIBUS:      costTransport = COST_OMNIBUS;  //Expected expression

Становится:

case = 9.00;:      costTransport = = 9.00;;  //Expected expression

Избавьтесь от = и ;, так чтосимвол заменяется только значением:

#define MONTANT_OMNIBUS 9.00
0 голосов
/ 14 февраля 2019

Изменить

#define MONTANT_TRAIN_RAPIDE = 10.00;

на

#define MONTANT_TRAIN_RAPIDE 10.00

и т. Д.


#define является частью препроцессора, который является своего рода примитивным прекомпилятором, которыйработает до самого CПрекомпилятор работает с текстом (на самом деле токены) и выполняет простые замены.

При выполнении

#define MONTANT_TRAIN_RAPIDE 10.00

будущие упоминания о MONTANT_TRAIN_RAPIDE будут заменены на 10.00.

При #define MONTANT_TRAIN_RAPIDE = 10.00; замена будет = 10.00;, что приведет к синтаксически неверному источнику C (у вас будет токен =, где компилятор будет ожидать выражение: отсюда и ошибка «expression expression»).

POSIX-совместимые компиляторы позволят вам увидеть текстовую форму результатов предварительной обработки, если вы запустите их с -E.

Т.е.:

gcc -E your_source.c

покажет вамрезультаты ваших расширений макросов, позволяющие вам действительно увидеть ошибочные:

costTransport = = 10.00;;

, где у вас было

costTransport = COST_TRAIN_RAPIDE;

и т. д.

...