Petit computer 3 Community
Soybeanman2013niconico
10/21/2017 7:12 AM ·Spoilers
質問++DATA文に特殊文字を記述するには。++
質問です。 DATA文に、CHR$(10)、CHR$(13)、 CHR$(34)等の特殊文字を記述する場合には、 どうすれば良いのでしょうか? 教えて頂けると有難いです。
Share this Post
Comment
This post has no comments.
-
10/21/2017 8:00 AM ·Spoilers
ツララさん>>お答えありがとうございます。 やはりDATA文にそのまま記述するのは難しいですか… ツララさんの仰った方法だと、 文字コード(16bit)全て使っている DATA文では活用が難しそうです。 今日、寝ながら考えてみます。(-ω-).zZ
Yeahs1Played -
10/21/2017 8:09 AM ·Spoilers
文字列はコンパイル時計算はないので式を書くのは不可能だし 直接記述もできないし 結局「無理」かな。 エスケープシーケンスとかいう考え方を使って工夫するといいかもね。
Yeahs0Played -
10/21/2017 8:15 AM ·Spoilers
(どちらかというと「エスケープ文字」と言ったほうが正確だったようです) 一つ例を出すと 「\」があったら次の2桁を文字に変換する、というのがありますね \0Aなら&H0A=10でCHR$(10)の代わりになる \0Dなら&H0D=13でCHR$(13)の代わりになる \自体を書きたいときは\\と書けば1文字の\になる という仕組みを自力で実装することが、一つの解決方法。
Yeahs2Played -
10/21/2017 8:16 AM ·Spoilers
DATA文でという答えになってないけど文字列変数に代入する記述でできます https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0e2wdWn3A
Yeahs0Played -
10/21/2017 11:07 AM ·Spoilers
残念ながらプチコンの文字列の仕様がおまぬけなので、任意の文字を記述ってのができないのよね。 data 文にこだわるのであれば、あまさとさんのように自分で文法を定義してそれを解釈するのが一番簡単。遅くなるけどね。 単一ソースにこだわらないのであれば、外部ファイルにするのが一番簡単。 てかむしろデータは外部に持つのが一般的で、data文とか使ってソースコードにデータ埋め込む方法のが珍しい。 とはいえプチコン特有の事情で、単一ファイルにしたいというのも理解できます。
Yeahs1Played -
-
10/21/2017 12:42 PM ·Spoilers
この問題は僕がライブラリを作る時にも 悩んだ問題。色々検証した末辿り着いた (特に偏った数値を扱わない場合に限り) 読み込みが最速&充分に圧縮出来ていると思われるものを書いておく。 方法はCHR$10,13,34に当たる文字を DATA文に文字列としてではなく それぞれ0,1,2という数値として 記述するというもの。
Yeahs1Played -
10/21/2017 12:56 PM ·Spoilers
読み込み時には (上コメの例には付いてないけど) 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 と、する感じ。
Yeahs0Played -
10/21/2017 1:06 PM ·Spoilers
この方法の欠点としては DATA文を出力するプログラムを 作るのが面倒臭いっていう。() ほしけん氏の場合、 @L T$="ABC"+CHR(10)+"DEF" RETURN みたいなのにGOSUBしてやってたと記憶。 =で直接代入してる分、DATAよりは 全然速いけど、CHR$()でプログラムの 最大文字数を圧迫する可能性があるから オススメはしないけど。
Yeahs0Played -
10/21/2017 9:59 PM ·Spoilers
データの中身にもよるんですけど、10/13/34がそれほど多くないのであれば、一旦適当な文字で埋めておいて、特殊な文字を後から埋めてやるのがいいかなと思います。 DATA "XXXXXXXXXX" DATA 0,-1 '10の場所、-1はデータ終端用 DATA 2,4,-1 '13の場所 DATA 5,6,7,-1 '34の場所 みたいに。文字連結するやりかたなら、メモリ確保/破棄/コピーを最小限に抑えるためにも、サイズをデータに含めて先に領域確保した後COPYするほうがよいかとー。
Yeahs0Played -
-
10/22/2017 12:15 AM ·Spoilers
「"」は使うフォントにもよりますが、標準のコンソール文字だと全角、半角共に同じ文字パターンを使っているので見分けがつきません。 ダイアログだと文字間でわかる感じですが割りと使えます。 データでは中に全角文字の方を入力すると言う手もあるかも。
Yeahs0Played -
10/23/2017 3:34 AM ·Spoilers
&H0000~FFFFを使うのであれば無理ですね。トピ主さんが貼っているような書き方をするか(すごい後ろの方にも改行コードがあった気がするので注意)、あまさとさんが書いているようなエスケープ文字で対応するかのどちらかになると思います。 もちろん、16進数文字列で書いたり、普通に1つずつカンマで区切る方法もありますが。 ただしあくまで、ツール系などの開発で1つのプログラム内にどうしてもデータを全て入れて(なるべく圧縮して)1つにしてしまいたい場合の手法であって、ただプログラム内で使うデータならば外部のDATファイルにするのが最適だと思います。
Yeahs0Played -
10/23/2017 9:38 PM ·Spoilers
あまさとしおんさんの提案してる方法ですが、INSTR関数で\の文字の 位置を検索すると1文字づつ比較するより早く変換できると思います
Yeahs0Played -
10/25/2017 2:39 PM ·Spoilers
もしかして、次に投稿されているように 画像を変換してDATA文にするときのこと? 透明色だとしてもできれば内部で持っている 色データも保持したい。 (例えば、A,R,G,B→0,0,0,16みたいな色) とか? イメージとしてですけど画像みたいに 分けるでは、だめですか?
Yeahs0Played -
10/25/2017 8:45 PM ·Spoilers
皆さんお答えありがとうございます。 プログラムを見直したところ、 使わない文字を3つ作れたので、 ツララさんの方法で解決出来ました。 次、同じ事で悩んだ時は お答え頂いた方法を参考にしたいと思います。
Yeahs1Played -
10/25/2017 10:51 PM ·Spoilers
解決出来たのはよかったですね、でも別に私の名前出さなくていいですよ。 普通に考えれば行き着くごく普通の事を言ってただけですから。 公式サイトの文字コード表とASCIIコードの制御文字一覧を見てて思ったんですけど 3DSのハードに合わせて使い易い様に他の命令に置換しているコントロールコードがあって、文字としては使っていない(×印として表示される)キャラクター番号って結構ある感じですね。 MIKIさんみたく、自身が普段慣れ親しんでいる様式と違うだけでおまぬけって言うのはどうかと思いますけど。
This comment contains spoilers.
Yeahs0Played -
10/25/2017 11:12 PM ·Spoilers
>マギーさん プチコンだと文字コードでCHR$(0)が「文字送り」のコントロールコード(PRINT命令の引数にすると文字を表示せず別の何らかの操作になる)で、それに相当する表示用の文字がCHR$(9) 同様にCHR$(10)が「改行」で文字がCHR$(13) CHR$(34)はダブルクォーテーションなので、プログラム中でそのまま使うと 文字列の定義と解釈されて単体の文字としては表示出来ない ってことですね。 画像を変換して数値データに落とし込むとして 一つのドット当たり必要な情報は(X,Y)の座標とARGBの色情報で合計6つで DATAを6個刻みで読み書きする様なフォーマットを自作すれば解決出来そうじゃないです?
Yeahs0Played -
10/26/2017 1:18 PM ·Spoilers
Soybeanmanさんの次の投稿 GRP→DATAというのを見て もしも透明色部分も厳密に再現しようとすると &H0000~&HFFFFのどれも現れる可能性が あって、別の文字に置き換えるのは ムリっぽいので 例えば、10,34などが入っていたら、 そこだけ文字コードを表す別の数値データに しておいて、読み込むときに 文字に戻してつなぐようにしたら いいんじゃないかと思っていたんです。
This comment contains spoilers.
Yeahs0Played
Add a Comment
You must sign in to post a comment.
Sign in using a Nintendo Network ID to connect to users around the world by writing posts and comments and by giving Yeahs to other people's posts. You can create a Nintendo Network ID using your Wii U console or your system in the Nintendo 3DS family.
Report Violation to Miiverse Administrators
You are about to report a post with content which violates the Miiverse Code of Conduct. This report will be sent to Nintendo's Miiverse administrators and not to the creator of the post.
Report Violation to Miiverse Administrators
You cannot report posts made automatically by a software title.
