char whatVar[] = "";
float phValue, ecValue, tempValue;
これが C で可能かどうかはわかりません。各 float 値はランダムに設定されます。char whatVar が対応するものに応じて値を設定したいと思います。たとえば、char whatVar[] = "phValue";
whatVar 内の変数名を指定して値を設定するにはどうすればよいでしょうか。if 条件やスイッチを使わずにこれを実現したいと思います。
しないでください。配列を使用します。プログラム ロジックを変数の名前に結び付けるのは、恐ろしい考えです。変数名は、プログラマーがコードの動作を理解するのに役立つように存在します。それを超えて、何の意味もありません(そしてすべきではありません)。
代わりに、インデックス/バケット/マッピング/論理的な意味を持つコレクションを使用してください。初心者が自分のやりたいようにやることはよくあることですが、それは間違いなく悪い考えです。文字列 -> float マップまたはハッシュ テーブルが必要なように思えます。
whatVar
実際の変数値への変換を手動で実装する必要があります。C言語にはそのような直接的な機能はありません。
if/switch
はしごでできます。または、変数名を変数アドレス (および、必要に応じて型) に「射影」(マップ) するテーブルを事前に作成することによって行うこともできます。テーブルを手動で検索する必要があります。if
ただし、名前に対してある種の[最小限の]完全なハッシュ関数を開発しない限り、まだ's があります (Steve Jessop のコメントを参照)。
これは言語仕様の範囲外であり、これが言語に必要な機能である場合、この種の機能を備えた別の言語がより役立つと思います。
これを実装する唯一の方法は、いくつかの前処理のトリックを実行することですが、これは悪い考えのように思えます。この方法を使用すると、コード自体に if が含まれることはありませんが、メンテナンスが非常に困難な前処理がいくつかあります。
なぜだめですか ?
if(strcmp(whatVar, "phValue") == 0)
{
phvalue = 3; //some value
}
などなど。
編集 : if
s と theが望ましくない場合は、キーとしての文字列表現と値としてのそれらの変数の間にswitch
何らかの stl ing を使用できます。map
本当にこれを行いたい場合は、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