0

次の行を C で書きました。言語でサポートされているかどうかを知りたいです。それは次のようになります:

char * mode[7] = Config_Msg.DHCP ? "DHCP" : "Static";

基本的に、Config_Msg.DHCP の値に応じて、「DHCP」または「STATIC」の文字列値をモードに挿入したいと考えています。

IAR でコンパイルすると、次の警告が表示されます。

Warning[Pe520]: initialization with "{...}" expected for aggregate  

この警告はどういう意味ですか?

4

5 に答える 5

6

この警告は、あなたの質問に対する答えがノーであることを意味します。あなたがしていることは実行時に行うことができますが、初期化子では無効です。書くだけ:

char * モード;

モード = Config_Msg.DHCP ? "DHCP": "静的";

よく調べてみると、それはあなたの警告の原因ではありません。モードを 7 つのポインターの配列として誤って宣言したため、コンパイラーは次の形式の初期化を予期していました。

char * mode[ 7 ] = { "1", "2", "3" };

(残りの 4 つのエントリはすべてゼロに初期化されます)。

于 2011-11-06T08:17:17.787 に答える
3

そのような文字列を割り当てることはできないため、次のようにする必要があります。

char mode[7];
strcpy(mode,Config_Msg.DHCP ? "DHCP" : "Static");

の宣言も修正したことに注意してくださいmode。最初にポインターの配列を宣言しました。

または、ポインターを使用して行うこともできます。

char *mode = Config_Msg.DHCP ? "DHCP" : "Static";
于 2011-11-06T08:15:55.373 に答える
1

Mystical の答えは正しいですが、コードが機能しない理由を知りたい場合は、もう少し複雑です。文字列リテラルを配列の初期化子として使用できますcharが、すべての配列オブジェクトと同様に、式 (使用している式など) 内の文字列リテラルは、 or演算子?:のオペランドを除き、ポインターに減衰します。式の結果はポインターであり、ポインターは配列の有効な初期化子ではありません。&sizeof?:

于 2011-11-06T08:20:38.890 に答える
0

まず、あなたの例にchar * mode[7]あるはずです。pointersの配列ではなく、 s のchar mode[7]配列が必要です。charchar

あなたの質問には、いいえ、それはできません。次の 2 つの選択肢があります。

  1. modeaschar *modeを宣言し、 orを指すようにする"DHCP""Static"
  2. modeの配列として保持し、コピーするか、charそれにコピーします。 "DHCP""Static"

最初の方法では、文字列が読み取り専用 (.rodata セグメントに格納される) になることに注意してください。これは、文字列が配列にコピーされて変更できる 2 番目の方法とは異なります。ただし、この例ではそれが問題になるとは思いません。

于 2011-11-06T08:19:17.683 に答える
-2

あなたchar *mode[7]の変数は、文字へのポインタの配列です。

そして、あなたが求めるものは許可されていません。しかし、あなたはコーディングすることができます

char mode[20];

strncpy(mode, sizeof(mode), Config_Msg.DHCP ? "DHCP" : "Static");

追加編集

実は、他の方も指摘されてstrncpyいるように、限界に達すると危険です。私の例はもっと良いはずです

char mode[20];
memset (mode, 0, sizeof(mode));
strncpy (mode, sizeof(mode)-1, Config_Msg.DHCP ? "DHCP" : "Static");

したがって、 の最後のバイトはmode0 バイトのままです。mode文字列が唯一の可能性がある"DHCP""Static"、コメントでそれを文書化する必要があることが絶対に確実な場合は、最小限の長さ (7、静的modeの文字数に1 を加えた数) であると宣言し、 just を使用することができます。しかし、数か月後に のような別のモードになったと想像してください。コードにコメントを付けなかった場合、失敗することになります。strcpy"automatic"

数か月で自分のコードを理解することさえ困難な場合があります。これが、良いコメントが重要である理由です。

于 2011-11-06T08:17:18.810 に答える