Используйте символы в кавычках в 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 ().

Как это сделать? Какую функцию я должен использовать?

Спасибо!

, 👍2

Обсуждение

В 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


2 ответа


1

Это невозможно (если вы не будете продолжать стремиться; я тоже еще не пробовал). Судя по вашему намерению, одна вещь, которую вы можете сделать, - это создать массив имен функций, которые вы хотели бы использовать, другой массив, содержащий указатели на функции, и программу для вызова функции в соответствии с входным текстом. Я сам не пробовал, так что, возможно, это звучит неразумно, но это единственное, что пришло мне в голову.

Вот такой пример:

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);
}
,

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