Используйте символы в кавычках в const char* в качестве имени функции
Я уже давно пытаюсь использовать слово, объявленное как const string* word = "xxx"
, в качестве имени функции void, объявленной где-то ниже в моем коде.
Вот пример с ssid
:
const char* ssid = "name_of_ssid";
void (*name of ssid*) () {
⠀//some code
}
Я хочу использовать слово, объявленное в const char*
в кавычках, в качестве имени функции.
Он не может быть написан просто void ssid()
.
Да, я могу установить имя функции void вручную, когда const char* ssid = "CoffeeWifi"
Я могу ввести void CaffeeWifi ()
, но я хочу сделать это таким образом, потому что мой код специфичен для этой опции и объяснить этот код здесь было бы очень сложно. Когда я меняю массив const char*
word с "xxx"
на "yyy"
, я также хочу изменить имя void с void xxx()
на void yyy ()
.
Как это сделать? Какую функцию я должен использовать?
Спасибо!
@oreo, 👍2
Обсуждение2 ответа
Это невозможно (если вы не будете продолжать стремиться; я тоже еще не пробовал). Судя по вашему намерению, одна вещь, которую вы можете сделать, - это создать массив имен функций, которые вы хотели бы использовать, другой массив, содержащий указатели на функции, и программу для вызова функции в соответствии с входным текстом. Я сам не пробовал, так что, возможно, это звучит неразумно, но это единственное, что пришло мне в голову.
Вот такой пример:
String function_names[3] = {"foo", "bar", "quux"}; /* I am not sure of this syntax;
corrections are welcome */
int *functions[3] = {&foo, &bar, &quux};
String input;
void setup(){
Serial.begin(9600);
}
void loop(){
while(Serial.available()){
String temp_input = Serial.readString()
input = (temp_input == "")? String("Nothing here") : temp_input;
execute(input);
}
delay(1000);
}
void execute(String func_name){
for(int i = 0; i < 3; i++){
if(function_names[i] == func_name){
*functions[i]();
}
}
}
int foo(){
Serial.println("foo");
return(0);
}
int bar(){
Serial.println("bar");
return(0);
}
int quux(){
Serial.println("quux");
return(0);
}
Будучи символом константы, вы можете установить его во время компиляции с помощью определения, а затем использовать его.
#define fstring(x) #x
const char* ssid = fstring(SSID_NAME) ;
void setup() {
Serial.println("Start");
Serial.println(ssid);
SSID_NAME();
}
void loop() {}
void SSID_NAME (){
Serial.println(ssid);
}
Вместо использования кавычек при этом используется оператор stringize.
Пропущенный вызов "Серийный.начало" в сторону, я не думаю, что это делает то, что вы намеревались сделать. Зная, как работает оператор stringize, мне трудно понять, что должен был делать код, просто взглянув на него. Вы в любом случае должны попробовать это сами., @timemage
Протестировано на Леонардо (OP не указывает), поэтому не требует серийного.begin., @user85471
Я не уверен насчет "почему" ОП, но я думаю, что это позволяет достичь "чего", но в обратном порядке. Вместо того, чтобы использовать строку в качестве имени функции, она делает имя функции доступным в виде строки., @user85471
- Создать номер
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
В C++такого сделать невозможно. Что вы могли бы сделать, так это написать другую программу, которая производит код на C++, который затем можно было бы скомпилировать. Однако все это не имеет отношения к Arduino., @timemage
Чего вы надеетесь достичь с помощью этого, чего вы не смогли бы сделать, просто передав SSID в качестве параметра функции?, @Majenko
Вы можете сделать это с помощью #define вместо назначения символьной строки., @JRobert
Возможно, вы могли бы написать какой-нибудь макрос препроцессора, чтобы достичь этого, но я действительно не могу придумать веской причины, по которой вы хотели бы это сделать. В любом случае, @timemage прав. Это не имеет никакого отношения к Arduino., @StarCat
У меня такое чувство, что это проблема x-y. У вас есть проблема, которую вы не описали, и вы думаете, что это решение, но, скорее всего, это не так. Поэтому, пожалуйста, опишите лучше, почему вы хотите это сделать, @chrisl
Это звучит как нечто, что, если его хорошо описать, может быть приложением для x-макросов, но на самом деле они тоже не связаны с Arduino., @timemage
@timemage, мой ответ в порядке ? (правки также разрешены), @Sam Ruben Abraham
Это в основном зависит от О. П., Если вам просто интересно мое мнение: это разумный ответ на разумные предположения о проблеме, которая, возможно, мотивирует их вопрос. Но их вопрос *как заданный* не рассматривается этим. Не всегда легко сказать, в какой степени вы должны принимать благотворительную интерпретацию вопроса человека или добиваться, чтобы они были точными. Я склонен настаивать на деталях и меньше размышлять, но где-то есть грань. Если вас интересуют такие вещи, вероятно, вам стоит прочитать об этом в справочном центре и спросить на мета-сайте., @timemage
@timemage из моего понимания, операция с нетерпением ожидает выполнения определенной функции специально для конкретного случая использования. Принимая это во внимание. Я чувствую, что мой ответ в порядке. Добавление аргументов кажется мне немного затруднительным в такой ситуации (что означает редактирование функции exemplar "void execute ()" для размещения аргументов для ввода в требуемую функцию, но это должно работать нормально только в том случае, если все функции следуют одному и тому же формату объявления аргументов)., @Sam Ruben Abraham
"объяснить этот код здесь было бы очень сложно. "Попробуйте меня, я всегда готов чему-нибудь научиться., @user85471