如何通过在C中传递变量名称来为变量设置值?

时间:2012-07-09 18:21:40

标签: c variables pointers

char whatVar[] = "";

float phValue, ecValue, tempValue;  

我不确定C中是否可行。每个浮点值都将随机设置。我想根据char whatVar对应的内容设置它们的值。例如,让我们说char whatVar[] = "phValue";如何指向whatVar中的变量名,然后设置值?我想在不使用条件或开关的情况下实现这一点。

5 个答案:

答案 0 :(得分:4)

唐'吨;使用数组。将程序逻辑与变量名称联系起来是一个可怕的想法。存在变量名称以帮助您作为程序员了解代码正在执行的操作。除此之外,不要(也不应该)具有任何意义。

相反,使用其中index / bucket / mapping /具有逻辑意义的集合。对于初学者来说,完全按照自己的意愿去做很常见,但这几乎肯定是个坏主意。听起来像你想要一个字符串 - >浮点映射或哈希表。

答案 1 :(得分:3)

您必须手动将whatVar转换为实际变量值 。 C语言没有这样的直接功能。

可以通过if/switch阶梯来完成。或者可以通过预先构建一个将变量名称“映射”(映射)到变量地址(以及必要时的类型)的表来完成。您必须手动搜索表格。它仍然会有if,除非你为你的名字开发某种[最小]完美哈希函数(参见Steve Jessop的评论)。

答案 2 :(得分:1)

为什么不呢?

if(strcmp(whatVar, "phValue") == 0)
{
   phvalue = 3; //some value
}

依此类推。

编辑:如果不需要ifswitch那么我们可以在字符串表示之间使用某种stl map作为键,将它们的变量用作值。

答案 3 :(得分:1)

这超出了语言规范的范围,我认为如果这是您希望在该语言中使用的功能,则另一种语言对您来说更有用,它具有此类功能。

我能想到实现这个的唯一方法是做一些预处理技巧,这似乎是一个坏主意。使用这种方法,你不会在代码中拥有if,而是一些非常难以维护的预处理。

答案 4 :(得分:0)

如果您真的想要这样做,可以使用dlsym功能(只要您访问的变量是全局的)。这是一个简单的例子:

 #include <dlfcn.h>
 #include <stdlib.h>
 #include <stdio.h>

 float phValue, ecValue, tempValue;  
 int main(int argc, char *argv[]) {
    int i;
    phValue = 0;
    ecValue = 0;
    tempValue  = 0;
    printf("Before:\n");
    printf("\tphValue = %f\n", phValue);
    printf("\tecValue = %f\n", ecValue);
    printf("\ttempValue  = %f\n", tempValue);

    for(i = 1; i < argc; i += 2) {
       float *varptr = (float *)dlsym(RTLD_MAIN_ONLY, argv[i]);
       *varptr = atof(argv[i+1]);
    }
    printf("\nAfter:\n");
    printf("\tphValue = %f\n", phValue);
    printf("\tecValue = %f\n", ecValue);
    printf("\ttempValue  = %f\n", tempValue);
 }

一个演示:

 % gcc varname.c -ldl
 % ./a.out phValue 12.1 tempValue 4.3 ecValue 2.2
 Before:
    phValue = 0.000000
    ecValue = 0.000000
    tempValue  = 0.000000

 After:
    phValue = 12.100000
    ecValue = 2.200000
    tempValue  = 4.300000