3

これが可能かどうかはわかりませんが、提案をするのを手伝ってください。

変数unsigned char Var_2_insert;があり、配列がありconst unsigned char insert_here[4];ます。

この変数は、実行時に初期化されますvar_2_insert = 225;。配列のインデックス3は常にvar_2_insertの値を持つ必要があるという考え方です。だから私は次のようなことを試してみたい

insert_here[4] = { 0x00, 0x02, 0x03, Var_2_insert};

そのため、配列を読み取ろうとinsert hereすると、現在の値はvar_2_insertになります。今、私はこのように行くかどうかを知っています:

#define Var_2_insert 225

これはうまくいくでしょうが、この変数は実行時に更新する必要があるので、私は試しました

#define _VAR Var_2_insert
insert_here[4] = { 0x00, 0x02, 0x03, _VAR};

しかし、動作しません。では、どうすればこれに取り組むことができますか?私の質問が十分に明確であることを願っています。

ありがとう。

4

6 に答える 6

5

あなたができることはVar_2_insert、配列の3番目のインデックスへのポインタを持つことです。

unsigned char insert_here[4]; // since it's updating it shouldn't be const
unsigned char *Var_2_insert = &(insert_here[3]);
//you just need to update the use of var_2_insert to dereference..
//  var_2_insert = 225 // <-- before
   *var_2_insert = 225 // <-- after
于 2013-02-21T09:47:40.993 に答える
3

配列要素が実行時に変更される場合、それらは実際にはconstではありません。「#define」は、ハードコードされた値を直接入力するのと同じですが、プリプロセッサに他の利点の中でも機能を実行させる点が異なります。ただし、これは、ここで必要な値を動的に変更するのに役立ちません。

配列をポインタの配列として宣言し、次のように元の配列を使用する代わりにそれを参照します。

int var = 225;
int insert[4] = { 0x00, 0x02, 0x03, 255};
int *a[4] = { &insert[0], &insert[1], &insert[2], &var};

今後、値が更新されるこのポインタ配列を使用してくださいvar

于 2013-02-21T09:48:15.987 に答える
2

そうでないのに、なぜ定数として宣言するのですか?

unsigned char insert_here[4] = { 0x00, 0x02, 0x03, 0x00}; /* remove const */
insert_here[3] = Var_2_insert;
于 2013-02-21T09:44:01.307 に答える
2

配列初期化子はコンパイル時に配列の内容を定義するため、コンパイル時に定義する値を知っておく必要があります。ただし、値の1つは変数であり、実行時に定義されます。

この場合、配列の初期化を実行時に移動する必要があります。

unsigned char insert_here[4] = { 0x00, 0x02, 0x03};
insert_here[3] = Var_2_insert;

ただし、この場合、宣言後に配列を変更するため、配列定義からconstを削除する必要があります。

于 2013-02-21T09:35:30.823 に答える
2

うーん...なぜ#defineが必要なのかわかりません。実行時に変数を変更する必要がある場合は、定義ではなく変数を使用してください。最初の方法は正常に機能します:

char Var_2_insert = 225;
const unsigned char insert_here[4] = { 0x00, 0x02, 0x03, Var_2_insert};


"#define _VAR Var_2_insert"これにより、コンパイル時にすべての"_VAR"が"Var_2_insert"に置き換えられるため、varを直接配置できます。


編集:わかりました。いつでも、insert_here[3]の値がVar_2_insertであることを確認してください。それはより複雑で、ハードバグを引き起こす可能性のあるいくつかの副作用をもたらしますが、あなたが何をしているのかを知っているなら、あなたはそのようなポインターでそれを行うことができます:

const unsigned char insert_here[4] = { 0x00, 0x02, 0x03, 0};
unsigned char * Var_2_insert2 = (char*) &insert_here[3];

そして、それを変数として使用したい場合は、#defineが唯一の(しかし悪い)解決策です:

#define _VAR (*Var_2_insert2)

そして、あなたはあなたのconstをテーブルに置いておきますが、それはあなたのコードの残りの部分にそれを変更することは不可能であり、それが一定ではないことを伝えるだけです。

于 2013-02-21T09:41:55.473 に答える
2

@Roee Gavirelの回答に加えて、CではなくC ++を使用する場合は、参照変数を使用して構文を少しクリーンアップできます。

unsigned char insert_here[4] ;
unsigned char& Var_2_insert = insert_here[3];

var_2_insert = 225 // modifies insert_here[3]

間接参照演算子が不要なことを除けば、ここでの違いは、参照は初期化できますが割り当てられないため、常にinsert_here [3]を参照しますが、ポインター変数は再割り当てできます(宣言した場合を除きますがunsigned char* const Var_2_insert2、まだ逆参照する必要があります)。

多くのC++機能と同様に、このインスタンスは同等のCコードよりもオーバーヘッドがゼロです。

于 2013-02-21T20:52:19.597 に答える