- ベストアンサー
構造体 アドレス
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()で、登録した構造体を取得できるのか教えてください。長くなってすみません。
- みんなの回答 (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* でやり取りするように関数を宣言すればよいような気がするのですが。
お礼
回答ありがとうございます。 確かにそうなんですが、関数が増えてしまうので・・・。
お礼
回答ありがとうございます。 まさにこれです! これを求めてました! おかげさまで出来ました。ありがとうございます。