ピンです。
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側で何か手落ちがあるんでしょうか?
お願いします。
Cのshortは、16bitの型ですよね。
DelphiのIntegerは、32bitの型です。
この場合、SmallIntを使用します。SmallIntは、16bitの型です。
Integerって、そもそもそういうところでは使えないんじゃないですか?
ヘルプの整数型の説明のページにありますけど、
Integer型とCardinal型は4バイトとは限らないようです。
TPoint型なども、IntegerではなくLongIntになってますよね。
今回の場合はにしのさんの言うとおりSmallIntだと思いますけど、
今後のためにも。
4バイトに限らないと言う記述はどのあたりにありますか?
処理系が変わると、バイト数やエンディアンが変わることがありますが、ヘルプの整数型には、Integerが符号付き 32 ビット、Cardinalが符号なし 32 ビットと書いてあり、保証されているように読めます。
単に、最適化対象がInteger,Cardinalというだけではないですか?
にしのさん、たかみちえさん 早速のレスありがとうございました。
引数の型をSmallIntに変えたらうまくいきました。
基本的なところでちゃんと調べていませんでした。
ありがとうございました。
> 4バイトに限らないと言う記述はどのあたりにありますか?
ん、ObjectPascal言語ファイル>整数型のページに、
"CPU とオペレーティングシステムにとって最適な処理効率が得られるため,通常はできるだけ汎用整数型を使うようにします。"
とあります。
これは、"時と場合に応じて、不要なバイトを切り捨てて処理する"という意味だと解釈しました。
実際に試したわけでは(試しようがない?)ないので、
はっきりとはいえませんけど。
でも、よくよく読み返してみると、にしのさんのいうとおりにも見えますね…。
わたしはあくまで、"最大で32bit整数"だと思っていました。
それに、APIでつかわれることになるTPointでは、LongIntしか使ってません。
なので、これであってるのかなと思ったんですけど…。
(でも、今見たら、TRectでIntegerつかってますね(-_-;))
ツイート | ![]() |