C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: ”out”の使用方法について


(過去ログ 28 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■13007 / inTopicNo.1)  ”out”の使用方法について
  
□投稿者/ K2E (1回)-(2008/01/23(Wed) 14:34:34)

分類:[C#] 

初めましてK2Eと申します。

とあるシステムのライブラリを使用しているのですがC/C++用に

GetDoResults(unsigned int handle, unsigned int * addr, unsigned int maxLen, unsigned int * len);-@

という関数が与えられています。

この関数は「Do() ←引数省略してます 」関数実行後の結果をaddrへ、返ってきたaddrの数をlenで取得するのですが、
例えば、C/C++の場合

------------------------------------------
unsigned int addr[5];
unsigned int len;
int i;
 //Do()を実行する
 GetDoResults(uHandle, addr, 5, &len);

 for(i = 0; i < len; i++)
 {
    printf("addr %d: %d", i, addr[i])
 }
------------------------------------------
のようにGetDoResults実行後len=3が入ってくるような場合、addr[0],addr[1], addr[2]にも値が
入ってきたことを確認できています。

これと同様のことをC#でも行いたいのですが、
このシステムではC#用にもラッパークラスファイル(.csファイル)が用意されているようで@に該当する関数が

GetDoResults(unsigned int handle, out int addr, unsigned int maxLen, unsigned int aLen);-A

と定義されています。

"out int addr"引数に上記@の例のように配列の形で渡して、返ってきた結果一気に取得したいのですが、
引数をどのように宣言し、渡せばよいかわかりません。

配列の形で引数を渡す場合、色々調べてみたのですが「Func(out addr[] int)」のように渡さなくてはならないらしく
Aの関数ではそのようになっていません。

試しに引数を

int addr;

と宣言し”out addr”と渡した場合、当然ながら一つだけ値が入ってきたことを確認しましたが、
ラッパーということなので、@のように”out int addr”に正しい引数をきちんと渡すことで
複数個(lenに入ってくる値分)取得できるはずと考えています。

引数をどのように宣言すればよいか、アドバイスをいただけないでしょうか?
よろしくお願いします。







引用返信 編集キー/
■13011 / inTopicNo.2)  Re[1]: ”out”の使用方法について
□投稿者/ シャノン (266回)-(2008/01/23(Wed) 14:49:08)
No13007 (K2E さん) に返信

> このシステムではC#用にもラッパークラスファイル(.csファイル)が用意されているようで@に該当する関数が
>
> GetDoResults(unsigned int handle, out int addr, unsigned int maxLen, unsigned int aLen);-A
>
> と定義されています。

ラッパーの作り方が悪い。
この宣言ではどうやっても、単一の int しか取得できません。
それに、aLen も取得できないはず。
引用返信 編集キー/
■13016 / inTopicNo.3)  Re[2]: ”out”の使用方法について
□投稿者/ K2E (2回)-(2008/01/23(Wed) 14:58:35)
2008/01/23(Wed) 15:05:05 編集(投稿者)

No13011 (シャノン さん) に返信
シャノンさん
返信ありがとうございます。

>>GetDoResults(unsigned int handle, out int addr, unsigned int maxLen, unsigned int aLen);-A
こちらは僕の記載が間違っていました。

正しくは
GetDoResults(unsigned int handle, out int addr, unsigned int maxLen, out unsigned int aLen);
です。

従って、aLenは一応取れています。

ラッパーの作りが悪いとの事ですが、Aの本来の宣言は
GetDoResults(unsigned int handle, out int[] addr, unsigned int maxLen, out unsigned int aLen);
となるべきでしょうか。


引用返信 編集キー/
■13017 / inTopicNo.4)  Re[3]: ”out”の使用方法について
□投稿者/ Hongliang (226回)-(2008/01/23(Wed) 15:04:18)
int[] array = new int[size];
GetDoResults(handle, out array[0], 5, out len);
わはー。

> ラッパーの作りが悪いとの事ですが、Aの本来の宣言は
> GetDoResults(unsigned int handle, out addr[] int, unsigned int maxLen, out unsigned int aLen);
> となるべきでしょうか。
配列は Array 派生クラスの参照型ですからそのままでポインタになります。
引用返信 編集キー/
■13024 / inTopicNo.5)  Re[4]: ”out”の使用方法について
□投稿者/ K2E (3回)-(2008/01/23(Wed) 15:39:40)
Hongliang さん
返信ありがとうございました。

教えていただいたコードで試したところ無事にデータの取得できました。
初め、なぜ取れるのかわからなかったのですが、Honglingさんの回答と
コードじっくり眺めて考えたところようやく納得できました。
(CとC#での知識の互換ができました。)

ありがとうございました。

解決済み
引用返信 編集キー/
■13033 / inTopicNo.6)  Re[4]: ”out”の使用方法について
□投稿者/ シャノン (268回)-(2008/01/23(Wed) 17:22:08)
No13017 (Hongliang さん) に返信
> int[] array = new int[size];
> GetDoResults(handle, out array[0], 5, out len);
> わはー。

ぐはぁー。まじすかー。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -