如何通过在C中传递变量名称来为变量设置值?
我不确定这在C中是否可行。每个浮点值都将随机设置。我想根据char whatVar对应的内容设置它们的值。例如,让我们假设如何通过在C中传递变量名称来为变量设置值?,c,variables,pointers,C,Variables,Pointers,我不确定这在C中是否可行。每个浮点值都将随机设置。我想根据char whatVar对应的内容设置它们的值。例如,让我们假设charwhatvar[]=“phValue”如何指向whatVar中的变量名,然后设置值?我希望在不使用if条件或开关的情况下实现这一点。为什么不 char whatVar[] = ""; float phValue, ecValue, tempValue; 等等等等 编辑:如果不需要ifs和开关,那么我们可以使用某种类型的stlmaping,将字符串表示形式作为键
charwhatvar[]=“phValue”代码>如何指向whatVar中的变量名,然后设置值?我希望在不使用if条件或开关的情况下实现这一点。为什么不
char whatVar[] = "";
float phValue, ecValue, tempValue;
等等等等
编辑:如果不需要if
s和开关
,那么我们可以使用某种类型的stlmap
ing,将字符串表示形式作为键,将其变量作为值 您必须手动将whatVar
转换为实际变量值。C语言没有这种直接的特性
它可以通过if/开关梯形图来完成。也可以通过预先构建一个表来完成,该表将变量名“投影”(映射)到变量地址(以及,如果需要,映射类型)。您必须手动搜索该表。如果
,它仍然会有,除非你为你的名字开发了某种[最小]完美的哈希函数(见Steve Jessop的评论)。不要;使用数组。将程序逻辑与变量名称联系起来是一个可怕的想法。变量名的存在是为了帮助程序员了解代码正在做什么。除此之外,这个问题没有(也不应该)任何意义
相反,使用一个集合,其中index/bucket/mapping/which具有逻辑意义。对于初学者来说,完全按照自己的意愿去做是很常见的,但这几乎肯定是个坏主意。听起来你想要一个字符串->浮点映射或哈希表。这超出了语言规范的范围,我认为如果这是你希望在语言中拥有的一个特性,那么另一种语言对你来说会更有用,因为它具有这种功能
我能想到的实现这一点的唯一方法是做一些预处理技巧,这似乎是个坏主意。使用这种方法,代码中不会有if,而是会有一些非常不可维护的预处理。如果您真的想这样做,可以使用dlsym
函数(只要您访问的变量是全局变量)。下面是一个简单的例子:
if(strcmp(whatVar, "phValue") == 0)
{
phvalue = 3; //some value
}
请注意,这就是我们大多数人如何用argc
s来解释argv
!!!!使用if
@lc的开关,OP不需要if条件句。@jsn这太尴尬了,我没看到。但仍然不确定小if语句有什么不好。@lc使用小if语句没有什么错。我试图尝试一些不同的方法。如果您构造一个无条件表达式,当输入为'p'
时计算结果为0
,当输入为'e'
时计算结果为1
,当输入为't'
时计算结果为2
,则可以不使用ifs/switchers/ternaries。为*whatVar
计算该表达式,然后使用一个3元素查找数组,该数组为您提供指向所需变量的指针。显然,这不会对输入进行任何检查,如果没有条件,这将非常困难。和以往一样,这种避免分支的做法是一种针孔优化尝试,可能不会有任何帮助,这正是提问者所要求的。@Steve Jessop:是的,某种完美的散列方法会奏效。但我确信这不是OP要求背后的目标。@Steve Jessop,听起来很有趣。我是C的新手。我开始使用C,因为它是Arduino电子板所必需的。Ram在Arduino上也是有限的,所以我认为使用哈希需要大量的Ram。我很可能会使用条件。例如,(x/3)%3
的属性是,假设ASCII,x值'p'
,'e'
和't'
具有不同的输出。所以你可以用它来区分有效的输入,它不会告诉你这个字符串是否真的是你的一个变量的名字。可能有一个更快的“散列函数”可以通过移位和掩码来实现,这只是我第一次想到的。这是一次黑客攻击,但后来你要求进行黑客攻击;-)+尽管如此,还是有一个有趣的问题。
#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