Discussions

Petit computer 3 Community

Soybeanman2013niconico

10/21/2017 7:12 AM ·Spoilers

Open Closed

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

質問です。 DATA文に、CHR$(10)、CHR$(13)、 CHR$(34)等の特殊文字を記述する場合には、 どうすれば良いのでしょうか? 教えて頂けると有難いです。

Advertisement

Comment

This post has no comments.

  • ツララさん>>お答えありがとうございます。 やはりDATA文にそのまま記述するのは難しいですか… ツララさんの仰った方法だと、 文字コード(16bit)全て使っている DATA文では活用が難しそうです。 今日、寝ながら考えてみます。(-ω-).zZ

    Yeahs1
    Played
  • 文字列はコンパイル時計算はないので式を書くのは不可能だし 直接記述もできないし 結局「無理」かな。 エスケープシーケンスとかいう考え方を使って工夫するといいかもね。

    Yeahs0
    Played
  • (どちらかというと「エスケープ文字」と言ったほうが正確だったようです) 一つ例を出すと 「\」があったら次の2桁を文字に変換する、というのがありますね \0Aなら&H0A=10でCHR$(10)の代わりになる \0Dなら&H0D=13でCHR$(13)の代わりになる \自体を書きたいときは\\と書けば1文字の\になる という仕組みを自力で実装することが、一つの解決方法。

    Yeahs2
    Played
  • DATA文でという答えになってないけど文字列変数に代入する記述でできます https://miiverse.nintendo.net/posts/AYMHAAADAAB2V0e2wdWn3A

    Yeahs0
    Played
  • 残念ながらプチコンの文字列の仕様がおまぬけなので、任意の文字を記述ってのができないのよね。 data 文にこだわるのであれば、あまさとさんのように自分で文法を定義してそれを解釈するのが一番簡単。遅くなるけどね。 単一ソースにこだわらないのであれば、外部ファイルにするのが一番簡単。 てかむしろデータは外部に持つのが一般的で、data文とか使ってソースコードにデータ埋め込む方法のが珍しい。 とはいえプチコン特有の事情で、単一ファイルにしたいというのも理解できます。

    Yeahs1
    Played
  • 文字列に代入する方法でも任意の文字は記述できないのか。すみませんでした

    Yeahs0
    Played
  • この問題は僕がライブラリを作る時にも 悩んだ問題。色々検証した末辿り着いた (特に偏った数値を扱わない場合に限り) 読み込みが最速&充分に圧縮出来ていると思われるものを書いておく。 方法はCHR$10,13,34に当たる文字を DATA文に文字列としてではなく それぞれ0,1,2という数値として 記述するというもの。

    Yeahs1
    Played
  • 読み込み時には (上コメの例には付いてないけど) 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 と、する感じ。

    Yeahs0
    Played
  • この方法の欠点としては DATA文を出力するプログラムを 作るのが面倒臭いっていう。() ほしけん氏の場合、 @L T$="ABC"+CHR(10)+"DEF" RETURN みたいなのにGOSUBしてやってたと記憶。 =で直接代入してる分、DATAよりは 全然速いけど、CHR$()でプログラムの 最大文字数を圧迫する可能性があるから オススメはしないけど。

    Yeahs0
    Played
  • データの中身にもよるんですけど、10/13/34がそれほど多くないのであれば、一旦適当な文字で埋めておいて、特殊な文字を後から埋めてやるのがいいかなと思います。 DATA "XXXXXXXXXX" DATA 0,-1 '10の場所、-1はデータ終端用 DATA 2,4,-1 '13の場所 DATA 5,6,7,-1 '34の場所 みたいに。文字連結するやりかたなら、メモリ確保/破棄/コピーを最小限に抑えるためにも、サイズをデータに含めて先に領域確保した後COPYするほうがよいかとー。

    Yeahs0
    Played
  • 自分的には、改行はこんな感じで対応しています。

    Yeahs0
    Played
  • 「"」は使うフォントにもよりますが、標準のコンソール文字だと全角、半角共に同じ文字パターンを使っているので見分けがつきません。 ダイアログだと文字間でわかる感じですが割りと使えます。 データでは中に全角文字の方を入力すると言う手もあるかも。

    Yeahs0
    Played
  • &H0000~FFFFを使うのであれば無理ですね。トピ主さんが貼っているような書き方をするか(すごい後ろの方にも改行コードがあった気がするので注意)、あまさとさんが書いているようなエスケープ文字で対応するかのどちらかになると思います。 もちろん、16進数文字列で書いたり、普通に1つずつカンマで区切る方法もありますが。 ただしあくまで、ツール系などの開発で1つのプログラム内にどうしてもデータを全て入れて(なるべく圧縮して)1つにしてしまいたい場合の手法であって、ただプログラム内で使うデータならば外部のDATファイルにするのが最適だと思います。

    Yeahs0
    Played
  • あまさとしおんさんの提案してる方法ですが、INSTR関数で\の文字の 位置を検索すると1文字づつ比較するより早く変換できると思います

    Yeahs0
    Played
  • もしかして、次に投稿されているように 画像を変換してDATA文にするときのこと? 透明色だとしてもできれば内部で持っている 色データも保持したい。 (例えば、A,R,G,B→0,0,0,16みたいな色) とか? イメージとしてですけど画像みたいに 分けるでは、だめですか?

    Yeahs0
    Played
  • 皆さんお答えありがとうございます。 プログラムを見直したところ、 使わない文字を3つ作れたので、 ツララさんの方法で解決出来ました。 次、同じ事で悩んだ時は お答え頂いた方法を参考にしたいと思います。

    Yeahs1
    Played
  • >マギーさん プチコンだと文字コードでCHR$(0)が「文字送り」のコントロールコード(PRINT命令の引数にすると文字を表示せず別の何らかの操作になる)で、それに相当する表示用の文字がCHR$(9) 同様にCHR$(10)が「改行」で文字がCHR$(13) CHR$(34)はダブルクォーテーションなので、プログラム中でそのまま使うと 文字列の定義と解釈されて単体の文字としては表示出来ない ってことですね。 画像を変換して数値データに落とし込むとして 一つのドット当たり必要な情報は(X,Y)の座標とARGBの色情報で合計6つで DATAを6個刻みで読み書きする様なフォーマットを自作すれば解決出来そうじゃないです?

    Yeahs0
    Played

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.

Use of Miiverse Details about Miiverse

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.

Violation Type:

Post ID: 3DB-NBL7-DPU-2NLA-M9U-2ZXJ

Report Violation to Miiverse Administrators

You cannot report posts made automatically by a software title.

Edit Post

Select an action: