- ベストアンサー
構造体の各メンバへのアクセス方法をループで実装する方法について
notnotの回答
できますけど、あまり意味の無いような気がします。 int offset[] = { offsetof(Sample,test1), offsetof(Sample,test2), offsetof(Sample,test3) }; int i; for(i=0; i<sizeof x/sizeof(char*); i++){ strcpy((char*)&sample+offset[i],x[i]); }
関連するQ&A
- 構造体のメンバをfor文で回したい
次のようなソースで typedef struct test{ int a; int b; int c; }TEST; TEST xx; xx.a=xx.a+3; xx.b=xx.b+3; xx.c=xx.c+3; printf("%d %d %d\n",xx.a,xx.b,xx.c); のようなことをしたいんですが、 xx.a=xx.a+3; xx.b=xx.b+3; xx.c=xx.c+3; の処理の部分をfor文で回せるようにしたいです。 構造体の宣言のところで配列をつかって struct test{ int abc[3]; } とすれば簡単にいくのは分かるんですが、a,b,cそれぞれに分かりやすい名前をつけたいので、配列で確保したくないです。 何かいい方法はないでしょうか? 実際計算に使うんですが、メンバはすべてdouble型で30個程度になると思います。
- ベストアンサー
- C・C++・C#
- 構造体のメンバーの静的なサイズ取得
構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }
- ベストアンサー
- C・C++・C#
- 構造体・ビットフィールドのvolatileに関して。
以下のような構造体があったとする。 -(1) ----------------------------- typedef volatile struct ABC{ char x; char y; }stABC; -(2) ----------------------------- typedef struct ABC{ volatile char x; volatile char y; }stABC; --------------------------------- ■質問 ------------- stABC abc; abc.x // ←volatileは有効? abc.y // ←volatileは有効? ------------- ・このとき、メンバx,y は(1)/(2)の構造体型宣言どちらでも 同じ意味合いになっているのでしょうか。 ※特に(1)の場合、volatileは有効になっているのでしょうか。 ・ビットフィールド時も同じと考えて問題ないでしょうか。 (1)typedef volatile struct ABC{ char x: 1 ; char x: 7 ; }stABC; (2)typedef struct ABC{ volatile char x: 1 ; volatile char x: 7 ; }stABC;
- 締切済み
- C・C++・C#
- 構造体の型について
ある構造体をxxxと名づける以下のプログラムを作成しました。 ーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx aaa; strcpy(aaa.variable,"bbb"); printf("%s\n",aaa.variable); } ーーーーーーーーーーー これは動き、bbbと表示されます。 しかしながら、構造体のポインタを使用した 以下のプログラムではコンパイルはとおりますが実行時にコアダンプして落ち ます。 ーーーーーーーーーーーーーーーーーーーー #include <stdio.h> #include <string.h> main() { typedef struct { char variable[64]; char type[64]; char value[512]; } xxx; xxx* aaa; strcpy(aaa->variable,"bbb"); printf("%s\n",aaa->variable); } ーーーーーーーーーーーーーーーーーーーーーーー 両プログラムの意図はまったく同じなのに何故いけないのでしょうか。
- ベストアンサー
- C・C++・C#
- 構造体のメンバ初期化について
構造体のメンバを初期化したいのですが、 メンバ数が多いので1個ずつ初期化するのは面倒です。 そのため、一度に初期化する方法を探していたのですが、 memsetやZeroMemoryなどで可能だということが解りました。 しかし、パディング等の問題を含めて この関数を使用しても問題ないのでしょうか? 以下に例を挙げます。 typedef struct SAMPLE { char a; int b; int c; float d; SAMPLE(){ ZeroMemory( this, sizeof(Sample) ); } } Sample; 構造体Sampleは32bitマシンでは 一見13byteに見えますが、パディングが入るので、 実際にはsizeof(Sample)は16byteと表示されます。 また、構造体には自動的に初期化と解放するための、 コンストラクタ・デストラクタのみがあり、 関数や仮想関数などの実装はありません。 この方法の安全性について、 ご存知の方がいらっしゃればアドバイスいただけると助かります。 よろしくおねがいします
- ベストアンサー
- C・C++・C#
- C++でCの構造体をnewするとまずいのでしょうか?
以下のようなCで書かれたヘッダがあったとして ---testc.h--- typedef struct __Test { int i; char c[30]; char* x; } Test; これを以下のようにnewして使うのは問題ないでしょうか? ---test.cpp--- extern "C" { #include test.h } int main(void) { Test* test = new Test(); test->i = 30; test->c[3] = 'a'; test->x = "aiueo"; return 0; }
- 締切済み
- C・C++・C#
- 構造体のmemcpy書き込む
struct{ char a; char b; } test01_t struct{ char c; char d[3]; } test02_t struct{ test01_t test01; test02_t test02; } 書き込み先の領域の先頭アドレス char* Addr; データ構造が以下になっている状態で、 struct{ test01_t test01; test02_t test02; } test01_t test01の領域には書き込まず test02_t test02の情報だけ 領域にmemcpyまたはその他の方法で書き込みむにはどうしたらよいでしょうか? よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- bool と BOOL の違い(構造体)
C++プログラマーとしてはとっても恥ずかしいタイトルですが。。。 Borland C++ Builder 9でアプリ開発してます。 訳あって、既存のアプリ(BCB6)を改造して別のアプリを作る業務を引き継いだのですが、修正する度に可笑しな動作をするのでソースを調べてみたら。。。 『boolとBOOLが混在してる(・・;)』 「ダメダメアプリ」に頭を抱えている今日この頃です。 前置きはさておき、質問ですが、 この「ダメダメアプリ」の中に2種類の構造体 typedef struct _TEST_A{ bool flag; char ch[45]; }TEST_A; と typedef struct _TEST_B{ BOOL flag; char ch[45]; }TEST_B; があるのですが、それぞれsizeof()でサイズを計算すると、 sizeof(TEST_A) = 46 sizeof(TEST_B) = 52 という結果になりました。 BOOLは4バイトなので49バイトかと思ったのですが、 TEST_Bが52になる理由がわかりません。 どなたかわかる方いらっしゃったら教えてください。
- ベストアンサー
- C・C++・C#
- 構造体の構造体の構造体をまとめて初期化したい
gnuplotをCで吐くためのプログラムを作成していますが、 構造体の構造体の構造体をまとめて初期化することができません。 以下がコードそのコードです。 #define MAX_PLOT_DATA_NUM 8 #define MAX_GRAPH_SET_NUM 35 //child -------------------------------------------------- typedef struct { char *fileName; int column[2]; char *caption; } Col; //child -------------------------------------------------- typedef struct { char *category; char *subCategory; char *xLabel, *yLabel; char *saveFileName; Col col[MAX_PLOT_DATA_NUM]; } GraphSet; //child -------------------------------------------------- typedef struct { char *lineFormat; int lineWidth; } Common; //mother ------------------------------------------------- typedef struct { GraphSet gs[MAX_GRAPH_SET_NUM]; Common common; } PlotFormats; int main(){ PlotFormats pF = { {"Motor angle","right","Time [s]","Angle [rad]","ang_R", {"motor.dat",1,2,"ang #1 "}, {"motor.dat",1,3,"ang #2 "}, {"motor.dat",1,4,"ang #3 "}, {"motor.dat",1,5,"ang #4 "}, {"motor.dat",1,6,"ang #5 "}, {"motor.dat",1,7,"ang #6 "}, }, //ここから下のコメントアウトしてる部分をはずすとコンパイルが通らなくなります。 //{"Motor angle","left","Time [s]","Angle [rad]","ang_L", // {"motor.dat",1,12,"ang #1 "}, // {"motor.dat",1,13,"ang #2 "}, // {"motor.dat",1,14,"ang #3 "}, // {"motor.dat",1,15,"ang #4 "}, // {"motor.dat",1,16,"ang #5 "}, // {"motor.dat",1,17,"ang #6 "}, //}, {"w l", 5}}; return 0; } エラーは ・間接参照のレベルが 'char *' と 'int' で異なっています。(複数) ・初期化子の数が多すぎます。 と出ます。 長くなりましたが、わかる方がいましたら、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 構造体の宣言について
今解析しているC言語のプログラムで以下の様な構造体の宣言があります。 typedef struct { unsigned char :3; unsigned char aaa :1; unsigned char bbb :1; unsigned char ccc :1; unsigned char ddd :1; unsigned char eee :1; } tTSR ; :3や:1の部分の意味がわかりません。 御存知の方ご回答よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます。 今回はポインタ配列を使用することにしました。 (データ型がすべてcharなので)