I have researched my issue all over StackOverflow and multi-google links, and I am still confused. I figured the best thing for me is ask…
Im creating a simple command line calculator. Here is my code so far:
const std::string Calculator::SIN("sin");
const std::string Calculator::COS("cos");
const std::string Calculator::TAN("tan");
const std::string Calculator::LOG( "log" );
const std::string Calculator::LOG10( "log10" );
void Calculator::set_command( std::string cmd ) {
for(unsigned i = 0; i < cmd.length(); i++)
{
cmd[i] = tolower(cmd[i]);
}
command = cmd;
}
bool Calculator::is_legal_command() const {
switch(command)
{
case TAN:
case SIN:
case COS:
case LOG:
case LOG10:
return true;
break;
default:
return false;
break;
}
}
the error i get is:
Calculator.cpp: In member function 'bool Calculator::is_trig_command() const':
Calculator.cpp: error: switch quantity not an integer
Calculator.cpp: error: 'Calculator::TAN' cannot appear in a constant-expression
Calculator.cpp: error: 'Calculator::SIN' cannot appear in a constant-expression
Calculator.cpp: error: 'Calculator::COS' cannot appear in a constant-expression
The mighty internet, it says strings are allowed to be used in switch statements.
Thanks everyone, I appreciate your help.
moinudin
133k45 gold badges189 silver badges215 bronze badges
asked Dec 26, 2010 at 23:21
4
In switch
, the expression must be of «an integral type or of a class type for which there is an unambiguous conversion to integral type» (quoting VS2008 docs).
A string class doesn’t have «unambiguous conversion to integral type», like a char
does.
As a work-around:
-
Create a
map<string, int>
and switch on the value of the map:switch(command_map[command])
` -
Do a set of
if
/else
instead of switch. Much more annoying and hard to read, so I’d recommend the map route.
As an aside, an even better solution for really complicated logic like that is to improve the mapping solution to get rid of switch
completely and instead go with a function lookup: std::map<std::string, functionPointerType>
. It may not be needed for your specific case, but is MUCH faster for complicated very long look-up logic.
answered Dec 26, 2010 at 23:27
DVKDVK
127k32 gold badges212 silver badges325 bronze badges
1
As others and the compiler commented, strings are not allowed with switch
. I would just use if
bool Calculator::is_legal_command() const {
if(command == TAN) return true;
if(command == SIN) return true;
if(command == COS) return true;
if(command == LOG) return true;
if(command == LOG10) return true;
return false;
}
I don’t think that’s any more complicated, and it’s about as fast as it could get. You could also use my switch macro, making it look like
bool Calculator::is_legal_command() const {
sswitch(command)
{
scase (TAN):
scase (SIN):
scase (COS):
scase (LOG):
scase (LOG10):
return true;
sdefault():
return false;
}
}
(having break
after a return
is dead code, and so should be avoided).
answered Dec 27, 2010 at 0:03
Strings cannot be used in switch statements in C++. You’ll need to turn this into if
/else if
, like this:
if (command == "tan")
{
// ...
}
else if (command == "cos")
{
// ...
}
// ...
answered Dec 26, 2010 at 23:25
SoapBoxSoapBox
20.4k3 gold badges51 silver badges87 bronze badges
1
Not sure which mighty Internet you’ve been reading, but C++ doesn’t allow strings in switch
statements. (C# does, though.)
You need to convert your switch
statement to a chain of if
—else if
—else
statements that test equality.
answered Dec 26, 2010 at 23:26
Adam MarasAdam Maras
26.1k6 gold badges65 silver badges91 bronze badges
1
Rather than a switch.
I would use a command pattern. Then use a std::map to map the function name to the command object.
Something like this:
#include <math.h>
#include <map>
#include <string>
#include <iostream>
class Function
{
public:
// Easy public API that just uses the normal function call symantics
double operator()(double value) { return this->doWork(value);}
virtual ~Function() {}
private:
// Virtual function where the work is done.
virtual double doWork(double value) = 0;
};
// A sin/cos function
class Sin: public Function { virtual double doWork(double value) { return sin(value); } };
class Cos: public Function { virtual double doWork(double value) { return cos(value); } };
// A class that holds all the functions.
// A function name is mapped to a function object.
class FuncMap
{
public:
FuncMap()
{
// Constructor sets up the map
functions["sin"] = &sinFunc;
functions["cos"] = &cosFunc;
}
Function* getFunction(std::string command) const
{
// Default result not found.
Function* result = NULL;
std::map<std::string, Function*>::const_iterator find;
// Look in the map to see if we find the value.
// If it exists then find will not point at end()
if ((find = functions.find(command)) != functions.end())
{
// Get the pointer to the function
result = find->second;
}
return result;
}
private:
Sin sinFunc;
Cos cosFunc;
std::map<std::string, Function*> functions;
};
// Declaring it globally for ease of use.
FuncMap functions;
int main()
{
// SImple example of usage.
Function* func = functions.getFunction("sin");
if (func == NULL)
{
std::cout << "No Function sin()n";
exit(1);
}
std::cout << "Result: " << (*func)(12.34) << "n";
}
answered Dec 27, 2010 at 0:37
Martin YorkMartin York
256k85 gold badges333 silver badges558 bronze badges
The compiler error tells you everything you need to know. Only integral types may be compared in switch statements.
I’m not sure which «mighty internet» told you otherwise, but it was mighty wrong.
answered Jan 2, 2011 at 22:53
Strings cannot be used as constants in switch statements in c++. You can either use a map, a series of if’s or you can move from representing your commands as strings to an enum. Parse from string to enum once, then use a switch like you do now. Note that your string parsing may require the same mechanism (map/if’s), but depending on your use case using one approach over the other may improve readability. I’m not going to say anything on which approach is more readable.
answered Dec 26, 2010 at 23:26
villintehaspamvillintehaspam
8,4906 gold badges45 silver badges76 bronze badges
Я провожу некоторые симуляции с Mathematica с помощью NDSolve, и мне нужно представить эффект температуры. Я определяю таблицу случайных чисел, а затем делаю из нее функцию следующим образом:
randomtablex =
Table[RandomVariate[NormalDistribution[]], {i, 1,
IntegerPart[3 tspacer/deltats] + 1}];
randomtabley =
Table[RandomVariate[NormalDistribution[]], {i, 1,
IntegerPart[3 tspacer/deltats] + 1}];
randomtablez =
Table[RandomVariate[NormalDistribution[]], {i, 1,
IntegerPart[3 tspacer/deltats] + 1}];
Bterp[t_] :=
{randomtablex[[IntegerPart[t/deltats] + 1]],
randomtabley[[IntegerPart[t/deltats] + 1]],
randomtablez[[IntegerPart[t/deltats] + 1]]};
куда 3tspacer
это время интеграции и deltats
время изменения теплового поля. Симуляция работает нормально и результаты верны, но каждый раз я получаю это сообщение об ошибке:
Part:: pspec: «Спецификация детали 1+IntegerPart[1000000000000 t] не является ни целым числом, ни списком целых чисел».
Как я уже сказал, это на самом деле не проблема, но меня беспокоит, что он продолжает появляться… Есть ли способ узнать, откуда он взялся, или я должен просто выключить его?
заранее спасибо
У меня возникла проблема при попытке скомпилировать код C++. Поскольку я все еще изучаю C++, я все еще не понимаю большинство расширенных команд. Я пытался создать программу, которая запрашивает имя, фамилию, возраст и пол пользователя и отображает его пользователю. Это мой исходный код:
#include <iostream>
int main ()
{
char firstName[20];
char lastName[20];
char age[6];
char gender[3];
int i = 0;
std::cout << "Please enter your full name: ";
std::cin.getline (firstName, 19, ' ');
std::cin.getline (lastName, 19);
std::cout << "Enter your age: ";
std::cin.getline (age, 5);
while (i != 1)
{
std::cout << "Enter your gender (m/f)";
std::cin.getline (gender, 2);
switch (gender)
{
case 'm':
std::cout << "nHello Mr. ";
i++;
break;
case 'f':
std::cout << "nHello Mrs. ";
i++;
break;
default:
std::cout << "nThat is not even a gender!n";
break;
}
}
std::cout << lastName << "!n";
std::cout << "You are " << age << " years old.";
return 0;
}
Когда я попытался скомпилировать это, мой компилятор выдает следующую ошибку:
NameAgeQ.cpp: In function 'int main()':
NameAgeQ.cpp:24:15: error: switch quantity not an integer
Раньше я пытался кодировать другие программы с операторами «переключатель», и они могут обрабатывать символы. Однако в предыдущих программах я объявлял «пол» как «пол char»; вместо ‘char пол [];’.
Почему в данном конкретном случае оператор switch не работает? Он не поддерживает строку массива?
Как решить «ошибку $» не является целочисленным целым значением
Теги: разнообразный Компиляция
Как показано ниже:
В прошлый раз в лаборатории был учитель и не нашел учителя, но я сделал это на своей машине. Когда я столкнулся с той же проблемой, я все еще был агрессивным.
Шаг решения:
один,
Сохраните этот файл в следующем пути (Обратите внимание, являетесь ли вы CMX16 или другими местами):
Где вы передаете инструкции, будет другой путь.
два,
Как показано на рисунке ниже, предложение добавлено перед началом:
org 0
Можно загрузить и запустить:
Заканчивать.
Интеллектуальная рекомендация
Знание сценария оболочки (2)
-Ну судить, не являются ли строки неэмпатными -Z определить, пустые ли строки = Определить, является ли содержимое строки согласованным Пересечение = Определить, не является ли содержимое строки непос…
Node.js Пакет и инструмент управления пакетом NPM
Node.js Пакет и инструмент управления пакетом NPM 1.node.js. 1.1 В пакете входит следующее: Package.json: Опишите пакет Хранить двоичные файлы в подкаталоге Bin Хранить файлы JavaScript в подкаталоге …
Вам также может понравиться
Режим дизайна — семь принципов
Режим дизайна — семь принципов (1) Принцип открытия и закрытия — (является основой всех принципов) Определение: программное обеспечение, такое как классы, модули и функции, должныДля расширенного ра…
Фазли 2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
||||
1 |
||||
07.10.2018, 14:34. Показов 5592. Ответов 23 Метки нет (Все метки)
Миниатюры
0 |
Скиф 90 12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
||||
07.10.2018, 15:09 |
2 |
|||
Решение
не понимаю в чем ошибка У вас в 41-й строке попытка получить значение для массива, преобразуя строку из ячейки таблицы в число. А таблица, как видим, пустая. Можно, хотя и не вполне корректно, заменить эту строку на такую-
В этом случае при невозможности преобразовать строку из ячейки в число, подставляется ноль без сообщения об ошибке.
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 15:26 [ТС] |
3 |
таблица заполняется не вся, а только 2 на 2, нулями! Добавлено через 12 минут
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
07.10.2018, 15:30 |
4 |
где лучше показать результат этого задания? Я думаю, для наглядности лучше использовать две таблицы; результат можно сразу сравнить с исходными данными.
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 15:35 [ТС] |
5 |
так таблицу нужно заполнить всю и желательно разными числами как это сделать?
0 |
Модератор 8500 / 5659 / 2291 Регистрация: 21.01.2014 Сообщений: 24,267 Записей в блоге: 3 |
|
07.10.2018, 15:35 |
6 |
таблица заполняется не вся, а только 2 на 2, нулями! Дык она, таблица. то есть, вообще нигде не заполняется!!! А если ее пользователь должен руками заполнять — то тогда сами, будьте любезны, проверять правильность заполнения… Учтите, что пользователь может заполнить не все ячейки — отсюда и получите вот такую ошибку…
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
07.10.2018, 15:43 |
7 |
таблицу нужно заполнить всю и желательно разными числами как это сделать? Прежде всего в инспекторе объектов в опциях StringGrid goEditing перевести из false в true, чтоб можно было вводить данные. И на событие KeyPress поставить свою фильтрацию (чтоб только цифры позволялись) было бы желательно. Добавлено через 4 минуты
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 15:44 [ТС] |
8 |
а где события KeyPress?
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
07.10.2018, 15:48 |
9 |
В Инспекторе объектов OnKeyPress — двойной клик и появится заготовка. Не по теме: Дорогие модераторы, меня задолбала неубираемая панель «Узнать стоимость написания работы» и т.д. Это я вирус подцепил, или такой «ненавязчивый сервис» на вашем форуме?
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 15:50 [ТС] |
10 |
в ней что нибудь надо заполнять?
0 |
Скиф 90 12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
||||
07.10.2018, 15:54 |
11 |
|||
(«в ней что нибудь надо заполнять?..») — думаю, вы не про свою таблицу так спросили?
Это не даст ввести в поле таблицы какое-нибудь ругательное слово, — только цифры, знаки препинания, пробел.
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 15:57 [ТС] |
12 |
воот ввел, а свое задание так и не знаю как реализовать.
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
07.10.2018, 16:00 |
13 |
Наверное, найти для начала x и y — координаты ячейки, в которой максимальное число. Для этого двойным циклом просканировать таблицу, сравнивая очередную величину с временным образцом.
0 |
2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
|
07.10.2018, 16:02 [ТС] |
14 |
можно это в исходном коде или где то поправить можно?)
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
07.10.2018, 16:18 |
15 |
Решение Я б вашу задачу так решал… — на форме две таблицы, трэк-бар, задающий размерность матрицы (она у вас квадратная, как я понял), ну и кнопки исполнительные. Почему трэк-бар? у него есть ограничители минимума и максимума (мало ли чего пользователь в эдит введёт…). Потом по нажатию кнопки первая таблица заполняется случайными значениями (тоже желательно задаться ограничительными значениями). По другой кнопке ищется максимальное число в таблице и затем ячейки первой таблицы переносятся во вторую таблицу, исключая те ячейки, в координатах которых присутствует какая-либо из координат найденной максимальной ячейки. Размерность второй таблицы, естественно, на 1 меньше первой.
1 |
Модератор 8500 / 5659 / 2291 Регистрация: 21.01.2014 Сообщений: 24,267 Записей в блоге: 3 |
|
08.10.2018, 06:50 |
16 |
Не по теме:
Дорогие модераторы, меня задолбала неубираемая панель «Узнать стоимость написания работы» и т.д. Это я вирус подцепил, или такой «ненавязчивый сервис» на вашем форуме? Скиф 90, можете скрин прицепить? никакого такого «сервиса» не наблюдается? Добавлено через 58 секунд
Почему трэк-бар? Вот именно: почему он? Почему не SpinEdit?
0 |
Практикантроп 4787 / 2686 / 518 Регистрация: 23.09.2011 Сообщений: 5,747 |
|
08.10.2018, 08:23 |
17 |
А чем плох трэк-бар? А вот CSpinEdit требует корректировки опции компилятора Disable inline expansions (в ранних версиях Билдера), что для малоопытного ТС, как я понимаю, создаст дополнительные заботы. Да и ручной ввод в его поле цифр тоже несколько кривовато устроен. Так по крайней мере на моем Builder’е 5 версии. Может, конечно, в RAD-студии это все исправили… .
0 |
12 / 10 / 5 Регистрация: 07.10.2018 Сообщений: 40 |
|
08.10.2018, 10:23 |
18 |
Скиф 90, можете скрин прицепить? Пожалуйста Миниатюры
0 |
Фазли 2 / 1 / 0 Регистрация: 07.10.2018 Сообщений: 172 |
||||
08.10.2018, 11:03 [ТС] |
19 |
|||
Вот решил своё задание!
————————————————————— Миниатюры
0 |
Модератор 8500 / 5659 / 2291 Регистрация: 21.01.2014 Сообщений: 24,267 Записей в блоге: 3 |
|
08.10.2018, 12:39 |
20 |
Скиф 90, ну, однако, это Ваша беда… Нет тут на форуме ничего подобного… Смотрите в браузере, какие надстройки нацеплялись…
А вот CSpinEdit требует… Ну да, про это я что-то забыл… В RAD Studio — там их теперь два: TCSpinEdit, который ведет себя точно так же, как и встарь, и TSpinEdit — вполне так себе адекватная штука для ввода чисел… Кроме того, есть еще связка Edit + UpDown…
А чем плох трэк-бар? Не по теме: Ой, ну там же в этот ползунок мышом еще попасть надо, а когда руки дрожат — то мучение, прямо…
0 |