DLLに配列のポインタを渡すには

解決


ピン  2003-03-11 18:36:57  No: 3125

ピンです。

C++で作成した、配列に値を格納する関数があります。

_declspec(dllexport) short _stdcall Kakunou(short n, short *a)
{
short i;
short sigma;

sigma = 0;
for(i=0;i<n;i++){
a[i]=i;
sigma +=a[i];
}
return (sigma);
}

それをDelphiから使かおうと思い、
function Kakunou(n:Integer;var a:Integer):Integer;stdcall;external Hoge.dll';

procedure TForm1.Button1Click(Sender: TObject);
var
  i,ret:Integer;
  Arr:array [0..10] of Integer;

begin
ret:= Kakunou(10,Arr[0]);
for i:=0 to 10 do
  Listbox1.Items.Add(IntToStr(Arr[i]));
end;

としても、配列内に値が入りません。
DLL側はこちらのほうで変更はできません。
Delphi側で何か手落ちがあるんでしょうか?
お願いします。


にしの  2003-03-11 18:58:29  No: 3126

Cのshortは、16bitの型ですよね。
DelphiのIntegerは、32bitの型です。

この場合、SmallIntを使用します。SmallIntは、16bitの型です。


たかみちえ  URL  2003-03-11 19:37:56  No: 3127

Integerって、そもそもそういうところでは使えないんじゃないですか?
ヘルプの整数型の説明のページにありますけど、
Integer型とCardinal型は4バイトとは限らないようです。
TPoint型なども、IntegerではなくLongIntになってますよね。
  今回の場合はにしのさんの言うとおりSmallIntだと思いますけど、
今後のためにも。


にしの  2003-03-11 19:45:08  No: 3128

4バイトに限らないと言う記述はどのあたりにありますか?
処理系が変わると、バイト数やエンディアンが変わることがありますが、ヘルプの整数型には、Integerが符号付き 32 ビット、Cardinalが符号なし 32 ビットと書いてあり、保証されているように読めます。
単に、最適化対象がInteger,Cardinalというだけではないですか?


ピン  2003-03-11 19:51:17  No: 3129

にしのさん、たかみちえさん 早速のレスありがとうございました。

引数の型をSmallIntに変えたらうまくいきました。
基本的なところでちゃんと調べていませんでした。

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


たかみちえ  URL  2003-03-12 08:37:34  No: 3130

> 4バイトに限らないと言う記述はどのあたりにありますか?
  ん、ObjectPascal言語ファイル>整数型のページに、
"CPU とオペレーティングシステムにとって最適な処理効率が得られるため,通常はできるだけ汎用整数型を使うようにします。"
  とあります。

  これは、"時と場合に応じて、不要なバイトを切り捨てて処理する"という意味だと解釈しました。
  実際に試したわけでは(試しようがない?)ないので、
はっきりとはいえませんけど。

  でも、よくよく読み返してみると、にしのさんのいうとおりにも見えますね…。

  わたしはあくまで、"最大で32bit整数"だと思っていました。
  それに、APIでつかわれることになるTPointでは、LongIntしか使ってません。
なので、これであってるのかなと思ったんですけど…。
(でも、今見たら、TRectでIntegerつかってますね(-_-;))


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加