投稿
ど忘れ? 無い? 配列の間の要素を削除して切り詰める簡単な方法ってありましたっけ? しばらく待って回答がなければ消します! てか方法があることを望んでます!
1そうだね
プレイ済み
返信[1]
親投稿
Godot orz_127
配列の要素の途中を抜き取って外すってことですすよね? 自分も知りたい所なのでコメ残しさせて頂きます^^; 文字列は出来そうなのですが、普通の配列はよくわからない^^;
0そうだね
プレイ済み
返信[2]
親投稿
同じ大きさの適当な配列を作る DIM TEKI[大きさ] FOR I=0 TO 大きさ-1 TEKI[I]=I+1 NEXT TEKI[消したい配列番号]=0 TEKIで消したいのがある配列をSORTして すると消したい配列番号が頭に来るのでSHIFTでぶっ飛ばします。 終了。mkIIで作った私のガラガラ抽選器は玉を取り出すのにこんな感じだったと思う。3号に移植するかな?
1そうだね
プレイ済み
返信[3]
親投稿
皆さん回答ありがとうございます! 今のところ求める回答が出てきてないですね〜…。やっぱり簡単ややり方ってないのかなぁ。命令表では見つからなかったんですがプチコンって裏技的な方法がある場合があるんで気になったんです…。 回答が来てるし投稿を削除はしません。今のところコピーを駆使した専用の命令を作るしかないかなぁ、と思ってきてます。
0そうだね
プレイ済み
返信[4]
親投稿
ナツキ natukin1978
「音楽つくろうぜ!」で使われてる配列の空文字列を削除して切り詰める関数です。(一番上) 良かったら参考にどうぞ
0そうだね
プレイ済み
返信[5]
親投稿
ナツキ natukin1978
しかし、改めて見ると無駄が多い。 当時、戻り値で配列返す事ができないと思い込んでいたので引数の配列を加工する方法を採ってしまった。 一番上の関数のNEXTの直後でbuf$をそのままRETURNすればシンプル。
0そうだね
プレイ済み
返信[6]
親投稿
けい kei0baisoku
ワンステップで出来る方法は見たこと無いし、ちょっと思い付かないですねー(´ω`) COPY命令利用したら望む命令が比較的シンプルに作れそう………なので試そうと思いましたが、でんぺんさんがすぐに作りそうな勢いなのでお任せしますっ!(^O^)
1そうだね
プレイ済み
返信[7]
親投稿
>ナツキさん ありがとうございます。自作関数を作る際には参考にさせてもらいます〜。 >けいさん そのワンステップを期待してしまってました。無謀なことを言ってすいません(^^; COPYを使う自作関数の方法ならいくつか思いつくので、やっぱり自作関数方面かな〜って思ってきます。 と言うことで、みなさん、ありがとうございました!!
0そうだね
プレイ済み
返信[8]
親投稿
もっとオマケ。 自作関数を作る際に、文字と数値配列の2種類を一つの関数にするのってやっぱり無理ですよね? なんか裏技ばかり求めてすいません(^^;
0そうだね
プレイ済み
返信[9]
親投稿
COPYと参照の副作用を使ってやってます。
0そうだね
プレイ済み
返信[10]
親投稿
ナツキ natukin1978
確かに配列の連続データをCOPYする方法が良さげですね。
0そうだね
プレイ済み
返信[11]
親投稿
Godot orz_127
ダークサイド(裏技)に堕ちると 次のアプデが怖いw
1そうだね
プレイ済み
返信[12]
親投稿
ナツキ natukin1978
> 自作関数を作る際に、文字と数値配列の2種類を一つの関数にするのってやっぱり無理ですよね? 関数の引数で文字列($)などの指定を明示的に行わなければ。数値と文字列の両対応の関数として定義できます。
0そうだね
プレイ済み
返信[13]
親投稿
ご存じかとは思いますが、 コピー元の長さが0だとエラーになるので、そのチェックは必要です。 ローカルに長さ0の配列を用意して、前後2回のCOPYと参照値の代入をしています。
0そうだね
プレイ済み
返信[14]
親投稿
けい kei0baisoku
前に投稿した事がある内容ですが、こんな感じで関数内で型を判断してから分岐すれば、両方の型にも対応できます。
2そうだね
プレイ済み
返信[15]
親投稿
仮引数は、実行時のチェックなので、次元さえ合えば可能だと思います。ただし、わかりにくくなるのと、参照の代入で型のチェックを将来するか否かを、スマイルブームさんに問い合わせた方が良いと思います。
0そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
二つ目の「文字列==数値」が3になる現象は、バージョン3.10からの挙動だそうです。 それまでは文法エラーだったので、あまりオススメできません。 関数内で DIM ARY$[0] みたいに型に応じたコードを書かなくて済むなら、ナツキさんの言うように引数の型は実行時に任せられますので、型の判定も必要ないと思います。
0そうだね
プレイ済み
返信[17]
親投稿
削除するのが1つだけなら、後ろを一つ前にコピーして、POPで長さ調整する方法もあります。
0そうだね
プレイ済み
返信[18]
親投稿
なるほど〜。色んな意見、参考になります! 裏技を知りたいという姑息な投稿でしたが意外と有益な情報がたくさん集まって良かったです(^^; 色々考えて、とりあえずの方針としては、 ・自作関数を作る ・あまり極端に裏技(非公式仕様依存)のやり方は避ける という感じでやってみようと思います! ありがとうございます!
1そうだね
プレイ済み
返信[19]
親投稿
ヨッシー okkun2002
おお、やっぱり自作関数ですよね。 すべて別の配列をPUSHでやって返す方法しか思い付かない(><)
0そうだね
プレイ済み
返信[20]
親投稿
せっかくみんなが教えてくれたので最後にまとめ的な書き込みをしておきます。とはいえこれは方針(非公式仕様依存)にあってないので利用しないかもしれませんが、とりあえずナツキさんのNULL捨てとコータさんのコピー詰めを利用したやり方です。 けいさんの型に応じたコードを避ければ型判定(分岐)なしで出来るというのも利用しています。 1つだけ削除なのと引数チェックしてないのでコピー元0文字だとか多いとかだとエラーになっちゃったりするんであくまで参考までの報告です。 DEF ARYDEL A[],P COPY A,P,A,P+1,LEN(A)-P-1:NULL POP(A) END DEF NULL D END これで文字や数値の配列の指定した位置の要素を1つ削除は実装出来ました。皆さんのおかげです。ありがとうございました!
3そうだね
プレイ済み
返信[21]
親投稿
 >うえこうさん いえいえ〜。書き込んでもらって注目してもらえる事で人が増えますし全ての意見を参考にしていますよ! ありがとうございました〜。
0そうだね
プレイ済み