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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0520
7909ppr[スタック領域のオーバーフローです。]とゆう表示をなんとかしてください。3解決


7909ppr

リンク

2012/5/20(Sun) 14:48:37|NO.46730

私のプログラムを何度も実行すると、
スタック領域のオーバーフローです

とゆうエラーメッセージダイアログが出てきます。 プログラムは、 *home buffer 100,10,10 picload "nur.bmp" buffer 1,10,10 picload "boka.bmp" buffer 2,10,10 picload "kyara.bmp" *top screen 0,510,510 ccx = 0 ccy = 0 dim map,510,510 ////////////////////////////壁ブロックの作成 repeat pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 if ccx = 500 { break } ccx +10 loop ccy + 10 repeat pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 if ccy = 500 { break } ccy +10 loop ccx - 10 repeat pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 if ccx = 0 { break } ccx - 10 loop ccy - 10 repeat pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 if ccy = 10 { break } ccy - 10 loop ////////////////////////////壁ブロックの作成ここまで ccx = 0 ccy = 0 ////////////////////////////内部壁ブロック作成 repeat if ccy = 480{ break } ccy + 20 repeat if ccx = 480{ break } ccx + 20 pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 loop ccx = 0 loop ;break ////////////////////////////内部壁ブロック作成ここまで ccvvx = 0 ccvvy = 0 ccdf = 0;4つの乱数の発生 randomize;いつもランダム ////////////////////////////迷路の作成 repeat if ccvvy = 480{ break } ccvvy + 20 repeat if ccvvx = 480{ break } ccvvx + 20 *lopa ccdf = rnd(4)+1 //------ if ccdf = 1 { ccx = ccvvx + 10 ccy = ccvvy if map(ccx,ccy){ gosub *lopa } pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 } //------ if ccdf = 2 { ccx = ccvvx ccy = ccvvy + 10 if map(ccx,ccy){ gosub *lopa } pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 } //------ if ccdf = 3 { ccx = ccvvx - 10 ccy = ccvvy if map(ccx,ccy){ gosub *lopa } pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 } //------ if ccdf = 4 { ccx = ccvvx ccy = ccvvy - 10 if map(ccx,ccy){ gosub *lopa } pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 } //------ ;wait 2 loop ccvvx = 0 loop ////////////////////////////迷路の作成ここまで ////////////////////////////キャラ操作 kkx = 10 kky = 10 brkx = 100 pos kkx, kky ;カレントポジション設定 gcopy 2, 0, 0 repeat redraw 0 color 255, 255, 255 ;boxf ;画像コピー stick key, 15 ;キー入力 if key & 1 {;左 kkx = kkx - 10 if map(kkx,kky){ kkx + 10 } else{ pos kkx+10,kky gcopy 100, 0, 0 pos kkx, kky ;カレントポジション設定 gcopy 2, 0, 0 } } if key & 2 { kky = kky - 10 if map(kkx,kky){ kky + 10 } else{ pos kkx,kky+10 gcopy 100, 0, 0 pos kkx, kky ;カレントポジション設定 gcopy 2, 0, 0 } };上 if key & 4 { kkx = kkx + 10 if map(kkx,kky){ kkx - 10 } else{ pos kkx-10,kky gcopy 100, 0, 0 pos kkx, kky ;カレントポジション設定 gcopy 2, 0, 0 ;右 } } if key & 8 { kky = kky + 10 if map(kkx,kky){ kky - 10 } else{ pos kkx,kky-10 gcopy 100, 0, 0 pos kkx, kky ;カレントポジション設定 gcopy 2, 0, 0 ;下 } } if key & 128 : goto *top ;[Esc] redraw 1 wait 5 loop ////////////////////////////キャラ操作ここまで こんな感じのものです。 あと、下のファイルも一緒においてください。 http://be-sp.com/7909pp7/home/kousyoukai/joyful/img/100.bmp http://be-sp.com/7909pp7/home/kousyoukai/joyful/img/101.bmp http://be-sp.com/7909pp7/home/kousyoukai/joyful/img/102.bmp(白紙だが必要) ESCで更新できます。 疑問は更新していくと[スタック領域のオーバーフローです。]のエラー吹きます。 このエラーの解消方法はありますか。



この記事に返信する


7909ppr

リンク

2012/5/20(Sun) 14:51:50|NO.46731

すみません。
投票がおかしくなりました。
http://be-sp.com/7909pp7/home/kousyoukai/joyful/img/103.zip
これの[bb.hsp]ファイルを実行してください。



暇人

リンク

2012/5/20(Sun) 16:23:47|NO.46738

確実に問題あるのは

>gosub *lopa
returnせずにgosubを何度も使用してる(戻るアドレスがどんどん積まれてオーバーしてた)
処理的にはgotoで良いんじゃ?

でもループ内でgotoは気持ち悪いから必要ないように
*lopaからloop前までをループにしてやれば良い

repeat ccdf = rnd(4)+1 //------ if ccdf = 1 { ccx = ccvvx + 10 ccy = ccvvy }else{ //------ if ccdf = 2 { ccx = ccvvx ccy = ccvvy + 10 }else{ //------ if ccdf = 3 { ccx = ccvvx - 10 ccy = ccvvy }else{ //------ if ccdf = 4 { ccx = ccvvx ccy = ccvvy - 10 } } } } if map(ccx,ccy)=0 { pos ccx,ccy gcopy 1,0,0,10,10 map(ccx,ccy) = 5 break } loop //------


もう一つ
> if key & 128 : goto *top ;[Esc]
repeat〜loop間でループの外にgotoしてloopを抜けずに再度repeatしてる(32(?)回繰り返すとエラーが起こる)

gotoしたいなら

if key & 128 : break ;[Esc]
にしてループから抜けてからgotoする



7909ppr

リンク

2012/5/20(Sun) 21:02:20|NO.46772

解決しました!!


*home
randomize;いつもランダム
buffer 100,10,10
picload "nur.bmp"
buffer 1,10,10
picload "boka.bmp"
buffer 2,10,10
picload "kyara.bmp"



*top
screen 0,510,510,0,10,10
ccx = 0
ccy = 0
dim map,510,510

////////////////////////////壁ブロックの作成
repeat


pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5


if ccx = 500 {
break
}
ccx +10

loop


ccy + 10
repeat
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
if ccy = 500 {
break
}
ccy +10

loop


ccx - 10
repeat
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
if ccx = 0 {
break
}
ccx - 10

loop


ccy - 10
repeat
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
if ccy = 10 {
break
}
ccy - 10

loop
////////////////////////////壁ブロックの作成ここまで


ccx = 0
ccy = 0
////////////////////////////内部壁ブロック作成
repeat
if ccy = 480{
break
}
ccy + 20
repeat
if ccx = 480{
break
}
ccx + 20
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5


loop

ccx = 0

loop

;break


////////////////////////////内部壁ブロック作成ここまで

ccvvx = 0
ccvvy = 0
ccdf = 0;4つの乱数の発生

////////////////////////////迷路の作成
repeat
if ccvvy = 480{
break
}
ccvvy + 20

repeat
if ccvvx = 480{
break
}
ccvvx + 20
*lopa
ccdf = rnd(4)+1
//------
if ccdf = 1 {
ccx = ccvvx + 10
ccy = ccvvy
if map(ccx,ccy){
goto *lopa
}
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5

}
//------
if ccdf = 2 {
ccx = ccvvx
ccy = ccvvy + 10
if map(ccx,ccy){
goto *lopa
}
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
}
//------
if ccdf = 3 {
ccx = ccvvx - 10
ccy = ccvvy
if map(ccx,ccy){
goto *lopa
}
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
}
//------
if ccdf = 4 {

ccx = ccvvx
ccy = ccvvy - 10
if map(ccx,ccy){
goto *lopa
}
pos ccx,ccy
gcopy 1,0,0,10,10
map(ccx,ccy) = 5
}
//------
;wait 2
loop
ccvvx = 0

loop
////////////////////////////迷路の作成ここまで





////////////////////////////キャラ操作



////
kyarax = 90
kyaray = 90
kyararnd = 0


kyarabx = 70
kyaraby = 70


cntkyaraa = 0

kyarasuua = 20;キャラ数

dim kyara,100,100;(キャラ数,キャラコード)
;dim kyaray,30,50,70,90,110,130,150,170,190,210,230,250,270,290,310,330,350,370,390,410
;dim kyarax,30,50,70,90,110,130,150,170,190,210,230,250,270,290,310,330,350,370,390,410
repeat kyarasuua

cntkyaraa +1
kyara(cntkyaraa,0) = 1

loop

////

kkx = 10
kky = 10

brkx = 100

pos kkx, kky ;カレントポジション設定
gcopy 2, 0, 0 ,10,10
repeat
redraw 0


color 255, 255, 255
;boxf

;画像コピー
stick key, 15 ;キー入力
if key & 1 {;左
kkx = kkx - 10
if map(kkx,kky){
kkx + 10
}
else{
pos kkx+10,kky
gcopy 100, 0, 0
pos kkx, kky ;カレントポジション設定
gcopy 2, 0, 0 ,10,10
}
}
if key & 2 {
kky = kky - 10
if map(kkx,kky){
kky + 10
}
else{
pos kkx,kky+10
gcopy 100, 0, 0
pos kkx, kky ;カレントポジション設定
gcopy 2, 0, 0 ,10,10
}
};上
if key & 4 {
kkx = kkx + 10
if map(kkx,kky){
kkx - 10
}
else{
pos kkx-10,kky
gcopy 100, 0, 0
pos kkx, kky ;カレントポジション設定
gcopy 2, 0, 0 ,10,10
}
}
if key & 8 {
kky = kky + 10
if map(kkx,kky){
kky - 10
}
else{
pos kkx,kky-10
gcopy 100, 0, 0
pos kkx, kky ;カレントポジション設定
gcopy 2, 0, 0 ,10,10
}
}
if key & 128 : break ;[Esc]

if (kyarax = kkx and kyaray = kky) or (kyarabx = kkx and kyaraby = kky) {
end
}


repeat kyarasuua

kyararnda = rnd(4)+1
//----
if kyararnda = 1 {
kyarax + 10
if map(kyarax,kyaray){
kyarax - 10
}else{
pos kyarax-10,kyaray
gcopy 100, 0, 0
pos kyarax,kyaray
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararnda = 2 {
kyaray + 10
if map(kyarax,kyaray){
kyaray - 10
}else{
pos kyarax,kyaray-10
gcopy 100, 0, 0
pos kyarax,kyaray
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararnda = 3 {
kyarax - 10
if map(kyarax,kyaray){
kyarax + 10
}else{
pos kyarax+10,kyaray
gcopy 100, 0, 0
pos kyarax,kyaray
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararnda = 4 {
kyaray - 10
if map(kyarax,kyaray){
kyaray + 10
}
else{
pos kyarax,kyaray+10
gcopy 100, 0, 0
pos kyarax,kyaray
gcopy 2, 10, 0 ,10,10
}
}
//----
loop











kyararndb = rnd(4)+1
//----
if kyararndb = 1 {
kyarabx + 10
if map(kyarabx,kyaraby){
kyarabx - 10
}else{
pos kyarabx-10,kyaraby
gcopy 100, 0, 0
pos kyarabx,kyaraby
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararndb = 2 {
kyaraby + 10
if map(kyarabx,kyaraby){
kyaraby - 10
}else{
pos kyarabx,kyaraby-10
gcopy 100, 0, 0
pos kyarabx,kyaraby
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararndb = 3 {
kyarabx - 10
if map(kyarabx,kyaraby){
kyarabx + 10
}else{
pos kyarabx+10,kyaraby
gcopy 100, 0, 0
pos kyarabx,kyaraby
gcopy 2, 10, 0 ,10,10
}
}
//----
if kyararndb = 4 {
kyaraby - 10
if map(kyarabx,kyaraby){
kyaraby + 10
}
else{
pos kyarabx,kyaraby+10
gcopy 100, 0, 0
pos kyarabx,kyaraby
gcopy 2, 10, 0 ,10,10
}
}
//----




redraw 1

wait 5
loop
////////////////////////////キャラ操作ここまで


goto *top



少し改造してありますが、気にしないでください。
修復後はこんな感じのコードになりました。



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