投稿
まげ MAGE_LOVEMARINE
A$="A":B$=A$ A$="B" PRINT A$;"/";B$ 実行すると、表示されるのはモチロン「B/A」です。でも、 A$="A":B$=A$ A$[0]="B" PRINT A$;"/";B$ とすると…結果は「B/B」! 既出でしたらゴメンなさい。 私を小一時間悩ませたネタでした。
4そうだね
プレイ済み
返信[1]
親投稿
Sきち 4405chan
「うそだよー。という嘘。それも嘘。というのも嘘。またそれも嘘。」みたいなもんですかね。
0そうだね
プレイ済み
返信[2]
親投稿
まげ MAGE_LOVEMARINE
>Sさん 「私は嘘つきだー」。さてこの人は嘘つき? 正直者?(^^) って話じゃなくて、これのキモは、下の命令が上の変数に影響を与えていることなんですよ。ま、そもそも[]の使い方がトリッキーなんですけど。
1そうだね
プレイ済み
返信[3]
親投稿
Sきち 4405chan
最近疲れてきてる。(言い訳するな。) 知人に考えさせると頭が混乱して気絶しちゃいそう。そこまではいかないか。
0そうだね
プレイ済み
返信[4]
親投稿
Godot orz_127
文字列の代入はその文字列が入っている場所が代入されている気がします。 (ポインタ渡し?参照渡し?) A$="A"はメモリ上の"A"の文字列の先頭位置がA$に代入され、 B$=A$はA$に代入されている"A"の先頭位置が代入される事に。 この時点でA$、B$共に同じメモリ上の"A"の先頭位置が代入されているのでどちらから見ても同じ"A"が参照される事に。 最初の例ではA$="B"としてA$側をメモリ上の"B"の位置に変えているので 「B/A」となります。 次の例ではA$[0]="B"としていてA$に代入されているメモリ上の"A"の0番目(最初の位置)のAの文字をBに書き換えています。 A$もB$も代入されているメモリの位置は変えていないので両方から"B"が見えることになり結果は「B/B」となります。 また同様の理由から2つ目の例はA$[0]="B"でなく、B$[0]としても同じ結果に。
0そうだね
プレイ済み
返信[5]
親投稿
Godot orz_127
ちょっと書き損ないました。 B$[0]="B"です。 で B$=A$のところを COPY B$,A$ とするとA$に代入されたメモリ上の文字列の内容をメモリ上の別の場所にコピーしてその場所をB$に代入するようなので、後で A$[0]="B" としても結果は「B/A」となります。 と、長くなりましたが勝手にそう思っている次第です。 仕様は知らないのでほんとかどうかは不明です^^; 因みに自分は、文字を2バイトの1次元配列代わりに使っていますw
0そうだね
プレイ済み
返信[6]
親投稿
bigslope bigslope
明らかにC言語のポインタと同じ動きをしていますね。 通常の文字列代入ならば、その辺りうまく隠せていたのですが、ポインタの先をいじってしまうと厄介な事になるという…。 文字変数を配列代わりにするテクニックは、今自分もまとめている所ですが、こちらも色々と落とし穴があるみたいで。ただ、使いようによっては非常に便利なテクニックです。
0そうだね
プレイ済み
返信[7]
親投稿
けい kei0baisoku
>まげさん 丁度、昨日の私の投稿でこの辺りの話にもなって色々検証したのですが、結論として以下の6パターンの処理を行ったときだけ、1つの「文字列変数」として見ると直感的でない結果になりました。 ・添字演算子[]を使って文字列の一部を書き換える ・COPYに文字列変数を渡す ・PUSHに文字列変数を渡す ・POPに文字列変数を渡す ・SHIFTに文字列変数を渡す ・UNSHIFTに文字列変数を渡す 6つとも説明書にも公式のプログラムにも存在しない使い方のようなので、行わない方が良さそうと感じています。 読み取り専用でIF A$[0]=="0" くらいなら問題無いかなと思っているのですが(´ω`)
0そうだね
プレイ済み
返信[8]
親投稿
まげ MAGE_LOVEMARINE
なん…となく理解できました(^^;)。Godotさん、bigslopeさん、けいさん、ありがとうございます! Sさん、ドンマイ♪ どこまでが仕様で、どこまでがバグなんでしょうね。文字列を[]で扱えるのはとても便利で楽なので、できれば仕様であってほしい=アップデートで消えないでほしい(^^)。
1そうだね
プレイ済み