- ベストアンサー
構造体 アドレス
VC++6 こんにちは。構造体のアドレスを文字列ポインタで操作することに悩んでいます。下にソースの一部を書きます。 typedef struct{ char code[100]; int type; }AAA; typedef struct{ double method[4][3]; int area; }BBB; 複数の構造体があり、 BOOL CTestApp::File_Check(){ AAA aaa; ~ db.DB_regi(2, (char *)&aaa); ~ } void CData::DB_regi(int key, char *buff) { switch(key){ ~ case 2: sss.push_back(buff); //vector<char *> sss; break; } で、データを登録し、 int CTestApp::Data_Check() { ~ AAA aaa; db.DB_get(2, (char *)&aaa); ~ } void CData::DB_get(int key, char *buff) { switch(key){ ~ case 2: buff = sss[i]; break; ~ } で、構造体のアドレスを取得しようと思ったら、取得できませんでした。 //DB_getの中では、aaa = (AAA *)buff;とすれば指定の構造体を取得できる。 DB_get関数をどのようにしたら、Data_Check()で、登録した構造体を取得できるのか教えてください。長くなってすみません。
- ion_2005
- お礼率73% (25/34)
- C・C++・C#
- 回答数3
- ありがとう数3
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
Data_Check()で、aaaの定義をどうしたいのかですね。 構造体へのポインタが欲しいなら、こんな感じですかねぇ。 int CTestApp::Data_Check() { ~ AAA *aaa; db.DB_get(2, (char **)&aaa); ~ } void CData::DB_get(int key, char **buff) { switch(key){ ~ case 2: *buff = sss[i]; break; ~ }
その他の回答 (2)
- tettsu
- ベストアンサー率30% (4/13)
構造体のポインタが欲しい場合は、#2さんのやり方で取れるでしょうが、 このソースには、問題点があります。 まず、 BOOL CTestApp::File_Check(){ AAA aaa; ~ db.DB_regi(2, (char *)&aaa); ~ } で、ローカルに宣言した構造体のポインタをCData::DB_regiに渡してCData内の vector<char *> sss にコピーしていますが、 CTestApp::File_Check() を抜けた時点で、AAA aaaのローカル変数は無くなってしまうので、CDataで保持されているポインタの先のデータは、意味の無いものになってしまいます。 なので、DB_regiは、 void CData::DB_regi(int key, char *buff) { switch(key){ ~ case 2: char* pTmp = malloc(sizeof(AAA));//メモリ確保 memcpy(pTmp, buff, sizeof(AAA)); sss.push_back(pTmp); break; } という具合に、メモリを確保して、構造体をコピーするのが良いと思います。 あとは、CDataのデストラクタで、メモリの開放を忘れないようにすれば良いでしょう。
お礼
回答ありがとうございます。 問題点の指摘&それに対する対処まで頂きありがとうございます。 今までグローバルや、privateのstaticで宣言していました。 今現在問題はないのですが、何かあれば参考にさせていただきます。 ありがとうございました。
- sakusaker7
- ベストアンサー率62% (800/1280)
なぜわざわざ char* にキャストしてやりとりをしているのでしょうか? 素直に AAA* でやり取りするように関数を宣言すればよいような気がするのですが。
お礼
回答ありがとうございます。 確かにそうなんですが、関数が増えてしまうので・・・。
関連するQ&A
- 入れ子の構造体について
例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?
- ベストアンサー
- C・C++・C#
- 動的な構造体配列の初期化
以下のように構造体を new で動的に確保したときに 構造体の中身(char bbb[10], int ccc)をゼロで初期化したいのですが ZeroMemory を使用するとCArrayのAdd()を使用したときにエラーになってしまいました。 何かよい方法がありましたら教えて下さい。お願いいたします。 # 簡単にイメージですが・・・ typedef struct { CString a; CString b; }aaa_t ; struct s_aaa{ char bbb[10]; int ccc; CArray<aaa_t,aaa_t> m_aaaArray ; } s_aaa *StructB; StructB = new s_aaa [10];
- ベストアンサー
- C・C++・C#
- 文字列の構造体キャスト
文字列を構造体にキャストした際に、メンバ変数は以下のようには、 取得できないのでしょうか? typedef struct { int year; /* 学年 */ int clas; /* クラス */ int number; /* 出席番号 */ char name[64]; /* 名前 */ } student; int main(void) { student *data=NULL; char c[] = "123456789012abcdefghijabcdefghijabcdefghijabcdefghijabcdefghijabcdefghij1234"; char* tmp; tmp = &c[0]; student_print(data, tmp); return 0; } void student_print(student *data, char *mkg) { void* buff = NULL; buff = (student*)mkg; printf("[year]:%s\n", buff ->year);←ここ return; }
- 締切済み
- C・C++・C#
- 異なる構造体のデータのコピー
(1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?
- ベストアンサー
- C・C++・C#
- 構造体のアライメント調整
構造体のアライメント調整について教えて下さい。 (1) アライメント調整を行う目的は何ですか? (2) char = 1byte short = 2byte int = 4byteの時、 下の構造体にアライメント調整を行うとすれば、どうすればいいでしょうか? typedef struct{ ____char hoge1 ____char hoge2 ____short hoge3 ____char hoge4 ____int hoge5 ____int hoge6 ____char hoge7 }tHOGEHOGE 下の形になるかなぁと思っているのですが、本当に(1)~(4)まで全部必要でしょうか? typedef struct{ ____char hoge1 ____char hoge2 (1)__char reserve[2] ____short hoge3 (2)__char reserve[2] ____char hoge4 (3)__char reserve[3] ____int hoge5 ____int hoge6 ____char hoge7 (4)__char reserve[3] }tHOGEHOGE つまらない質問で申し訳ありませんが、 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- 構造体についてです。
typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。
- ベストアンサー
- C・C++・C#
- C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
C++言語で、構造体のコピーは可能(しても良い)のでしょうか? 問題がある場合は、なぜだめなのか知りたいです。 構造体は可変長ではありません。 typedef struct kumi { char namae[10]; int ten; }Kumi; Kumi a, b; strcpy(a.namae, "AAA"); a.ten = 50; b = a;
- ベストアンサー
- C・C++・C#
- 構造体メンバ 構造体ポインタ 値代入
typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?
- ベストアンサー
- 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#
お礼
回答ありがとうございます。 まさにこれです! これを求めてました! おかげさまで出来ました。ありがとうございます。