HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0526
Sadoエイリアスを利用して、メモリ再確保したい (sdim?,memexpand?)3解決


Sado

リンク

2016/5/26(Thu) 19:18:40|NO.75596

モジュール空間内の命令or関数ルーチンの中で、
引数にvar エイリアスを使用しているとします。

命令実行時に渡された変数を、任意のサイズで再確保したいのですが、
(Size>0の整数)
memexpand エイリアス,Size はエラーを吐き、
sdim エイリアス,Size は0byteになる?始末。

僕のプログラムのバグなのか、エイリアスを利用したメモリ操作に正規の手順があるのか、
どなたかご説明お願いします……!!



この記事に返信する


Velgail

リンク

2016/5/26(Thu) 20:35:19|NO.75597

memexpandでエラーを吐く理由は
p1で指定される変数は、 文字列型(str)のように動的にメモリ確保量を変更することが可能な型である必要があります。

に抵触するからかなと推測しました。 なので、vartypeで変数型を見てから、配列を作りなおすように書いてみました。 「メモリ退避はしていない」ので、文字列以外では配列内データは消しますし、1次元配列しか想定していませんので。 //arrayじゃなくてvarでも動くけど……どっちのほうが正しいんだろうね?
#module
#deffunc reallocate array a,int size
	switch vartype(a)
	case 2
		memexpand a,size
		swbreak
	case 3
		ddim a,size
		swbreak
	case 4
		dim a,size
		swbreak
	swend
	return
#global
a=0
b=0.0
c=""
reallocate a,10
reallocate b,10
reallocate c,1024



Sado

リンク

2016/5/26(Thu) 21:50:04|NO.75603

あ、memexpendのエラーは自己解決しました。
対象の変数が整数型になっていました。



バイナリ操作をしたいのですが、どうにもこうにも……

memexpand エイリアス,strlen(b_data) ;sdim エイリアス,strlen(b_data) mes strlen(b_data);debug memcpy エイリアス,b_data,strlen(b_data)
これの実行結果がmemcpyの行でのバッファオーバーフローで、これを修正したいと思います。
b_dataの中身はバイナリデータでゴチャゴチャイジっていますがNullには気をつけています。
;debugの表示結果は0より大きい整数値です(125とか)。



Sado

リンク

2016/5/27(Fri) 00:22:24|NO.75613

ごめんなさい!
スレの質問内容は、僕の直面しているバグとは全く関係ありませんでした。
以下はまあ、参考程度に

#module #deffunc test var p1 sdim text,10 text="0123456789" p1="" memexpand p1,strlen(text) memcpy p1,text,strlen(text) return #global saramanda="golem" test saramanda mes saramanda



ONION software Copyright 1997-2023(c) All rights reserved.