По сути, я только понял, что, как я кодировал свой проект, мне нужно реализовать некоторую форму таблицы поиска, теперь я никогда не делал этого раньше и поэтому не знаю, как это сделать, и поиск в Google на самом деле не дает четкий набор инструкций
Мне нужна таблица поиска, чтобы пользователь мог ввести функцию в командную строку и затем передать параметры этой функции, но не знаю, с чего начать
Вы можете сделать что-то вроде этого, чтобы создать таблицу поиска (отправки):
(Обратите внимание: это способ реализации таблицы диспетчеризации, и она совместима как с C, так и с C ++. Существуют другие и, возможно, более простые способы сделать это в C ++ без повторного изобретения колеса, например, с использованием некоторых контейнеров и т. Д.).
#include <iostream>
using namespace std;
// Arrays start from 0.
// This is used for code
// readability reasons.
#define CASE(X) X-1
typedef void (*chooseCase)();
// Functions to execute each case.
// Here, I am just printing
// different strings.
void case1(){
cout<< "case1" << endl;
}
void case2(){
cout<< "case2" << endl;
}
void case3(){
cout<< "case3" << endl;
}
void case4(){
cout<< "case4" << endl;
}
//Put all the cases in an array.
chooseCase cases[] = {
case1, case2, case3, case4
};
int main()
{
//You can call each scenario
//by hand easily this way:
cases[CASE(1)]();
cout << endl;
//Idea: You can even set in another
// array a sequence of function executions desired.
int casesSequence[] = {
CASE(1), CASE(2), CASE(3), CASE(4),CASE(3),CASE(2),CASE(1)
};
//Execute the functions in the sequence set.
for(int i = 0; i < (sizeof(casesSequence)/sizeof(int)); ++i){
cases[casesSequence[i]]();
}
return 0;
}
(На основании: Добавление многопользовательского режима с разделенным экраном)
Теперь о входных данных программы, вы можете сопоставить имя вашей функции, например, чтобы получить индекс, и вы могли бы применить приведенный выше пример к параметризованным функциям, и вы также можете использовать это в ситуациях, когда функции параметризованы.
В этом случае, пожалуйста, примите во внимание, что все функции должны подчиняться подписи указателя функции, чтобы использовать ее в этом примере. В противном случае вы должны сделать более сложные вещи (например, с помощью void
* аргумент и передача аргументов struct
указатель «instance» на каждую функцию).
Я не знаю точно ваши требования, но я мог бы представить что-то вроде этого:
Возможно, вы захотите взглянуть на Указатели функций C ++. Вы можете создать собственную структуру, которая содержит:
Создайте для каждой функции, которую пользователь может вызвать экземпляр этой структуры. Отобразите их пользователю и позвольте ему выбрать. На втором шаге пусть он вводит значения для аргументов.
Ты можешь использовать std::map<std::string, functype>
где functype
это typedef
указатель функции, или даже boost::function<>
тип.
std::map<std::string, functype> funcs;
void call_user_func(const std::string &user_input, const std::string &arg1, const std::string & arg2)
{
functype f = funcs.at(user_input);
f(arg1, arg2);
}
Я привожу вам пример с Arduino, который является почти такой же аналогией кода C / C ++
float cosLUT[(int) (360.0 * 1 / 0.5)] ;
const float DEG2RAD = 180 / PI ;
const float cosinePrecision = 0.5;
const int cosinePeriod = (int) (360.0 * 1 / cosinePrecision);
void setup()
{
initCosineLUT();
}
void loop()
{
// nothing for now!
}
void initCosineLUT(){
for (int i = 0 ; i < cosinePeriod ; i++)
{
cosLUT[i] = (float) cos(i * DEG2RAD * cosinePrecision);
}
}
Таблицы поиска — один из самых мощных приемов во вселенной программирования.
Они представляют собой массивы, содержащие предварительно рассчитанные значения и, таким образом, заменяют тяжелую среду выполнения
вычисления с помощью более простой операции индекса массива. Например, представьте, что вы хотите
отслеживать положение чего-либо, читая расстояния, приходящие с кучей расстояния
датчики. У вас будут тригонометрические и, вероятно, мощные вычисления.
Поскольку они могут занимать много времени для вашего процессора, это было бы умнее и
дешевле использовать чтение содержимого массива вместо этих вычислений. Это обычный
иллюстрация для использования справочных таблиц.