char whatVar[] = "";
float phValue, ecValue, tempValue;
我不确定C中是否可行。每个浮点值都将随机设置。我想根据char whatVar对应的内容设置它们的值。例如,让我们说char whatVar[] = "phValue";
如何指向whatVar中的变量名,然后设置值?我想在不使用条件或开关的情况下实现这一点。
答案 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
}
依此类推。
编辑:如果不需要if
和switch
那么我们可以在字符串表示之间使用某种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