- ベストアンサー
構造体の初期化の方法についての質問
- 構造体の初期化時にポインタを入れる方法について教えてください。
- 具体的な例として、構造体の初期化時にsizeとdataを入れる方法を知りたいです。
- dataがuint16_t*ではなくchar*の場合にも同様の方法が使えるのか知りたいです。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
起動時にデータの入ったポインタを指定したいなら別に配列で用意した変数を代入するしかなさそうですが static uint16_t init_data[] = {1,2,3,4,5}; struct PACKET p = { 5, init_data };
その他の回答 (6)
- chie65536(@chie65535)
- ベストアンサー率44% (8757/19871)
かな~り強引だが、これで動く。 #include <stdint.h> #include <stdio.h> #include <endian.h> #if !defined(__LITTLE_ENDIAN__) and !defined(__BIG_ENDIAN__) #if __BYTE_ORDER == __LITTLE_ENDIAN #define __LITTLE_ENDIAN__ #elif __BYTE_ORDER == __BIG_ENDIAN #define __BIG_ENDIAN__ #endif #endif struct PACKET { uint16_t size; uint16_t *data; }; #ifdef __LITTLE_ENDIAN__ struct PACKET p = {5, "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00"}; #else struct PACKET p = {5, "\x00\x01\x00\x02\x00\x03\x00\x04\x00\x05"}; #endif void main(void) { int i; struct PACKET *pp; pp = &p; for (i=0;i<pp->size;i++,pp->data++) printf("%d=%d\n",i,*(pp->data)); } C:\TEST\>test11 0=1 1=2 2=3 3=4 4=5 C:\TEST\> リトルエンディアン固定なら #include <stdint.h> #include <stdio.h> struct PACKET { uint16_t size; uint16_t *data; }; struct PACKET p = {5, "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00"}; void main(void) { int i; struct PACKET *pp; pp = &p; for (i=0;i<pp->size;i++,pp->data++) printf("%d=%d\n",i,*(pp->data)); } でOK。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
No.5 です。 できたと思ったら、「そもそも配列はポインタとイコールではないです」ということで、配列としてしか使えませんでした。
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
もしかしたら、標準じゃないのかな? 厳密には、お望みの回答じゃないですが。 struct PACKET { uint16_t size; // データの長さ uint16_t data[]; // データバイト列 }; PACKET p = {5, {1, 2, 3, 4, 5}}; PACKET q = {6, {1, 2, 3, 4, 5, 6}}; PACKET r = {7, {1, 2, 3, 4, 5, 6, 7}}; とりあえず、Borland の処理系では通りました。
お礼
私もこれでうまくいくような気がして書いてみたのですが、 エラーになってしまいました。。
- Tacosan
- ベストアンサー率23% (3656/15482)
ん, それなら #3 で言われる方法しかないです. そもそも char *str = "12345"; と「char * 型の変数を文字列リテラルで初期化する」のも, 規格上は static char aString[] = { '1', '2', '3', '4', '5', 0 }; char *str = aString; の省略形なわけだし. まあ, しいて言えば「sizeof を使えば長さを入れなくて済む」くらい.
- Tacosan
- ベストアンサー率23% (3656/15482)
「バイト列」で uint16_t ってのも今一つ謎だ.... さておき, (主に) data の方にどのような値を入れたいのですか?
補足
ごめんなさい、バイト列ではなかったですね。ワード列です。 データは" "で括るような文字列ではなく、いわゆるバイナリです。 dataが、uint16_tの配列の先頭を指すように初期化したいのですが…
- 14557545
- ベストアンサー率0% (0/1)
こんにちは キャストすれば良いと思います。 こんな感じで struct PACKET { uint16_t size; // データの長さ uint16_t *data; // データバイト列 }data = {1,(uint16_t *)"aaaa"};
補足
すみません、バイト列ではなかったですね。ワード列でした。 データは" "で括るような文字列ではなく、いわゆるバイナリなので、 "\x05\xa2\x35・・・・"というように文字列として書くのはかなりきついです。 リトルエンディアンとかビッグエンディアンの問題もありますし。。
お礼
なるほど、面倒くさい感じですが、 これならちゃんとできそうですね。