トピック
受付中
Soybeanman 2013niconico

質問++DATA文に特殊文字を記述するには。++

質問です。 DATA文に、CHR$(10)、CHR$(13)、 CHR$(34)等の特殊文字を記述する場合には、 どうすれば良いのでしょうか? 教えて頂けると有難いです。
2そうだね
プレイ済み
返信[1]
親投稿
ツララ LongIceSword
DATA文には文字のコード番号だけ書いておいて READ命令で読み取った後にCHR$()関数の引数として使えばいいんじゃないです? もしくはDATA文上では使わない文字で代用しておいて、READ命令で読み込んだ後にINSTR命令とSUBST$命令を使ってその文字と合致した部分を差し換えるとか。
2そうだね
プレイ済み
返信[2]
親投稿
Soybeanman 2013niconico
ツララさん>>お答えありがとうございます。 やはりDATA文にそのまま記述するのは難しいですか… ツララさんの仰った方法だと、 文字コード(16bit)全て使っている DATA文では活用が難しそうです。 今日、寝ながら考えてみます。(-ω-).zZ
1そうだね
プレイ済み
返信[3]
親投稿
文字列はコンパイル時計算はないので式を書くのは不可能だし 直接記述もできないし 結局「無理」かな。 エスケープシーケンスとかいう考え方を使って工夫するといいかもね。
0そうだね
プレイ済み
返信[4]
親投稿
(どちらかというと「エスケープ文字」と言ったほうが正確だったようです) 一つ例を出すと 「\」があったら次の2桁を文字に変換する、というのがありますね \0Aなら&H0A=10でCHR$(10)の代わりになる \0Dなら&H0D=13でCHR$(13)の代わりになる \自体を書きたいときは\\と書けば1文字の\になる という仕組みを自力で実装することが、一つの解決方法。
2そうだね
プレイ済み
返信[5]
親投稿
NAGI KOUCHA_PAN
DATA文でという答えになってないけど文字列変数に代入する記述でできます https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0e2wdWn3A
0そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
残念ながらプチコンの文字列の仕様がおまぬけなので、任意の文字を記述ってのができないのよね。 data 文にこだわるのであれば、あまさとさんのように自分で文法を定義してそれを解釈するのが一番簡単。遅くなるけどね。 単一ソースにこだわらないのであれば、外部ファイルにするのが一番簡単。 てかむしろデータは外部に持つのが一般的で、data文とか使ってソースコードにデータ埋め込む方法のが珍しい。 とはいえプチコン特有の事情で、単一ファイルにしたいというのも理解できます。
1そうだね
プレイ済み
返信[7]
親投稿
NAGI KOUCHA_PAN
文字列に代入する方法でも任意の文字は記述できないのか。すみませんでした
0そうだね
プレイ済み
返信[8]
親投稿
だにえる haru2016nen
この問題は僕がライブラリを作る時にも 悩んだ問題。色々検証した末辿り着いた (特に偏った数値を扱わない場合に限り) 読み込みが最速&充分に圧縮出来ていると思われるものを書いておく。 方法はCHR$10,13,34に当たる文字を DATA文に文字列としてではなく それぞれ0,1,2という数値として 記述するというもの。
1そうだね
プレイ済み
返信[9]
親投稿
だにえる haru2016nen
読み込み時には (上コメの例には付いてないけど) DATAの先頭にはREADの回数を付けておいて DATA 3,"ABC",0,"DEF" Z$=CHR$(10) : L=0 : READ V REPERT IF L MOD 2THEN READ N IF N THEN{中略}ELSE INC T$,Z$ ELSE READ N$ : INC T$,N$ ENDIF L=L+1 UNTIL L==V と、する感じ。
0そうだね
プレイ済み
返信[10]
親投稿
だにえる haru2016nen
この方法の欠点としては DATA文を出力するプログラムを 作るのが面倒臭いっていう。() ほしけん氏の場合、 @L T$="ABC"+CHR(10)+"DEF" RETURN みたいなのにGOSUBしてやってたと記憶。 =で直接代入してる分、DATAよりは 全然速いけど、CHR$()でプログラムの 最大文字数を圧迫する可能性があるから オススメはしないけど。
0そうだね
プレイ済み
返信[11]
親投稿
myu314 myu314
データの中身にもよるんですけど、10/13/34がそれほど多くないのであれば、一旦適当な文字で埋めておいて、特殊な文字を後から埋めてやるのがいいかなと思います。 DATA "XXXXXXXXXX" DATA 0,-1 '10の場所、-1はデータ終端用 DATA 2,4,-1 '13の場所 DATA 5,6,7,-1 '34の場所 みたいに。文字連結するやりかたなら、メモリ確保/破棄/コピーを最小限に抑えるためにも、サイズをデータに含めて先に領域確保した後COPYするほうがよいかとー。
0そうだね
プレイ済み
返信[12]
親投稿
Godot orz_127
自分的には、改行はこんな感じで対応しています。
0そうだね
プレイ済み
返信[13]
親投稿
Godot orz_127
「"」は使うフォントにもよりますが、標準のコンソール文字だと全角、半角共に同じ文字パターンを使っているので見分けがつきません。 ダイアログだと文字間でわかる感じですが割りと使えます。 データでは中に全角文字の方を入力すると言う手もあるかも。
0そうだね
プレイ済み
返信[14]
親投稿
みむ*mim hidemimtp
&H0000~FFFFを使うのであれば無理ですね。トピ主さんが貼っているような書き方をするか(すごい後ろの方にも改行コードがあった気がするので注意)、あまさとさんが書いているようなエスケープ文字で対応するかのどちらかになると思います。 もちろん、16進数文字列で書いたり、普通に1つずつカンマで区切る方法もありますが。 ただしあくまで、ツール系などの開発で1つのプログラム内にどうしてもデータを全て入れて(なるべく圧縮して)1つにしてしまいたい場合の手法であって、ただプログラム内で使うデータならば外部のDATファイルにするのが最適だと思います。
0そうだね
プレイ済み
返信[15]
親投稿
otta777 otta777a
あまさとしおんさんの提案してる方法ですが、INSTR関数で\の文字の 位置を検索すると1文字づつ比較するより早く変換できると思います
0そうだね
プレイ済み
返信[16]
親投稿
マギー M191246
もしかして、次に投稿されているように 画像を変換してDATA文にするときのこと? 透明色だとしてもできれば内部で持っている 色データも保持したい。 (例えば、A,R,G,B→0,0,0,16みたいな色) とか? イメージとしてですけど画像みたいに 分けるでは、だめですか?
0そうだね
プレイ済み
返信[17]
親投稿
Soybeanman 2013niconico
皆さんお答えありがとうございます。 プログラムを見直したところ、 使わない文字を3つ作れたので、 ツララさんの方法で解決出来ました。 次、同じ事で悩んだ時は お答え頂いた方法を参考にしたいと思います。
1そうだね
プレイ済み
返信[18]
親投稿
ツララ LongIceSword
解決出来たのはよかったですね、でも別に私の名前出さなくていいですよ。 普通に考えれば行き着くごく普通の事を言ってただけですから。 公式サイトの文字コード表とASCIIコードの制御文字一覧を見てて思ったんですけど 3DSのハードに合わせて使い易い様に他の命令に置換しているコントロールコードがあって、文字としては使っていない(×印として表示される)キャラクター番号って結構ある感じですね。 MIKIさんみたく、自身が普段慣れ親しんでいる様式と違うだけでおまぬけって言うのはどうかと思いますけど。
0そうだね
プレイ済み
返信[19]
親投稿
ツララ LongIceSword
>マギーさん プチコンだと文字コードでCHR$(0)が「文字送り」のコントロールコード(PRINT命令の引数にすると文字を表示せず別の何らかの操作になる)で、それに相当する表示用の文字がCHR$(9) 同様にCHR$(10)が「改行」で文字がCHR$(13) CHR$(34)はダブルクォーテーションなので、プログラム中でそのまま使うと 文字列の定義と解釈されて単体の文字としては表示出来ない ってことですね。 画像を変換して数値データに落とし込むとして 一つのドット当たり必要な情報は(X,Y)の座標とARGBの色情報で合計6つで DATAを6個刻みで読み書きする様なフォーマットを自作すれば解決出来そうじゃないです?
0そうだね
プレイ済み
返信[20]
親投稿
マギー M191246
Soybeanmanさんの次の投稿 GRP→DATAというのを見て もしも透明色部分も厳密に再現しようとすると &H0000~&HFFFFのどれも現れる可能性が あって、別の文字に置き換えるのは ムリっぽいので 例えば、10,34などが入っていたら、 そこだけ文字コードを表す別の数値データに しておいて、読み込むときに 文字に戻してつなぐようにしたら いいんじゃないかと思っていたんです。
0そうだね
プレイ済み