компиляция — косвенное обращение требует операнда указателя и ожидаемых ошибок выражения

Я продолжаю получать ошибки, подобные этим:

pitstop.cpp:36:23: error: indirection requires pointer operand

('double' invalid)

cost = UNLEADED * gallons;

^ ~~~~~~~

pitstop.cpp:40:14: error: expected expression

cost = SUPER * gallons;                               ^

#include <iostream>
#include <iomanip>
using namespace std;

#define UNLEADED 3.45;
#define SUPER {UNLEADED + 0.10};
#define PREMIUM {SUPER + 0.10};

/*
Author: Zach Stow
Date:
Homework
Objective:
*/

double cost, gallons;
string gasType, finish, stop;

int main()
{
for(;;)

{

cout <<"Hi, welcome to Pitstop.\n";
cout <<"Enter the type of gas you need:";
cin >> gasType;
cout << endl;

cout <<"Enter the amount of gallons you need:";
cin >> gallons;
cout << endl;

if(gasType == "finish" || gasType == "stop")break;

else if(gasType == "UNLEADED")
{
cost = UNLEADED * gallons;
}
else if(gasType == "SUPER")
{
cost = SUPER * gallons;
}
else if(gasType == "PREMIUM")
{
cost = PREMIUM * gallons;
}

}
cout <<"You need to pay:$" << cost << endl;

return(0);

}

0

Решение

Не c++ эксперт, но я уверен, что для определения константы вам просто нужно использовать #define директива, за которой следует символ и значение, которое вы хотите присвоить ему (даже если само значение является выражением, даже если такое выражение ссылается на другую константу), фигурные скобки и конечная точка с запятой являются чрезмерными:

// [...]

#define UNLEADED 3.45
#define SUPER (UNLEADED + 0.10)
#define PREMIUM (SUPER + 0.10)

//[...]

Составлено с первой попытки с такими исправлениями.

3

Другие решения

Причиной ошибки является точка с запятой в конце директивы #define.

Вы также использовали неправильный тип скобок, попробуйте вместо этого:

#define UNLEADED 3.45

#define SUPER (UNLEADED + 0.10)

#define PREMIUM (SUPER + 0.10)

Обратите внимание, что когда вы используете директиву #define, все, что следует за #define, подставляется в ваш код. В этом случае после запуска препроцессора ваш код выглядел так:

else if(gasType == "UNLEADED")
{
cost = UNLEADED 3.45; * gallons;
}
else if(gasType == "SUPER")
{
cost = {UNLEADED + 0.10}; * gallons;
}
else if(gasType == "PREMIUM")
{
cost = PREMIUM {SUPER + 0.10}; * gallons;
}

Причина, по которой вы получили indirection requires pointer operand Ошибка была в том, что компилятор пытался интерпретировать это утверждение:

* gallons;

Поскольку * оператор имеет только один аргумент, он интерпретируется как разыменование указателя, к счастью для вас gallons переменная не является указателем типа. Если галлоны были объявлены типом указателя, т.е. double cost, *gallons; и cin если бы там не было, код скомпилировал бы, но не сделал бы то, что вы ожидаете, вероятно, бросив segfault.

Макросы, определенные с помощью #define, могут быть очень мощными и очень опасными. Обычно есть лучший способ добиться чего-то в c ++. В этом случае UNLEADED, SUPER_UNLEADED а также PREMIUM может быть объявлен как const double типа то есть

const double unleaded = 3.45;
const double super = unleaded + 0.10;
const double premium = super + 0.10;

1

По вопросам рекламы [email protected]