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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0810
風の谷のウマシカrepeatとwhileのネストについて13解決


風の谷のウマシカ

リンク

2006/8/10(Thu) 16:24:43|NO.1925

皆さん、いつもご教授戴き有難うございます。
while〜wendを、配列の各変数に対してrepeatしたいのですが、
下記の様にすると、何故かrepeatが上手くいかず、
「配列(0)」しか処理できません。どなたか、間違いを診て戴けないでしょうか?
構文はあってると思うんですが・・・。


;「書き方がバラバラなテキストが有って、ここから余分なスペースを全て取りたい」 ;というのが、ソリューションの目的です。 sdim FlootList FlootList(0)="りんご 3 個" ;1行目 FlootList(1)=" み か ん 2 個" ;2行目 FlootList(2)="いちご 10 個" ;3行目 FlootList(3)="ぶどう 2 個" ;4行目 FlootList(4)="なし 1 個 " ;5行目 ;一行ずつ配列変数のまま、処理する事にしました。全部ひとつのnotesel変数に入れて ;一気に処理しても良いのですが、長い文字列を処理しようとすると、技術が付いて行かないので。汗 tmp=0 repeat 5 Letters=FlootList(tmp) ;ここからスペースの削除開始 while CheckPosition!-1 CheckPosition=instr(Letters,0," ") Letters=strmid(Letters,0,CheckPosition)+strmid(Letters,CheckPosition+1,200) wend ;ここでスペースの削除終わり。見ての通り、いちいち文字列の先頭から検索をやり直してます。 ;もう少しスマートなやり方は勉強中。このやり方で長文を処理しようとすると固まる! ;なので、1行ずつ配列に入れたまま小分けにして処理しようとしています。 FlootList(tmp)=Letters ;次のFlootListの処理へ tmp++ loop ;結果出力 tmp=0 repeat 5 mes FlootList(tmp) tmp++ loop

PS

そもそもスペースの削除がヘタクソなのもいけないんですが・・。
これは文字列の検索・置換の勉強も必要でしょうね。Webで検索できる関連のサンプルコードは
ちょっと応用が入っている上、たいていHSP3では使えないobjsendとかを使ってあるので、
カンタンには理解できなくて・・。ちよっと後回し。

目下の敵は、「大量に連続しているスペース」だけですが、色々な事を一度に質問すると、
分かんなくなるので、できるだけ問題を分解して、質問しようと思っています。
とりあえず、上の例で一番問題なのは、repeatとwhileのネストが上手く行ってない事だろうと
自分では判断しているのですが・・・。もしかしたら、他にも勘違いがあるかも・・。



この記事に返信する


トホホッティー

リンク

2006/8/10(Thu) 16:51:39|NO.1927

こんにちは、トホホッティーです。

CheckPosition=0をwhileの前につければできるようです。

確認してみてください。



kz3

リンク

2006/8/10(Thu) 16:54:01|NO.1928

>「配列(0)」しか処理できません。どなたか、間違いを診て戴けないでしょうか?
間違いを見てもらう前に『何故そうなるのか』という予想を立てましょう。

どこまで動いていて、どこから動いていないのか、という絞込みをします。
( デバッグの仕方=>http://quasiquote.org/hspwiki/%a5%c7%a5%d0%a5%c3%a5%b0%a4%ce%bb%c5%ca%fd )

配列の先頭要素の文字列は処理できているのですから、

while CheckPosition!-1 CheckPosition=instr(Letters,0," ") Letters=strmid(Letters,0,CheckPosition)+strmid(Letters,CheckPosition+1,200) wend
は意図したとおり動いているということになります。
配列の先頭要素以外が処理できないということは、このループが2回目以降意図したとおりに動いていない、ということです。
( 書いた通りに動いているのです。 )

ではこのループを制御しているのは何ですか?そこに注目すれば原因が分かるハズです。

# まぁいいや...。



風の谷のウマシカ

リンク

2006/8/10(Thu) 17:29:48|NO.1929

ありがとうございます。      あ、わかりません。

「while CheckPosition!-1」と「CheckPosition=instr(Letters,0," ")」を引っくり返すと
固まりました。(_□_:)


>次の日スッキリした頭で再びデバッグに取り掛かりましょう
ですか(T_T)



トホホッティー

リンク

2006/8/10(Thu) 17:39:25|NO.1930

CheckPosition=instr(Letters,0," ")は移動しなくていいです。

whileの前にCheckPosition=0とやってみてください。

1つをチェック後、そのままwhileに入るとCheckPositionがその直前の値のためwhileが誤動作してしまいます。

最初の書き込みしたのは間違いなので削除しときました。



風の谷のウマシカ

リンク

2006/8/10(Thu) 17:55:55|NO.1931

有難うございました。なるほど、直りました。

>1つをチェック後、そのままwhileに入るとCheckPositionがその直前の値のためwhileが誤動作してしまいます。

この辺がよくわからないのですが、
>whileの前にCheckPosition=0とやってみてください。
のところを
whileの前にCheckPosition=100
とやっても、ちゃんと動きますね。ここはでたらめな値で良いみたいですね。

CheckPositionの値は、whileの後でinstr(・・・によって、再定義される事には
変わりないと思うのですが・・・。
whileって、こう言うものだと、思っとくしかないのでしょうか・・。「誤動作」ですか?



風の谷のウマシカ

リンク

2006/8/10(Thu) 18:12:33|NO.1932

あー、わかりました。

CheckPositionに残っている前の値は「-1」だから、
この値を残したままで、while CheckPosition!-1
とやったら、処理が終了してしまいますよね。

有難うございました。スッキリ〜



kz3

リンク

2006/8/10(Thu) 18:14:14|NO.1933

>>whileの前にCheckPosition=0とやってみてください。
>のところを
whileの前にCheckPosition=100
>とやっても、ちゃんと動きますね。

何故動くか分かりますか?

>ここはでたらめな値で良いみたいですね。

「でたらめでよい」という理解では不十分です。
何故でたらめな値でいいのか分かりますか?でたらめでいいなら「-1」でもいいですよね?
じゃぁ「-1」と書き換えて実行してみてください。でたらめでいいですか?

>CheckPositionの値は、whileの後でinstr(・・・によって、再定義される事には変わりないと思うのですが・・・。

問題は再定義( 代入ね )される事ではありません。
ループに入るときに直前の結果が残ったままだということです。
『直前の結果』とは具体的にどのような結果ですか?説明してください。

不具合の原因が理解できていないから「でたらめでいい」ってなっちゃうんですよ...。

>whileって、こう言うものだと、思っとくしかないのでしょうか・・。
whileに限らず、ループ構文ではどのようにループに入り、どのようにループを脱するのかを、頭で理解できていなければなりません。

>「誤動作」ですか?
風の谷のナウシカさんの誤解です。



kz3

リンク

2006/8/10(Thu) 18:14:50|NO.1934

また時間差ですよ...解決してよかったですね。



トホホッティー

リンク

2006/8/10(Thu) 18:15:59|NO.1935

whileの条件文が!-1なので-1でなければ繰り返しますよね。
その次に値を代入しているので。
whileの前に代入していない場合で2週目になった時CheckPositionの値が-1のままに
なっていてwhile文がループしなかったのだとおもいます。

なので、CheckPositionが-1で無い限りwhileはループするので
whileの前にCheckPosition=0でもCheckPosition=100でも正常に動くということでしょう。

私見ですので、正しい見方は違うかもしれませんが。
参考になればどうぞ。



トホホッティー

リンク

2006/8/10(Thu) 18:21:26|NO.1936

書き込み中に解答が出てた。

解決したみたいでよかったですね。



風の谷のウマシカ

リンク

2006/8/10(Thu) 18:27:02|NO.1938

お手数お掛けしました。納得しました。正しくは「-1以外なら何でも良い」ですね。
「誤動作」でも「不具合」でもなく、私が「もうヤメテいい」と、言っていたのですね。

CheckPosition=0やCheckPosition=100がある限り、whileはずっと続くけれど、
repeatは5回で停めているから、そっちで抜けられているのですね。

解決です。有難うございました。



トホホッティー

リンク

2006/8/10(Thu) 18:35:34|NO.1939

>CheckPosition=0やCheckPosition=100がある限り、whileはずっと続くけれど、
>repeatは5回で停めているから、そっちで抜けられているのですね。

ということですが
whileのすぐあとにCheckPosition=instr(Letters,0," ")がされているので
そこでCheckPositionが-1になった時に抜けているのでしょう。

最初だけ-1以外のものにしてあげればいいだけだとおもいます。



風の谷のウマシカ

リンク

2006/8/11(Fri) 02:03:32|NO.1943

ありがとうございます。仰る通りですね。「抜ける」のは

CheckPosition=0 while CheckPosition!-1 CheckPosition=instr(Letters,0," ")
のネストのつなぎの所を指しています。表現が変?
今度はちゃっんと理解していますのでご安心を。



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