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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0404
GOTOUstrmidで右から文字を取り出すには?10解決


GOTOU

リンク

2008/4/4(Fri) 16:44:00|NO.14831

bloadでは右(文字の終わり)から文字を取り出せないので、
strmidを使ってみることにしましたが、下記の処理が上手く出来ません。
1)ファイルから文字列を読み込んで
2)配列変数seqに代入
3)右から1文字目、右から1,2文字、右から1,2,3文字・・・
 右から1,2,3,4,5,6文字を順に取り出して表示

下記のスクリプトで実行すると、
右から1文字目しか読まれません。

strmidで読み出すと、上書きが出来ないのでしょうか。


sdim seq, num seq_level = 1 notesel spcbuff noteload "setseq.txt" noteget seq, 0 seq = str(seq) for num,0,6 seq(num) = strmid(seq(num),-1,seq_level) seq_level++ mes seq next -----setseq.txt-------- 101001 -----------------------



この記事に返信する


トホホッティー

リンク

2008/4/4(Fri) 17:06:00|NO.14833

ごめんなさい、こう言うことですかね?


sdim seq, num dat="" seq_level = 5 notesel spcbuff noteload "setseq.txt" noteget seq, 0 seq = str(seq) for num,0,6 dat = dat+strmid(seq,seq_level,1) seq_level-- mes dat next



GOTOU

リンク

2008/4/4(Fri) 17:56:09|NO.14834

トホホッティー様

有難うございます。
実行してみた所、

1 10 101 1010 10100 101001
と表示されてしまいました。

右側から表示させたいので、

1 01 001 1001 01001 101001
という結果にしたいのです。



SYAM

リンク

2008/4/4(Fri) 18:36:11|NO.14837

問題点を挙げます。
seqが0文字で作られています。
さらにそのあと配列扱いしてます。
str命令の意図も解りません。
まずは、数値と文字列と配列をしっかり理解することが必要です。

というか
お望みの機能は確か私が以前に出したサンプルスクリプトに入っていたはずです。
必要なら理解できなかった部分について説明しますので、もう一度前回の質問の回答のスクリプトをご覧になって下さい。



トホホッティー

リンク

2008/4/4(Fri) 18:48:31|NO.14838


sdim seq, num dat="" seq_level = 5 notesel spcbuff noteload "setseq.txt" noteget seq, 0 seq = str(seq) for num,0,6 dat = strmid(seq,seq_level,1)+dat seq_level-- mes dat next

ご希望の処理はこのようなものでしょうか?
その様な数字の表示の仕方なら代入方法を変えました。
それから、なぜ私が変数名を変更したかもお考えください。あと、引数もよくご確認を。



トホホッティー

リンク

2008/4/4(Fri) 18:53:15|NO.14839

ちなみにさっきのでは


1 10 100 1001 10010 100101

と表示されます。



GOTOU

リンク

2008/4/4(Fri) 18:53:32|NO.14840

SYAN様

早速以前のスクリプトを参照致しました。
もう少しきちんと理解出来ていれば解決する問題でした。
申し訳ございません。

>str命令の意図も解りません。
 sdimを使うので、文字列に変換したのですが、
 なくても動きました、確かに必要ありませんでした。
>まずは、数値と文字列と配列をしっかり理解することが必要です。
ご指摘有難うございます。
勉強不足ですね・・・

ご指摘頂いた問題点の
>seqが0文字で作られています。
>さらにそのあと配列扱いしてます。
が上手く理解できないのですが、
0文字とは何のことでしょうか・・・

一応、下記のスクリプトで目的は達成出来ました。

sdim seq, num dat="" notesel spcbuff noteload "setseq.txt" noteget seq, 0 for num,1,7 dat = strmid(seq,-1,num) mes dat next



GOTOU

リンク

2008/4/4(Fri) 19:01:08|NO.14841

トホホッティー様

有難うございます。
>なぜ私が変数名を変更したかもお考えください。
 元のスクリプトでは、seqに代入したので、処理が上手く行かなかったのですね。
 完成したスクリプトの変数をdatからseqに変えたら、同じような処理になりました。
 勉強になります。
>あと、引数もよくご確認を。
 代入方法まで注目すれば、気付く問題でした。
 不勉強で申し訳ございません。

と、言うことは、

sdim seq, num dat="" notesel spcbuff noteload "setseq.txt" noteget seq, 0 seq_level == 1 for num,0,6 dat = strmid(seq,-1,seq_level) seq_level++ mes dat next
この方が実用的ですね。



トホホッティー

リンク

2008/4/4(Fri) 19:24:31|NO.14842

すみません、僕の方こそ引数間違えてました。


strmid(seq,-1,seq_level)

の-1は右から何文字を見るための引数でした。

僕の方こそもっと勉強します。



SYAM

リンク

2008/4/4(Fri) 19:29:48|NO.14843

sdim命令がどんな意味になっているかを、マニュアルと照らし合わせて考えてみてください。
seq という名前で、(num)文字格納できる文字列変数を用意していますね。
numは何の用意もしてませんから、数値型変数で内容は0です。
つまり、これだとseqという0文字格納できる文字列変数を作っていることになります。
noteget命令が融通を利かせて、格納できる大きさを自動的に広げてくれているから動作していますが、別の命令だとエラーになる可能性大です。
また、seq(num)=… というのは、seqという配列のnum番目の要素という意味です。先ほどの定義では、seqは配列になってはいませんからnum番目という考え方自体ができないものです。これも間違い。

変数の種類や 配列、
dim命令や sdim命令についてよく理解を深めてみて下さい。最初のスクリプトがどうおかしいかが解ると思います。



GOTOU

リンク

2008/4/4(Fri) 20:58:20|NO.14850

トホホッティー様
 とんでもないです・・・
 頂いたアドバイスのお陰で、色々試行錯誤出来ました。

SYAM様
 とても分かりやすいご説明、有難うございます。
>numは何の用意もしてませんから、数値型変数で内容は0です。
>先ほどの定義では、seqは配列になってはいませんから
>num番目という考え方自体ができないものです。
 dim、sdimのマニュアルを読み直して見ました。
 確かにおっしゃる通りです。
 変数の種類や 配列、dim命令や sdim命令はとても苦手なので、
 理解を深めます。



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