構造体の転送 – プログラミング – Home

通知
すべてクリア

[解決済] 構造体の転送


gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

いつもお世話になっています。ggです。

Aクラスに作った配列構造体をDLLのある関数に転送したいのですが、
どうしたらいいかわかりません。
CStructCls_Polyクラス側に
CStructCls_Poly.h
構造体定義
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyData2;
PolyData2 *mp_PolySct2;

CStructCls_Poly.cpp
 mp_PolySct2 = new PolyData2[50];
 int a=1;
 DrawPolygonDLL_AddTest(a, mp_PolySct2); //Dll側の関数
 ここで、mp_PolySct2はDll側の関数へ渡しよう配列です。

DLL側:
Bdll.h
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataDLL;
Bdll.cpp
BOOL WINAPI DrawPolygonDLL_AddTest(int a, PolyDataDLL *Poly)
{
int Bcode=(Poly+ j)->Bcode;
...
return TRUE;
}

コンパイルのエラーメッセージ:
error C2664: 'DrawPolygonDLL_AddTest' : 3 番目の引数
を 'CStructCls_Poly::PolyData2 *' から 'PolyData2 *' に変換できません。 (新しい
機能 ; ヘルプを参照)

よろしくお願いします。

環境:.Net MFC使用 WinXP


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

CStructCls_Poly.hの中でPolyData2を定義するのではなく,
Bdll.hのPolyData2を使ってください。

クラス内で定義した構造体と,クラス外で定義した構造体は,
同じ名前のように見えてもまったく異なる別の名前を持った構造体になります。


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

YuOさん、
ご返事ありがとう。

>CStructCls_Poly.hの中でPolyData2を定義するのではなく,
>Bdll.hのPolyData2を使ってください。

次のように変更しました。
DLL側:
Bdll.h
typedef struct {
char DiagramName[6]; // Vector 図式名称
int Bcode; //Bcode
int Type; //type
int ID; //番号順
} PolyDataGF2;      //区別するために名前を変えた
PolyDataGF2 *mp_PolySctGF2; //追加

Bdll.cpp
BOOL WINAPI DrawPolygonDLL_AddTest(int a, PolyDataGF2 *Poly)
{
int Bcode=(Poly+ j)->Bcode;
...
return TRUE;
}

CStructCls_Polyクラス側に
CStructCls_Poly.h
private:
 PolyDataGF2 *mp_PolySctGF2;

CStructCls_Poly.cpp
int a=1;
mp_PolySctGF2 = new PolyDataGF2[5];
DrawPolygonDLL_AddTest(a, mp_PolySctGF2);

コンパイルのエラーメッセージ:
error LNK2005: struct PolyDataGF2 * mp_PolySctGF2 (?
mp_PolySctGF2@@3PAUPolyDataGF2@@A) は既に AutoTraceSample.obj で定義されていま
す。

調べたのですが
AutoTraceSample.cppにstruct PolyDataGF2 * mp_PolySctGF2定義いていなかったので
す。(構造体の名前を変えても同じエラーが出ます)

よろしくお願いします。


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 22年前
投稿: 320
 

> PolyDataGF2 *mp_PolySctGF2; //追加

なぜ,変数の追加を行っているのですか?
どうも,C++の基礎部分で躓いている感じを受けます。

DLLのヘッダファイルは,DLLを利用する上で必要な宣言/定義のみをしてください。
使う側は,そのヘッダファイルを取り込み,引数の型を合わせて呼び出す事になります。


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

YuOさん、
ご返事ありがとう。

>なぜ,変数の追加を行っているのですか?
>どうも,C++の基礎部分で躓いている感じを受けます。

PolyDataGF2 *mp_PolySctGF2; //追加
は動的に配列構造体です。

CStructCls_Poly.cpp
int a=1;
mp_PolySctGF2 = new PolyDataGF2[5];
に配列の長さを決定しています。
ここで5の数字ですが、簡単に説明するため、5を入れています。
実際はここでの数字が不定です。

通常に、同じクラスに上記のやり方で正常に動いていますが、
(動的に配列構造体 mp_PolySctGF2 = new PolyDataGF2[5];)
DLLにすると、上記のエラーが出ました。

問題は多分この mp_PolySctGF2 =new PolyDataGF2[5];
部分ですが、解決する方法がわかりません。

よろしくお願いします。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

意味がわからないかもしれませんが、とりあえず、
DLL側のヘッダ(Bdll.h)にある変数のインスタンス

PolyDataGF2 *mp_PolySctGF2; //追加

をソース(Bdll.cpp)に移動させてみてください。

もっとも、この様子だと他にもわんさかとありそうですが・・・(vv;)。


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

仲澤@失業者さん
ご返事ありがとう。

>をソース(Bdll.cpp)に移動させてみてください。

CStructCls_Poly.cpp

BOOL CStructCls_Poly::OpenNumberPoly_PolyStruct(…)
{
PolyDataGF2 *mp_PolySctGF2;
mp_PolySctGF2 = new PolyDataGF2[5];
for(int j=0; j<5; j++){
mp_PolySctGF2[j].Bcode=j;
mp_PolySctGF2[j].Laye=9;
strcpy(mp_PolySctGF2[j].DiagramName, gggg);
}
  DrawPolygonDLL_AddTest(a, mp_PolySctGF2);

問題がなく動きました。ありがとうございました。

でも、今回の最終目的としては
一回取り込んだデータはDLL側において、
DLLの別の表示関数を呼びますと
例:DrawPolygonDLL_DrawPloy(pDC); //Dll側の表示用

Dll側
BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC)
{
 for(int j=0; j<5; j++){
  TRACE(Bcode=%d Laye=%d x=%s\n, mp_PolySctGF2->Bcode,
                   mp_PolySctGF2->Laye ,
                  mp_PolySctGF2->DiagramName);
 }
return TRUE;
}

取り込んだデータ(構造体mp_PolySctGF2)は
CStructCls_Polyクラスを破棄するまで保有してほしいです。
今の宣言の場所は保有できないですね。

どうしたらいいでしょうか。
よろしくお願いします。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

>DLL側:
>Bdll.h
> typedef struct {
> char DiagramName[6]; // Vector 図式名称
> int Bcode; //Bcode
> int Type; //type
> int ID; //番号順
> } PolyDataGF2;      //区別するために名前を変えた
>PolyDataGF2 *mp_PolySctGF2; //追加
↑この「*mp_PlySctGF2」は、どこで使う予定で追加したのでしょうか?

>CStructCls_Poly.cpp
> int a=1;
> mp_PolySctGF2 = new PolyDataGF2[5];
ここで使ってる*mp_PlySctGF2」は

>CStructCls_Poly.h
>private:
> PolyDataGF2 *mp_PolySctGF2;
ここで宣言してるものを使っているはず。

必要が無い限り、同名の変数・関数は使わないほうが安全です


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

>Dll側
>BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC)

BOOL WINAPI DrawPolygonDLL_DrawPloy(CDC* pDC,PolyDataGF2 *mp_PolySctGF2)
こういう風に変更する。

アプリケーションから呼び出すとき
  DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);
とすればいいと思いますが..........
これならば、保有しているはずです。

  


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

皆さん言っていますが、
構造体 PolyDataGF2インスタンスが多すぎではないでしょうか。

>CStructCls_Poly.h
>private:
> PolyDataGF2 *mp_PolySctGF2;
これだけ残して他は削除してしまっていいのでは?
あと、配列にしたければ、
 PolyDataGF2 mp_PolySctGF2[?];
でいいはずですよね。

別にポインター扱いにしなくてもいいと思いますが。。。。。。。
先ほどの
  DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);

  DrawPolygonDLL_DrawPloy(pDC,&PolyDataGF2);
すればいいはずです。


返信引用
rin
 rin
(@rin)
ゲスト
結合: 18年前
投稿: 112
 

>gg 2008/05/14(水) 10:51:56
に書かれたソースから
Bdll.h内にある、
「PolyDataGF2 *mp_PolySctGF2; //追加」
これを削るだけで問題ないと思う
出ているエラーもこれが原因だし

AutoTraceSample.cppについてはDLLの問題とは関係ないので保留


返信引用
gg
 gg
(@gg)
ゲスト
結合: 18年前
投稿: 185
Topic starter  

rinさん、ITOさん
ご返事ありがとう。

>アプリケーションから呼び出すとき
>  DrawPolygonDLL_DrawPloy(pDC,PolyDataGF2);
>とすればいいと思いますが..........
>これならば、保有しているはずです。

>Bdll.h内にある、
>「PolyDataGF2 *mp_PolySctGF2; //追加」
>これを削るだけで問題ないと思う
>出ているエラーもこれが原因だし

>AutoTraceSample.cppについてはDLLの問題とは関係ないので保留

直しました、うまくできました。
結論:
1.PolyDataGF2 *mp_PolySctGF2;の置く場所は一つしかない。
ソースクラスの方です。

2.エラーということは、dllと
ソース部分の関数(DrawPolygonDLL_AddTest(a, mp_PolySctGF2))
はどこに間違っています。

回答をいただいて皆さんありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました