Как создать таблицу поиска

По сути, я только понял, что, как я кодировал свой проект, мне нужно реализовать некоторую форму таблицы поиска, теперь я никогда не делал этого раньше и поэтому не знаю, как это сделать, и поиск в Google на самом деле не дает четкий набор инструкций

Мне нужна таблица поиска, чтобы пользователь мог ввести функцию в командную строку и затем передать параметры этой функции, но не знаю, с чего начать

1

Решение

Вы можете сделать что-то вроде этого, чтобы создать таблицу поиска (отправки):

(Обратите внимание: это способ реализации таблицы диспетчеризации, и она совместима как с 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» на каждую функцию).

2

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

Я не знаю точно ваши требования, но я мог бы представить что-то вроде этого:

Возможно, вы захотите взглянуть на Указатели функций C ++. Вы можете создать собственную структуру, которая содержит:

  1. название функции
  2. указатель на эту функцию
  3. вектор вариантов (например, из увеличение или напишите свойсвоя) держать аргументы
  4. проверить функцию, чтобы увидеть, соответствуют ли аргументы и указатель на функцию

Создайте для каждой функции, которую пользователь может вызвать экземпляр этой структуры. Отобразите их пользователю и позвольте ему выбрать. На втором шаге пусть он вводит значения для аргументов.

1

Ты можешь использовать 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);
}
1

Я привожу вам пример с 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);
}
}

Таблицы поиска — один из самых мощных приемов во вселенной программирования.
Они представляют собой массивы, содержащие предварительно рассчитанные значения и, таким образом, заменяют тяжелую среду выполнения
вычисления с помощью более простой операции индекса массива. Например, представьте, что вы хотите
отслеживать положение чего-либо, читая расстояния, приходящие с кучей расстояния
датчики. У вас будут тригонометрические и, вероятно, мощные вычисления.
Поскольку они могут занимать много времени для вашего процессора, это было бы умнее и
дешевле использовать чтение содержимого массива вместо этих вычислений. Это обычный
иллюстрация для использования справочных таблиц.

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