HSP 3.5 beta 2にて64ビットのランタイムを使用する場合、ポインタはどのように処理すればいいのでしょうか。
HSPでは64ビット整数は扱えないためかAPIの返し値でポインタが64ビットから32ビットにキャストさせられ桁落ちでポインタが正しい位置を指さなくなってしまい、アクセス時にエラーが出てしまいます。
double型や配列で代用しようかと思いましたがそもそもAPIが32ビット整数でしか返してくれませんでした。
そこでAPIで64ビット整数を受け取りそれをdupptrに渡す方法を教えてください。
メモリをGlobalAllocで確保して開放するスクリプト(問題の発生する一例)
#include "hsp3_64.as" #define GPTR $40//0で初期化された固定メモリ #uselib "kernel32.dll" #cfunc GlobalAlloc "GlobalAlloc" int,int #func GlobalFree "GlobalFree" int p=GlobalAlloc(GPTR,4) if p==0: dialog "メモリ確保に失敗" : end dupptr a,p,4 a=5 mes a GlobalFree p
問題を発生させる(たぶん)最小限のコード(varptrの64ビット変数への非対応による)
#include "hsp3_64.as" a=5 dupptr b,varptr(a),4//ここで桁落ち(dup b,aでは問題ない) mes b//ここで「動作を停止しました」が発生する
また構造体で64ビット単位で処理して計算速度をあげるために入れられる詰め物はHSPではどのような扱いになりますか。
下のスクリプトではHSPでは詰め物は使わないようにされているようにわたしはみえます。
RECT構造体を使用するスクリプト
#include "hsp3_64.as" #define SPI_GETWORKAREA $30 #uselib "user32.dll" #func SystemParametersInfo "SystemParametersInfoA" int,int,var,int dim rect,4 SystemParametersInfo SPI_GETWORKAREA,0,rect,0 tate=rect.3-rect.1 yoko=rect.2-rect.0 mes "タスクバーを除いたデスクトップの広さ" mes "横="+yoko+"\n縦="+tate memset rect,,16 mes "\n配列に詰め物はないことを確認するためRECT構造体代わりの配列を0で初期化\n" foreach rect mes "rect."+cnt+"="+rect.cnt loop