投稿
Godot orz_127
USEについての質問 前の投稿からの継続になります。 前の投稿では何をしたいのか判りにくかったかなと思ったので、簡単なサンプルを作成しました。 回答頂けたら幸いです。 以下コメントで。
3そうだね
プレイ済み
返信[1]
親投稿
Godot orz_127
この様な感じで作成したデータがあるとします。
0そうだね
プレイ済み
返信[2]
親投稿
Godot orz_127
このデータを利用するライブラリ的なものを作成し、SLOT1に置いて参照するものとします。
0そうだね
プレイ済み
返信[3]
親投稿
Godot orz_127
SLOT0はこの様な感じで。
0そうだね
プレイ済み
返信[4]
親投稿
Godot orz_127
一応、この様にこれでも期待通りの 動作をしています。
0そうだね
プレイ済み
返信[5]
親投稿
Godot orz_127
前の投稿の際は、この様にしていたため、USEではSLOT1側のVAR定義が実行されないのでこの場合は、EXECを使用する様にとのことでした。 一応今回のサンプルの様に修正するとUSEでも動作するように見えます。 この使い方は正しいでしょうか? 前投稿で教示していただいたEXEC使用の方が正解でしょうか? あと追加で、確保した領域の初期化はサンプルにあるやり方で問題ないでしょうか?
0そうだね
プレイ済み
返信[6]
親投稿
Godot orz_127
打ち込んで試すのはめんどくさそうなので、一応このサンプルの公開キーをとりました 4DEDJE1D 公式な回答が頂ければ幸いです。
0そうだね
プレイ済み
返信[7]
親投稿
公式な見解はわかりませんが、不具合っぽくみえます。(仕様っぽくも見えます) D=B のところで グローバル変数にDがある Dは配列である Bは配列である よし、通れ! みたいな感じでポインタを渡してる気がするので、EXECの方が良い気はします。
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
>クッキーさん 前の投稿では一応、小林さんから、EXECを使ってね。的な回答が。 だとするとUSEの立場は?とか思ったり。 COMMON DEFしたらUSEで使う。 EXECは実行の用途と別に思いこんでいた所もありまだ頭の切り替えがw 配列の代入は参照値渡しなのでこれはこれで良い筈なのですが、EXECでないのでVARが実行されていないのに何故かD[0]が定義されているかのような振るまい。 謎が深まり中ですw
0そうだね
プレイ済み
返信[9]
親投稿
USEは例えばSLOT1にメインプログラムがあった場合でもそれを実行せずに関数だけ利用できます(かつてのK2KMISAKIのように) まぁ、高機能なライブラリになるとだいたい初期化が必要になったりするのでちょっとアレですけど。 『VARが実行されていないのに何故かD[0]が定義されているかのような振るまい』は通常の配列でないグローバル変数は普通に使用できるのと関係ありそうです。 型だけをチェックして代入しているんじゃないですかね?
0そうだね
プレイ済み
返信[10]
親投稿
Godot orz_127
>クッキーさん かつてのそれ、色々参考にさせて頂きました。 こうやってライブラリ化するのか、とかとか^^ USEの場合、プログラムの解析までで 実行がないので冒頭にOPTION STRICT等を書いても無意味とのことです。 で、スロット内でで有効な変数のつもりでVAR宣言しても実は無意味。 普通の数値や文字変数は宣言無しで使えているので一見宣言通り動いているかの様に錯覚しますが、配列は宣言が必須なので今回の問題が明確化しました^^;
0そうだね
プレイ済み
返信[11]
親投稿
まえの投稿にも書きましたが、ガイドブック(P67)のCOMMON DEFに、EXECで使用可能になる記述がありました。 済みませんでした。 D[0]が使えるのは、クッキーさんの言う通り、USEで名前の解決が済んでいて、実体のない参照値(たぶんNULLかなにか)があると思います。そして参照同士の代入によって実体が設定されているため、通常通り使えていると思われます。実体のない参照への代入は、DIM D[0]で宣言してもCOPYやPUSHで自動的に増やすのと同様の扱いになっているのではないでしょうか。
0そうだね
プレイ済み
返信[12]
親投稿
USEだとOPTION STRICTは無意味なわですか!? 初めて知りました… K2KMISAKIはプチコン3号の仕様がよくわからなくて試行錯誤してました。 そのおかげでプチコン3号の理解に繋がったので良かったです。
0そうだね
プレイ済み
返信[13]
親投稿
意図的に実行しない限り、初期値ありの宣言が無意味になると言うのは理解できたのですが、STRICTが無意味というのは、分かりませんでした。USEを実行するまで解析を実行しないからと言うことでしょうか。
0そうだね
プレイ済み
返信[14]
親投稿
Godot orz_127
>コータさん 自分もガイドブックは持っていて USE、EXECはみていたのですが… 確かにP67のCOMMON DEFの説明にありますね^^ 名前解決が済んでいて…なら 直接LOADでDを指定しても問題なさそうなのですが、Type missmatch になってしまう。 そこがちょっとまだ分かりません。 あと最初にある前の投稿とはomisubi▲さんの投稿でななく、うちのところのこれの前の投稿です。
0そうだね
プレイ済み
返信[15]
親投稿
Godot orz_127
OPTION STRICTが実行されないという話は、当方の前の投稿で、スマイルブームの小林さんからコメントを頂いていて、そこの「◎エラーとなる原因」の説明にあります。 COMMON DEFを使うにはUSE 別スロットのプログラムを実行するのがEXECという先入観もあって 回避方法としてのEXECのように読み取ってしまい、元々COMMON DEFを使用するにはEXECでも良いということがよみとれませんでした^^;
0そうだね
プレイ済み
返信[16]
親投稿
配列参照の代入は、文字列変数(文字配列)以外なら何でも代入出来るようです。従って、型情報は参照側ではなく実体側にあるように見えます。(見えるだけで実際にそうかは別ですが・・・)実体(配列要素)に値を代入するときに型のチェックをしているような気がします。配列要素数を自動で増やすようなときには特別な処理をしているように見えます。(COPYやPUSHなど)
0そうだね
プレイ済み
返信[17]
親投稿
Godot orz_127
小林さんのコメントの後に追加質問的なコメントをつけたのですが、解りにくくなってしまった気がしたので、改めて元々したかった事を表したサンプルを作って新たに投稿し直したしだいです^^;
0そうだね
プレイ済み
返信[18]
親投稿
私も思い込みがあって、メインルーチンからGOSUBで初期化サブルーチンを実行する必要があると思っていました。
0そうだね
プレイ済み
返信[19]
親投稿
小林社長の回答に反論するような形になりますが、STRICTは、少なくとも通常の変数について機能しているように見えます。理由は、ユーザ定義命令の中にも外にも宣言がないとエラーになるためです。
0そうだね
プレイ済み
返信[20]
親投稿
Godot orz_127
あれ? 文字変数の配列でも参照代入になりますよ。 日経ソフトウェア2015年4月号の特集2 プチコン3号スーパーテクニック18選の「小技05 プチコンにも“参照値”がある?!」の解説では、 DIM A$[3] DIM B$[3] で説明しています。 それとは別に文字列自体内部的には1次元配列な気します。 「?"ABC"[1]」見たいな使い方が普通にできるし、SHIFT()などの配列系の関数がつかえるし… 3.1.0での修正以降で文字列をINCで扱うとひどい目に会うしw
0そうだね
プレイ済み
返信[21]
親投稿
説明が悪くて済みません。 文字列配列と数値配列、さらに次元が異なっても参照の代入は出来ています。(仕様か否かは分かりませんが・・・)文字配列だけは、特別扱いのようです。
0そうだね
プレイ済み
返信[22]
親投稿
文字列は、ガイドブックで文字配列として使えることが、P131に書かれています。
0そうだね
プレイ済み
返信[23]
親投稿
INCの仕様は、よく分かりません。3.1版で不具合があったので、全て「+」で書き換えました。
0そうだね
プレイ済み
返信[24]
親投稿
Godot orz_127
確認しました。 この様に直すと12行目で未定義のエラーがでますね^^; あれれ?
0そうだね
プレイ済み
返信[25]
親投稿
Godot orz_127
p131にしっかり書いてありますね…。 文字列は1字要素の配列と言うようなことが^^; 情報ありがとうございます^^
0そうだね
プレイ済み
返信[26]
親投稿
ガイドブックは、とても役に立っています。誤植があるのと、実装と矛盾する点が少しありますが、スマイルブームさんに報告すれば、秘密結社プチコンで訂正を乗せてくれるので、それを見て書き込みしています。
0そうだね
プレイ済み
返信[27]
親投稿
Godot orz_127
クッキーさんのように 単体で別な物として動いたり 後ろにサンプルをつけて単体起動すると使用サンプルが実行される、みたいにしたいとなると やはり、ここはUSEを使いたい。 この投稿のやり方が仕様的にOKなら これでそれが出来そうなのですが…。
0そうだね
プレイ済み
返信[28]
親投稿
Godot orz_127
>コータさん ガイドブックよく読むとい色々書いてありますね。 ほとんど最後の索引からのリファレンス的な使い方しかしていませんでしたが^^; 暇を見つけてもう少しちゃんと読んでみようかと。
1そうだね
プレイ済み