【问题标题】:How can I set a value to variable using a variable already defined in the code?如何使用代码中已定义的变量为变量设置值?
【发布时间】:2020-02-05 14:38:57
【问题描述】:

我首先解释我的这段代码

#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(一般但更难):构建一个内存表,您可以在其中查找例如"D" 并将其映射到 146.83。想法 2(更简单):只需使用 7 路 if/else 树。
  • @steve 如果你是我,你会选择什么内存和 CPU 消耗少?
  • @HarieAmjari 我建议的两个想法在内存和 CPU 方面应该几乎相同。这主要是一个你更愿意实施的问题。
  • 稍微更详细一点,想法 1 看起来像 struct freqmap { char letter; float freq; };,然后是 struct freqmap freqtab[] = { {'C', 130.81}, {'D', 146.83}, ... };。

标签: c command-line-interface command-line-arguments


【解决方案1】:

使用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 或 v,:

#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
};

【讨论】:

  • 但我不太明白你写的是“#k 或 v, 并包含两次包含 FQ(C, 130.81)、FQ(D, 146.83) 等行的标题”
  • 我添加了一个技巧示例——希望可以,因为我现在无法测试它。
  • 确实不需要单独的标题 - 但您也可以在答案的历史记录中查看使用的版本。
猜你喜欢
  • 2017-04-16
  • 1970-01-01
  • 2012-05-14
  • 1970-01-01
  • 2016-02-11
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多