• ベストアンサー

データの取得をしたいのですが…

簡単にプログラムを書きます。 A.cpp ファイルの記述 //テーブルの作成 typedf strct _TABLE { char *psAData; char *psBData; } TABLE, *PTABLE TABLE A [2] = { {"+1", "2"}, {"-1", "5"} }; //b.cppファイルから読み出される関数 void GetData(int nRow, char *psA, char *psB) { PTABLE pTable; ptable = A; *psA = *pTable[nRow].psAData; *psB = *pTable[nRow].psBData; } b.cpp ファイルの記述 void __fastcall TForm::FormCreat(TObject *Sender) { char sA; char sB; AnsiString asData; for(int nRow = 0; nRow < 2; nRow++) { //a.cppファイルのAテーブルの //一行目の二つのデータを取得させたい GetData(nRow, &sa, &sB); //取得したデータを他のコンポーネントに格納 asData.sprintf("%s Aデータ", sA); Edit1->Text = asData; asData.sprintf("%s Bデータ", sB); Edit2->Text = asData; } } 上記のような感じの(本当はもっとテーブルの数などおおいのですが)プログラムでb.cppファイルからa.cppファイルのテーブルのデータを取りたいと思っています。 ソースを見て、なんとなくしたいことを分っていただけると良いのですが…。 回りくどいようですが、テーブルのデータを他のプロジェクトからも取得したりしたいのでb.cppファイルに直接テーブルを書く、などの方法ではなく、このようにデータを取りたいと思っています。 プログラムを実行するとエラーが出てデータの取得が出来ずに困っています。 どこを直したら良いかご指導よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • 405
  • ベストアンサー率50% (17/34)
回答No.3

ざっと見た限りで自身はありませんが、どうもポインターの使い方に誤りがありそうです。 void GetData(int nRow, char *psA, char *psB) の宣言を void GetData(int nRow, char **psA, char **psB) に変更 *psA = *pTable[nRow].psAData; *psB = *pTable[nRow].psBData; を *psA = pTable[nRow].psAData; *psB = pTable[nRow].psBData; に変更 void __fastcall TForm::FormCreat(TObject *Sender)の中の char sA; char sB; を char *sA; char *sB; に変更 これで試して見て下さい。

Caya
質問者

お礼

アドバイスありがとうございます! さっそく参考にさせていただいて修正して実行し、 思うようにデータの取得ができました! ポインタを謝った使い方をしていたのですね^^; ざっとご覧になられただけでしっかりと修正が出来てしまわれるなんて凄いですね!私もしっかり勉強していかなくては!と思いました!

その他の回答 (2)

noname#15691
noname#15691
回答No.2

//テーブルの作成 typedef struct _TABLE { char *psAData; char *psBData; } TABLE, *PTABLE; TABLE A [2] = { {"+1", "2"}, {"-1", "5"} }; //b.cppファイルから読み出される関数 void GetData(int nRow, AnsiString *psA, AnsiString *psB) { PTABLE pTable; pTable = A; *psA = pTable[nRow].psAData; *psB = pTable[nRow].psBData; } b.cpp ファイルの記述 void __fastcall TForm::FormCreat(TObject *Sender) { AnsiString sA; AnsiString sB; AnsiString asData; for(int nRow = 0; nRow < 2; nRow++) { //a.cppファイルのAテーブルの //一行目の二つのデータを取得させたい GetData(nRow, &sA, &sB); //取得したデータを他のコンポーネントに格納 asData.sprintf("%s Aデータ", sA); Edit1->Text = asData; asData.sprintf("%s Bデータ", sB); Edit2->Text = asData; } }

Caya
質問者

お礼

回答ありがとうございます! AnsiString型でデータをとるのですね! 参考になりました! テーブルがcharなので、charでとるものだとばかり思っていました^^;

回答No.1

構造体の定義をヘッダファイルに追い出して、(A.h) 実体はそのままA.cppファイルに残して、 A.cpp B.cpp双方で、A.hを#includeしてください。

Caya
質問者

お礼

回答ありがとうございます。 参考にさせていただいて、作ってみたのですが、やはり同じエラーが出てしまいます。 エラーはAccess violation at address 3266729D in module "CC3260MT.DLL" Read of address 0000002D というものなのですが…

関連するQ&A

専門家に質問してみよう