MFC CArrayを引数にする(2)

[戻る]
CC 2009/05/25(月) 16:54:10
いつも、お世話になっています。CCです。

***.h

CArray<CPoint, CPoint> Edit_New_Line;

Edit_New_Lineは以下の関数の引数として渡すことができるのでしょうか

***.cpp
DrawEditAdd_aaa(int Type, ???)
{
    ???    //      
    ???    //
}

???=>どう書けばいいでしょうか

もう一つの問題、

Edit_New_LineはDLL側に渡すの場合はどうでしょうか。
*.dll
BOOL WINAPI DrawPoaaa(int Type, ???)
{
    ???    //      
    ???    //
}

環境:.Net2002 MFC使用
よろしくお願いします。

Blue 2009/05/25(月) 16:59:51
参照渡しかポインタ渡しで出来ると回答貰っているから応用できないかなぁ?

DrawEditAdd_aaa(int Type, Edit_New_Line& hoge)
{
     // 用途によるのでわからん。Atメソッドかoperator[]を使っとけば。
}

>Edit_New_LineはDLL側に渡すの場合はどうでしょうか。
DLL側とは?
MFCのDLL?

仲澤@失業者 2009/05/25(月) 17:48:47
前の質問
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200905/09050012.txt
でBlueさんの回答に対して

>>typedef CArray<Select_Info, Select_Info> Select_Info_List;
>なるほど、分かりやすく簡潔になりますね。

と答えているのに、理解もしていないし、実際に試してみてもいない
のが、バレてしまいましたね(^^)。

typedef したのだから、以後Select_Info_Listが独立した型として振舞えるので
そのまま使うの普通です。例えば引数にするなら

typedef CArray< CPoint, CPoint> POINT_Ary;
void Boo()
{
   POINT_Ary   Edit_New_Line;
   foo( &Edit_New_Line)
   woo( Edit_New_Line)
}

void Foo( Select_Info_List * ex_List)
{
}

void Woo( Select_Info_List & ex_List)
{
}

CC 2009/05/26(火) 11:28:45
Blueさん、仲澤@失業者さん
ご回答ありがとう。

>DLL側とは?
>MFCのDLL?
MFCのDLLです。

>と答えているのに、理解もしていないし、実際に試してみてもいない
>のが、バレてしまいましたね(^^)。
すみません、十分に理解していないです。
typedefで宣言すると、新に型として使えるようになります。 

typedef CArray< CPoint, CPoint> POINT_Ary;
void Boo()
{
   POINT_Ary   Edit_New_Line;
   foo( &Edit_New_Line)
   woo( Edit_New_Line)
}

void Foo( POINT_Ary* ex_List)
{
CPoint pt;
 pt= ex_List[0]; //error
//error C2679: 二項演算子 '=' : 型 'C**:: POINT_Ary' 
//の右オペランドを扱う演算子が見つかりません (または変換できません)。
どう対処するかわかりません。
}

void Woo( POINT_Ary& ex_List)
{
 ???
}

よろしくお願いします。

CC 2009/05/26(火) 11:48:45
> pt= ex_List[0]; //error
>//error C2679: 二項演算子 '=' : 型 'C**:: POINT_Ary' 
>//の右オペランドを扱う演算子が見つかりません (または変換できません)。
>どう対処するかわかりません。

pt=ex_List->GetAt(0);で解決しました。

CC 2009/05/26(火) 14:04:01
追加の質問
問1
pt=ex_List->GetAt(0);
と
pt= Edit_New_Line[0];
は同等で使いますが、どう理解すればいいでしょうか。


問2
MFCのDLL使用。
dll側
BOOL WINAPI DLL_ArrayLine(int Type,
             POINT_Ary*    ex_List,
              POINT_Ary&    ex_List2)
{
  ...
  return FALSE;
}

exe側
DLL_ArrayLine( Type, &Edit_New_Line, Edit_New_Line);

エラーがあります。
dll側に
typedef CArray< CPoint, CPoint> POINT_Ary;定義していないです。

どう対処すればいいでしょうか。

よろしくお願いします。

CC 2009/05/26(火) 14:43:51
問2続く
dll側
dll.h
typedef CArray<CPoint, CPoint> POINT_Ary; //dll側に宣言
POINT_Ary Edit_New_Line;

dll.cpp
BOOL WINAPI DLL_ArrayLine(int Type,
             POINT_Ary*    ex_List,
                  POINT_Ary&    ex_List2)
{
  ...
  return FALSE;
}

exe側
C*.h
POINT_Ary   mEditNewLine;

C*.cpp
DLL_ArrayLine( Type, &mEditNewLine, mEditNewLine);

エラーがあります。


よろしくおねがいします。

wclrp ( 'o') 2009/05/26(火) 21:49:58
以下蛇足
DLLにMFCのクラスを渡すあるいは受け取るならEXEとDLLで同じバージョンデバッグ版とか
の同じにする。
あとMFCのDLL版にするのがいいかな。DLL内でメモリ確保してEXEでメモリ解放とか考える
と同じメモリ管理のnew/deleteが呼ばれないとまずい。

話をもどす。

>追加の質問
>問1
>pt=ex_List->GetAt(0);
>と
>pt= Edit_New_Line[0];
>は同等で使いますが、どう理解すればいいでしょうか。

ただ単にポインタを知らないだけのような気がする。

以下の説明を見れば
CArray::GetAt
CArray::operator [ ]
同じ用途に使えるということがわかるはず。

ex_Listはポインタなので
ポインタが指しているオブジェクトにアクセスするには*ex_Listと書く。
*ex_List.GetAt(0);では、*(ex_List.GetAt(0))なので期待するものではない。
(*ex_List).GetAt(0);で、
ポインタが指しているオブジェクトのGetAt(0)という意味になる。
それは面倒なのでex_List->GetAt(0);と書くと(*ex_List).GetAt(0);と同じ意味になる。

それだけのこと。

ex_List->[0]:みたいに書けそうな気もするが
たしかエラーになるんだよな。
いてれーたとか使うとめんどくせーなって時々思う。

wclrp ( 'o') 2009/05/26(火) 21:56:08
問2の方は判らん。
どんなエラーなんだよ。
コンパイルエラーなら何か忘れているか間違っているんでしょ。
リンクエラーならDLLを作り方や使い方に問題あるんだろうな。
リンクし忘れ、エクスポートし忘れ、インポートし忘れ、スペルミスとかかな。
実行時ならDLLをEXEと同じ場所へDLLをビルドするたびに毎回コピーする。

CC 2009/05/27(水) 10:55:45
wclrp ( 'o') さん、
ご回答ありがとう。

>ただ単にポインタを知らないだけのような気がする。
はい、少しずつわかってきました。
頑張ります。
ご説明いただき、ありがとう。

>問2の方は判らん。
>どんなエラーなんだよ。
説明が不足です、すみませんでした。

MFCのDLL版を使っています。(問題がなし)

DLL側にコンパイルがOKです。

Exe側にコンパイルはエラーがでます。
エラーメッセージ:
error LNK2005: mEditNewLineは既に ***.obj で定義されています。
fatal error LNK1169: 1 つ以上の複数回定義されているシンボルが見つかりました。

問題は多分ここですが(推測)
exe側
C*.h
POINT_Ary   mEditNewLine; //ここです

Exe側に定義が間違っています。

どうすればいいでしょうか。

よろしくお願いします。

PATIO 2009/05/28(木) 14:38:03
ども、PATIOです。

ヘッダーファイル上でグローバル変数を宣言してしまうと
ヘッダーファイルがインクルードされる度に変数が作成されてしまいませんか?
その事でエラーが出ているのだと思いますけれど。

古いスレッドには追加発言できません。