Как я могу установить значение переменной, используя переменную, уже определенную в коде? - PullRequest
0 голосов
/ 08 октября 2019

Я начну с объяснения этого моего кода

#define __C 130.81
#define __D 146.83
#define __E 164.81
#define __F 174.61
#define __G 196.0
#define __A 220.0
#define __B 246.94


int main(int argc, char *argv[]){

    double frequency = 440;

    int opt;
    int option_index = 0;

    static struct option long_options[] =
        {
        {"freq",   required_argument,       0, 1},
        ...
    while ((opt = getopt_long(argc, argv, "f:v:o:hd:0:", long_options, &option_index)) != -1) {
        printf("%d\n", opt);
        switch (opt) {
        case 1:

            frequency = [[  SOLVE ME PLS  ]]

            break;
        }
    }

ПРИМЕЧАНИЕ: это всего лишь отрывок, а не реальный код.

Что мне нужно с этим CLI, так это то, что когда я выполняю: ./bin --freq A будет установлена ​​переменная frequency = __A, а если ./bin --freq D, то frequency = __D. Вот так просто! !!

1 Ответ

1 голос
/ 08 октября 2019

Используйте массив char и массив double, хорошо выровненный, и используйте strcspn, чтобы найти индекс:

#include <string.h>
double fq_val[] = {
        130.81, 146.83, 164.81, 174.61, 196.0,  220.0,  246.94, -1
};
char *fq_key =
        "C"     "D"     "E"     "F"     "G"     "A"     "B"
;
static double get_fq(char *key){
        return fq_val[strcspn(fq_key, key)];
}

Это использует -1 как "недопустимый"частота ".


Препроцессор может создать для вас массивы, определив макрос типа FQ(C, 130.81) FQ(D, 146.83) ... для использования внутри инициализатора, а затем определив FQ(k, v) как #k или * 1014. *:

#define FQLIST  \
        FQ(C, 130.81) \
        FQ(D, 146.83) \
        FQ(E, 164.81) \
        FQ(F, 174.61) \
        FQ(G, 196.0) \
        FQ(A, 220.0) \
        FQ(B, 246.94)

char *fq_key =
        #define FQ(k, v)        #k
        FQLIST
        #undef FQ
;
double fq_val[] = {
        #define FQ(k, v)        v,
        FQLIST
        #undef FQ
        -1
};
...