2
char whatVar[] = "";

float phValue, ecValue, tempValue;  

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

4

5 回答 5

4

不; 使用数组。将程序逻辑与变量名称联系起来是一个可怕的想法。变量名的存在可以帮助程序员了解代码在做什么。除此之外,不(也不应该)有任何意义。

相反,请使用索引/存储桶/映射/任何具有逻辑意义的集合。初学者完全按照自己的意愿去做是很常见的,但这几乎可以肯定是个坏主意。听起来你想要一个字符串-> 浮动映射或哈希表。

于 2012-07-09T18:26:15.853 回答
3

您将不得不手动whatVar实现对实际变量值的转换。C 语言没有这种直接的特性。

它可以通过if/switch梯子完成。或者它可以通过预先构建一个表来完成,该表将变量名称“投影”(映射)到变量地址(以及,如果需要,类型)。您将不得不手动搜索表格。它仍然会有if's ,除非你为你的名字开发某种 [最小] 完美的散列函数(参见 Steve Jessop 的评论)。

于 2012-07-09T18:24:53.163 回答
1

为什么不 ?

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

等等等等。

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

于 2012-07-09T18:24:01.143 回答
1

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

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

于 2012-07-09T18:27:24.520 回答
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
于 2012-07-09T19:10:31.993 回答