Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过在C中传递变量名称来为变量设置值?_C_Variables_Pointers - Fatal编程技术网

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

如何通过在C中传递变量名称来为变量设置值?,c,variables,pointers,C,Variables,Pointers,我不确定这在C中是否可行。每个浮点值都将随机设置。我想根据char whatVar对应的内容设置它们的值。例如,让我们假设charwhatvar[]=“phValue”如何指向whatVar中的变量名,然后设置值?我希望在不使用if条件或开关的情况下实现这一点。为什么不 char whatVar[] = ""; float phValue, ecValue, tempValue; 等等等等 编辑:如果不需要ifs和开关,那么我们可以使用某种类型的stlmaping,将字符串表示形式作为键

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

为什么不

char whatVar[] = "";

float phValue, ecValue, tempValue;  
等等等等


编辑:如果不需要
if
s和
开关
,那么我们可以使用某种类型的stl
map
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