Я продолжаю получать ошибки, подобные этим:
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);
}
Не c++
эксперт, но я уверен, что для определения константы вам просто нужно использовать #define
директива, за которой следует символ и значение, которое вы хотите присвоить ему (даже если само значение является выражением, даже если такое выражение ссылается на другую константу), фигурные скобки и конечная точка с запятой являются чрезмерными:
// [...]
#define UNLEADED 3.45
#define SUPER (UNLEADED + 0.10)
#define PREMIUM (SUPER + 0.10)
//[...]
Составлено с первой попытки с такими исправлениями.
Причиной ошибки является точка с запятой в конце директивы #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;