[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 12/13 05:17 / Filesize : 519 KB / Number-of Response : 1084
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【QBASIC互換!?】FreeBasic【GPL】



1 名前:デフォルトの名無しさん [2006/02/08(水) 15:23:06 .net]
FreeBasic
ttp://www.freebasic.net/

建てたいって人がいたので勝手に建てた
後はご自由にどうぞ
俺は知らん

883 名前:関数に渡して
関数内部でinteger型のローカル配列10万個にコピーして
その合計を返す関数を書いたけど、オーバーフローにならなかったよ
流石に100万個の場合は警告出たけど

どのような最適化が行われているか分からんけど
GAS、GCCバックエンド共に問題なかった
[]
[ここ壊れてます]

884 名前:デフォルトの名無しさん [2016/10/14(金) 20:52:52.30 ID:c0NY+ezm.net]
>>821-822 こんなところ。
'MessageBox(TakaHWND, "Hello (rcPatsTypeReadSub07) " + Str(IAA), "Messagebox caption", MB_ICONINFORMATION)
IAA = rcPatsTypeReadSub07(FileNoLong2, PartsNameSU, PartsTypeString(), PartsTypeNoLong(), GRPnoSULong, GRPNo(), GRPnoPartsSU(), PartsNameString(), PartsNoListLong())

Function rcPatsTypeReadSub07(FileNoLong2 As Long, PartsNameSU As Long, PartsTypeString() as String, PartsTypeNoLong() As Long, GRPnoSULong AS Long, GRPNo() As Long, GRPnoPartsSU() as Long, PartsNameString() as String, PartsNoListLong() as Long) As Long

'(2016.10.12 発見) ここのどこかでハングする
Dim As Long IAA, IBB, ICC, IDD, GRPnoLong
Dim As String Astring, PartsNameString0
Dim As Long TopPartsSU, BotPartsSU, Line1SU, Line2SU, Line3SU, LineTsu1, LineTsu2
Dim As String PartsNameString1(), PartsNameString2(), PartsNameString3()

rcPatsTypeReadSub07 = 0
Print #FileNoLong2, ""
Print #FileNoLong2, "Function DispGRPinsideMove02(IDnoLongGRA As Long, ActionType As Integer, SpaceType As Integer, WidthPoint As Long, HeightPoint As Long, FullWidth As Long, FullHeight As Long) As Long"
(中略)
MessageBox(TakaHWND, "Hello (rcPatsTypeReadSub07 - 6) "+Str$(GRPnoLong)+"-"+Str$(LineTsu1), "Messagebox caption", MB_ICONINFORMATION)

885 名前:デフォルトの名無しさん [2016/10/14(金) 20:54:01.32 ID:c0NY+ezm.net]
>>823 のつづき。MessageBox()に挟まれた間の内容
' ここでハング GRPnoLong = 4: LineTsu1 = 14
Print #FileNoLong2, " PartWidth = (FullWidth \ 3) - WidthSpace: IF (PartWidth <= 0) then PartWidth = 0"
Print #FileNoLong2, " PartWidth1 = PartWidth: PartWidth2 = PartWidth: PartWidth3 = PartWidth"
Print #FileNoLong2, " WidthPoint1 = WidthPoint + WidthSpace"
Print #FileNoLong2, " WidthPoint2 = WidthPoint1 + WidthSpace + PartWidth1"
Print #FileNoLong2, " WidthPoint3 = WidthPoint2 + WidthSpace + PartWidth2"
MessageBox(TakaHWND, "Hello (rcPatsTypeReadSub07 - 7) "+Str$(GRPnoLong)+"-"+Str$(LineTsu1), "Messagebox caption", MB_ICONINFORMATION)

てなところ。プリント命令の途中でハングしている。

886 名前:デフォルトの名無しさん [2016/10/14(金) 20:56:20.03 ID:c0NY+ezm.net]
現在は、参照側 >>823
Function rcPatsTypeReadSub07(FileNoLong2 As Long, PartsNameSU As Long, PartsTypeString() as String, PartsTypeNoLong() As Long, (後略)

PartsTypeNoLong()
の内容がすべて 0 になるという現象が発生している。

887 名前:sage [2016/10/14(金) 21:34:14.16 ID:COkETlXd.net]
https://www.youtube.com/watch?v=NJYs5GTmdcg

https://www.youtube.com/watch?v=tY-xyCbzdqY

888 名前:デフォルトの名無しさん [2016/10/14(金) 22:31:50.42 ID:c0NY+ezm.net]
>>819 の内容がわからなかったのかな。
別ファイル(モジュール)だから、主ルーチンは存在しない。存在するのはすべてサブルーチンであるから、
Function 適当なルーチン(ActionType As Long)で、ルーチンが定義される。
「適当なルーチン」内で使用する配列
大きさ = 100
Dim 配列1() as long, 配列2() as String
ReDim 配列1(大きさ, 大きさ) as long, 配列2(大きさ, 大きさ) as String
2次元配列を用意しすると、新規に取得したMCB(メモリーコントロールブロック)に作られる場合とスタックに作られる場合があるが
一律 MCB として
1.配列1の所在・大きさを示すアドレス等が変数管理領域に新規登録されて
2.MCBで領域を確保、大きさ, 大きさ、の2次元配列を(数値だから)確保して使用する。

ところが、文字列の場合だと、
2.MCBに領域を確保、大きさ、大きさの2次元配列で、文字の保管場所のアドレスを保管する領域を確保する。
3.文字の保管領域(多くの場合にはスタック)にヌル文字であることを示す内容を保管する。
これは、処理系で異なり、単に文字列+&h0000(又は&h00、前者は2バイト文字対応の場合、後者が1バイト文字の場合)が存在する固定アドレスを保存する場合と、追加して文字長さを保管する場合、あるいは、文字長さのみを保管する場合がある。

MCBに保管しない場合で、全部スタックに保管する場合がある。
Redim 宣言時にヌル文字をスタックに書き出して、新規に文字変数が定義されたときには、スタックに新規に文字を入れて、古い文字を消さないで残している場合には、スタックが急激に消費される。
For IIA = 1 to 10
Astring = Astring + "1"
Next IIA
Astring = ""
の場合には、スタック内文字が消されている場合が多いが
For IIA = 1 to 10
Astring = Astring + "1"
Bstring = Bstring + "1"
Next IIA
Astring = ""
の場合には、スタックが全部残っている可能性がある。
ヌル文字で始まったとしても、2文字+&h00の4文字だから、4+5

889 名前:+...+14 =??? 、???* 2 =???スタックを食いつぶすことになる。 []
[ここ壊れてます]

890 名前:デフォルトの名無しさん [2016/10/14(金) 23:12:53.82 ID:c0NY+ezm.net]
逆汗したときに
-------------------------
(システム予約)|__(Pgソース)__|___(変数領域)___|___(スタック領域)___|(システム予約)
とメモリーが使われていた。文字の最大文字数が255で文字長さ1の合計256が最大値で
配列を作ると、スタック領域を移動して、スタック領域の後ろに文字領域を確保していた。
ここがいっぱいになってくると、突然GAP(ガーベージコレクション) https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3
を始めだす。
処理速度が急激に遅くなる場合と、高速な場合とがあり、処理速度が一定していない場合には、ガーベージコレクションを行っていると考えられる。
常に高速な場合には、カーページコレクションをしていないので、スタックあふれや、メモリーリーク
https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%AF
の可能性が出てくる。
このあたりの処理は、ユーザーに開放されていない場合が多いので
怪しいなと思ったらば、メモリーダンプ、再起動して継続処理をするようなユーザーソフトを組む必要が出てくる。

Free-Basic でGAP命令があるのかな?。使う命令しか見ていないので、わからない。

891 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 00:59:26.30 ID:+WAwTfPB.net]
コードを載せてもらっておいて何だけど、何をしている関数なの?全く見えてこない
言っちゃ悪いが、その引数の多さ、関数内での変数宣言の多さから見て
処理の汎化→関数化が成されていないコードにしか見えんよ
何で構造体使わんの?何でもっと他者が読みやすいコード書かないの?
読み難いコード≒難しことをするコードじゃないからさ

それとFreeBASIC標準の動的配列(redim)は
string型と同じように記述子を持って内部でAllocateして配列の要素を別に持つのよ
でも記述子のサイズが次元が増えると結構な大きさになる
その要素数に関わらず、1次元配列で32バイト、2次元配列で44バイトを消費する
例え、redim array(0,0)でも44バイト消費する

前のiniファイルの処理コードを観た時も思ったけど
無駄な処理を入れ過ぎな上に複雑に考え過ぎだわ
FreeBASICでなく、古いBASICでも、もっとスマートに書けるよ
大口叩いて申し訳ないが、今時のコードを勉強するべきだわ



892 名前:デフォルトの名無しさん [2016/10/15(土) 09:46:17.60 ID:WbjwIM/1.net]
>>829 わかるところだけ
>何で構造体使わんの?
 → バグ取りが終わっていない。構造体の使用はまとめに入ってから。下手に構造体を使うとバクの巣窟、無駄な領域の使用になるから。
構造体については、JIS で定義していないので、配列名の統一で対応することになる。

>関数内での変数宣言の多さ
Fotran やっている人ならば、10個ぐらい引数を使う処理は普通にやっていると思う。

>他者が読みやすいコード書かないの?  →  単純な処理の繰り返しにしているでしょう。

>観た時も思ったけど無駄な処理を入れ過ぎな 
 →  参照の前後で値が変わるという現象が見られたから、参照の前後で値が一致しているかを見るルーチンを追加している。これを残しておかないと、メモリー関係の障害の対応が取れなくなる。
ここに書き込んだ2件の障害は、メモリー関係だから、障害の特定ルーチンも関係してくる。

処理内容の複雑怪奇さは、V.B.の事象処理ルーチンの多さ
Private Sub Form_Resize()
Private Sub Label1_Click()
RedCtr1(0).Caption = "RdRegNs"
RedCtr1(0).ToolTipText = "Html ブラウザ関係情報"
RedCtr1(0).Visible = True
RedCtr1(0).Enabled = ABool
等を1つのルーチン(Function WndProc()) に押し込まなければならないわけで
移植対象となるルーチン(*.frm 数として500位)の多さから汎用性を優先することとなる。
まだ、単純作業でうんざ

893 名前:閧オたルーチンの書き換えルーチンしか描いてないから単純だけど、もう少し複雑/乱雑になる予定。

>もっとスマートに書けるよ
 → 「スマート」の意味が分からない。
https://kotobank.jp/word/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88-84913#E3.83.87.E3.82.B8.E3.82.BF.E3.83.AB.E5.A4.A7.E8.BE.9E.E6.B3.89
外観を優先した形態のことかな?。
移植性を優先している(単純な*.frmの移植以外にも複雑な*.frmの移植が控えている)。
[]
[ここ壊れてます]

894 名前:デフォルトの名無しさん [2016/10/15(土) 09:47:26.55 ID:WbjwIM/1.net]
>>830 つづき
>今時のコードを勉強するべきだわ
 → JIS-Basic の範囲になるべく収まるように描いている。
下手に変えると移植性が悪くなる(自分で発見できないバクが多発)ので、変える気はない。
例外処理を大量に入れているから、移植時の拡張(Asw = {0,1}で定義 → {0,1,2}で定義等)や
ここには記載してない処理の対応とか、ある。

895 名前:デフォルトの名無しさん [2016/10/15(土) 10:05:02.19 ID:WbjwIM/1.net]
>>829 何をしている関数なの?全く見えてこない
>>830 にちょこっと書いたけど、*.rc ファイルの内容を読み取って、
"#define " の内容を PartsNameString()とPartsID(), {1,...,PartsNameSU}/PartsNameTSU に保存
"BEGIN" から "END"の内容を PartsTypeString(), PartsTypeNoLong(), PartsNameErrFigLong(), MSPartsTypeString(), PartsStyleString(), PartsPointLong() {}/PartsNameTSU に保存
特異な動作をする "IDC_GRP", "IDC_RBN" の内容を分類整理。
前者が、PartsGroupFigLong(), PartsGroupNoLong(), PartsNoListLong()
後者が、RadioMaxID(), RadioMinID(), RadioListID(), RadioMaxPartsNameString(), RadioMinPartsNameString()
以上の内容をもとに、Function WndProc() に押し込む処理のうち Sub Form_Resize() 処理に相当する内容のうち
簡単な部分(単純作業して別の*.frmからコピーして作成したルーチン部分)を切り出して、ソースファイルを作る処理。

今回ハングしたのが、「ソースファイルを作る処理」中。

896 名前:デフォルトの名無しさん [2016/10/15(土) 10:23:21.65 ID:WbjwIM/1.net]
無駄なルーチンと一見思える処理の一つとして、正関数(?)と逆関数がある
関数とその逆関数を用意して、正関数を求めた時に同時に逆関数も求めるようにする。
両者に違いがあった時にいずれかの関数の間違いがあることがわかる。
処理が多少遅くなるかもしれないが、関数の間違いが簡単に見つかる。
定義域・値域の範囲はあらかじめしらべて、はねておく。
まだエラー処理ルーチンを作っていないので、入り口だけ用意してある。
"Case Elese"だけ用意してあるのが、この処理。
エラー処理ルーチンの名称が *.frm によって異なるので、汎用性を確保するうえでこれ以上はできない。

897 名前:デフォルトの名無しさん [2016/10/15(土) 10:43:17.27 ID:WbjwIM/1.net]
無駄なルーチンと一見思える処理の一つとして、ループバック処理がある。
これは、参照値をそのまま返す処理を呼んでいるが、正規の名称があるかもしれない。
食いつぶし処理 (A$ = Left$(OA$,1): OA$ = Mid$(OA$, 2) 等)をしている場合には当然だけど
普通の処理でも行っている。先頭がOで始まる変数の場合がこれ。
変数の食いつぶしがあったり、変数の誤書き換えが発生するような分量(30行超過を目安にしている)の時とか、
に用意している。
ルーチンの最後で一致しているかをみれば、食いつぶし処理の発見が容易となる。
障害が発生しやすい場合、過去に変数の食いつぶしが発生した場合には、食いつぶしの検出として保存して置き、エラーメッセージ表示のための変数として使用する。

Fotranで外部配列(HDD内の特定名のファイル)に保存していたら、無駄な処理・何をしているのかわからない処理・狂気な処理・混沌な処理として悪名高かった。
バグの発見がかなり容易になるので、便利。メモリーダンプともいう人がいる。

898 名前:デフォルトの名無しさん [2016/10/15(土) 11:52:35.53 ID:WbjwIM/1.net]
>>829
>その要素数に関わらず、1次元配列で32バイト、2次元配列で44バイトを消費する
ちょっと多いかな、と思ったんだけど
ken-crate.blue.coocan.jp/asm/486r.htm
セグメンドレジスタが16ビット、2バイト。
イン

899 名前:fックスレジスタが32ビット、4バイト。
浮動小数点レジスタが80ビット、10バイト。
合計、16バイト。Push-Pop命令が、32ビット単位だった気がする。合計14バイト。
数値と文字の配列を区別しないで、文字の配列のアドレスに数値レジスタを保管する、に統一するならば、倍の28バイト使うので
32バイトは普通じゃないのか?。
2次場合には、1次元配列になおして(乗算ルーチンがあるので処理が遅くなる)保存するFotran 方式ではなく、2次元として保管しているのであれば、6バイト増加するのは不思議ではない。
[]
[ここ壊れてます]

900 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 16:14:26.53 ID:+WAwTfPB.net]
>>830
移植性に対する見解の違いだな
君はコードをコピペして他言語に持っていった際に修正箇所が少ない事を指しているな

自分は汎化された小さな部品の役割が簡潔明瞭であり
その機能を1つのみ保有する部品の集合体であれば移植性が高いって考えている
手続き型言語なら関数がその部品ね、つまり言語の形態なんて関係ないのよ
例えば、ある機械があったとして、その機械の部品であるボルトとナットがあったとしようか
どんな形態だろうが材質だろうが、役割は「他の部品を留める」って明確だから
前にも言ったけど、FreeBASICはQBASICと互換性があるBASICの形態をしたC言語だから
JIS-BASICの規格に沿わせるのはFreeBASIC言語機能の大部分を使わないってことと同義だよ

スマートに書けるって言ったのもその部分
他者が読みやすいコード書かないの?って言ったのもその部分

901 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 16:30:08.92 ID:+WAwTfPB.net]
>>835
いやあ、動的配列の記述子内容を調べたもの
1次元配列なら
ポインタ、最初の要素ポインタ、バイト単位の配列サイズ、型のサイズ、次元数
要素数、下限インデックス、上限インデックス
ってなっている
次元が増える毎に要素数、下限インデックス、上限インデックス分の記述子領域が増える

32ビットでコンパイルしたら、それらは全て4バイトだから
1次元配列で32バイト、2次元配列で44バイト、3次元配列で56バイト、以後12バイトずつ増加
64ビットでコンパイルしたら、ポインタが8バイト、各サイズがinteger型なら8バイトになって倍増するね
だから関数内で動的配列を宣言したら、配列の内容関係なしにそれらのバイト数がスタック領域に乗るね

ここではレジスタとか関係なくね?



902 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 16:43:47.31 ID:+WAwTfPB.net]
>>834
言いたいことは分かるけど
メモリダンプって想定したエラーがでた際のメモリ状態を吐けば良い話で
絶えずモニタリングする必要無いんじゃないの?
デバッグ作業なんてデバッガ使えば良いし
使わなくとも処々で変数確認用にprint挟めば良い話だと思うけど?

>処理の汎化→関数化が成されていないコードにしか見えんよ
って言ったのも、あのコードならバグを大量に含むと思ったし
それを見つけ出すのも面倒臭いだろうなって思ったから

903 名前:デフォルトの名無しさん [2016/10/15(土) 21:28:10.42 ID:WbjwIM/1.net]
>>836
>に修正箇所が少ない事を指しているな
ご指摘の通りです。

>大部分を使わないってことと同義だよ
それで良いんじゃないの。
言語なんてものは、膨大な資産の継続の上に成り立っている。
C言語の資産はほとんど持っていない(雑誌別冊、C言語入門等の手入力部分位)から。
Basic の資産は、ライブラリーだけて、3-4MB。小さいソフトを除外して、ソースが1MBを超えるソフトは3本。
資源の関係で廃棄しなければならないソフト(例、ドットマトリックスプリンターの重ね書きで描くイラスト)や市販されなくなった市販ソフトの入出力ファイルの作成とか、は廃棄する予定。
DVD2-3枚に入っているはずだけど、自分で管理できなくなりつつある。
かなり捨てると思う。

>>837
>ここではレジスタとか関係なくね?
名称がさっぱりわからないけど、以前逆汗したBasic処理系の使っていたレジスタを80486に置き換えた。


904 名前:使われている変数の名称を知らないから、れじ゜すたで説明した。

>>838
>のメモリ状態を吐けば良い話で
その前を追っかけておかないと、ルーチンのどの部分が゜実行中かわからなくなる。
>デバッガ使えば良いし
デバッカーの操作が覚えきれなくて、使うのをあきらめた。Gebug.exe(debug.com)で、逆汗しか使わなかった。
操作を間違えて、ディスクをいくつか壊していらい、やめた。

>あのコードならバグを大量に含むと思ったし
こちらは問題なし。
親コードの方で正常実行することを確認して、親コードの変更部分を変数に書き換えただけだから。
ただ、動作試験用親コードと書き換え予定のファイルとは異なるから、こっちの方は調べていない。
こっちのバクの発見は、手間がかかるだろう。
[]
[ここ壊れてます]

905 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 21:41:46.73 ID:+WAwTfPB.net]
>>839
>言語なんてものは、膨大な資産の継続の上に成り立っている。
>C言語の資産はほとんど持っていない(雑誌別冊、C言語入門等の手入力部分位)から。

ああ、やっぱりこういう考えを持っているんだな
言語毎の資産なんて関係ないよ
C言語で書かれた古いコードであっても、それは他の言語の資産でもあるよ
自分はよくC/C++で書かれたコードを元にFreeBASICで書いている
そのコードが表す処理の移植であって、コードの移植じゃない

906 名前:デフォルトの名無しさん mailto:sage [2016/10/15(土) 21:51:04.09 ID:+WAwTfPB.net]
>>839
少なくとも、自分より君の方のが知識が豊富だし、経験も上だと思う
でも、失礼な言い方で申し訳ないが、レガシープログラマなんだよ
君の知識や経験が、古い思想や古い概念の接着剤でガチガチに固められちゃっている
失礼ながら、それを溶かして欲しいって思ったのよ

レガシープログラマを害悪として見る傾向がある
そういった人達の資産価値ってあると思ってんだよね
でも上記の通りだから全く生かされない
新しい言語(この場合FreeBASICね)を習得する気概があるなら
現在主流となっている思想や概念を取り入れるべきだと思ったのよ

正直な話、Staticおじさんみたいにはなってほしくないね

907 名前:デフォルトの名無しさん [2016/10/15(土) 23:02:42.20 ID:WbjwIM/1.net]
>>840
>そのコードが表す処理の移植であって、コードの移植じゃない
処理系の癖が覚えたころによくやる。V.B.へのコピーは5年ぐらいたってから始めた。
まだ全部コピーしていないので、Fotranのソフトがかなり残っている。
同僚か誰かが動作試験して、それを信じて、コピーしたものがほとんど。
処理系が手元にないので、動かすことはないと思う。
自分で手計算してみて、理解できない、と思った部分には手を出さない。
手計算の表がないと、バグが見つけられないから。

>>841
>思想や概念を取り入れるべきだ
そりゃ当然だ。
流行の最先端を追いかけ続けたけど、用語の違いを排除すると、大体同じような処理になる。
ポインター、という言葉が使われるけど、相当する語は、アドレスで
構造体が、同じく、ブロック。ただし、形動として使うと全く別の意味になる。
インデックスが、順番号か、特定のレジスタ(インデックスレジスタ)。
処理系で意味が変わってくるので、処理系ごとに違いを覚えなければならない。
ある程度のソフトが描けるようにならないと、このあたりは手を出せない。
というのは、10年ぐらいで消えてしまう場合が多い。
単に覚えるだけならば3か月もあれば十分だけど、自由に描けるようになるには2-3年かかる。
ちょっとしたソフトを作るのに1年ぐらい、機械の償却を6年として、3年ぐらいだから、3つぐらいソフトを描けるだろう。
ここで、機械が変わって、覚えなおすのに3年ぐらい、そして自由に描けるようになる。
3年間遊べるかというと、遊べないから、覚えなおす時間がなく、古い手法を使ったまま結果を出す(ソフトを描く)必要が出てくる。
これが、ソフトウェア業界で、簡単な対応方法として、高齢者の首を切る。首を切る理由として、処理系の新しい概念の導入が使われている。

「新しい概念の導入」が、情報処理関係では、導入できない人の解雇の利用にな

908 名前:チている。
機械が入れ替わるたびに、今までやっていた人が集団で解雇されてゆく。
解雇できるような大手企業だと良いんだが、中小零細だと、解雇したら人間がいなくなる。
30までに覚えられなければ、以後使えない。内容はわかるけど、描けなくなってしまう。
[]
[ここ壊れてます]

909 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 11:38:39.67 ID:RSdG5rFg.net]
>>842
>ポインター、という言葉が使われるけど、相当する語は、アドレスで
厳密には違う
ポインタはアドレスを格納してメモリ上の位置を指し示すもの

言語毎の思想や概念だけの話をしているのではなく、コーディングの話をしている
レガシープログラマはとかく古い習慣から抜け出せない
例えば、1つの関数に複数の機能を持たせたりする
その関数だけで数百行あったり、やたらと分岐が多かったり、無駄な処理を織り込んだりする
以前に書いた変数宣言と初期化の話も同じ
それらを論理的に指摘しても、自分の時代はこうだったから、それで良いのだって頑なになる

言語に関係なく、長い歴史の中でノウハウの取捨選択がされてきた
それらはデバッグし易く、移植性が高く、フローが追い易く、再利用され易く
改善されてきたノウハウなのであって、流行ではない

レガシープログラマが何故害悪なのか、今一度知ってほしいわ

君はStaticおじさんと非常に近い位置にいる
Staticおじさんをググる事をオススメするわ

910 名前:デフォルトの名無しさん [2016/10/16(日) 17:02:50.70 ID:9xwX5cNS.net]
>>843
>アドレスを格納してメモリ上の位置を指し示すもの
「格納」の意味が分からない。「メモリ上の位置を指し示すもの」はアドレスだから。

>1つの関数に複数の機能を持たせたりする
拡張?、「関数」だからサブルーチンではないよね?。
For-Next 等で配列を使う場合に、配列へのアクセスに時間がかかるので、一つの入力配列から求める値が複数ある場合に、一つにまとめる。

ただし、大容量の2-3次キャッシュを持っているCPUなら、
配列が2次または3次キャッシュに入る程度の大きさの場合
かつ
For-Next が1次キャッシュ又は2次キャッシュに収まる大きさの場合
には、For-Next を分ける。
1980年代の頭の良いコンパイラなら、どっちにするかを判断してやってくれるので、ユーザーが考えることではない。

>その関数だけで数百行あったり、
関数を作成するような場合には、100-1000行行く。ライブラリーを見つけてほしいのだが、ニュートン法や最小二乗法を使うとそのくらい必要になる。

>やたらと分岐が多かったり、
「やたら」の意味がよくわからないのだが、
文字を数字のように取り扱う場合には、直接コートに書いた方が簡単なんだが
文字配列を作って配列との一致を検出する
という手法を使う場合がある。外部記憶装置を使って、読みだして、、、という処理にする。

>それらを論理的に指摘しても、
論理に欠落がある場合が多い。
わたしの周辺の人物に限られる範囲では、一面的な見方しかできない人が良く使う言葉が「論理的」という言葉。

911 名前:デフォルトの名無しさん [2016/10/16(日) 17:04:29.55 ID:9xwX5cNS.net]
Staticおじさん
は。>>841 で指摘を受けたので検索させてもらった。辞書には記載がない。
dic.search.yahoo.co.jp/search?p=Static%E3%81%8A%E3%81%98%E3%81%95%E3%82%93&ei=UTF-8&fr=top_ga1_sa
日経の記事より
>「static」というのは、Javaのstaticメソッド のことです。
Java が普及し始めるころに、このことを指摘していた。ただ
「static」を使えば、簡単に使えますよ
というJAVA の普及に使われていた。
素人がチョコチョコと作るソフトでは「static」で十分だということでJAVAを普及させるために使われた。
日曜プログラマー(情報処理に関する専門的教育を受けていない人)の場合には、「Staticおじさん」で十分じゃないの。

>自分の時代はこうだったから、それで良いのだって
https://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E
>対して、日本では、長時間労働、下流工程での賃金の頭打



912 名前:ちなどにより35歳定年説がささやかれている。
と、「おじさん」だったらば、定年だから、「Staticおじさん」で十分し゛ゃないの。
生産現場にいないのだから。

Free-Basic で
何かのソフトを開発し販売しよう
なんて人はいないでしょう。
販売の場合には、商家が良品であることを検査して販売する義務が発生する(商法参照)。
良品を供給する義務がある方々ならば、ご指摘の通りなんだけど
「良品」であることを要求するから、商店からこのような方々は購入するはずです。
[]
[ここ壊れてます]

913 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 18:22:08.41 ID:RSdG5rFg.net]
>>844
アドレスはメモリ上の位置を表すもの
ポインタはメモリ上の「ある位置」を「指し示す」もの
アドレスを住所に置き換えたとしたら、ポインタはある地点の住所を書き留めたメモ

>関数の機能
それぞれの言葉を額面通り、しかも分割して反論を返さないでくれる?
関数には1つの機能だけを盛り込めば良く、それをやらないから数百行にもなる無駄に長い関数を書き
やたらと分岐の多い物が出来上がるって話なの
処理内容は簡単なのに、保守性の低い、クソ読み難いコードを生産するって話

例えば
1)テキストファイルをオープンしてその中から特定の文字の個数をカウントするコードを書いた場合
それらを1つの関数に収めちゃうのがレガシープログラマなのよ
その関数には、ファイルをオープンするって機能と特定の文字の個数をカウントする機能の2つが入っている
2)文字列型から個数をカウントするコードを書く必要がある出てきたら
レガシープログラマは、上記の「文字列カウント」の部分コードをコピペして新しい関数を作る
他の1)や2)以外の対象をした要件があった場合、そのコピペが繰り返される
もし、その「文字列カウント」のアルゴリズムにバグが有ったら
コピペされたコードを全て修正しなきゃいけない

それなら、ファイルをオープンして文字列型のバッファに文字列を格納する関数と
そのバッファから特定の文字をカウントする関数の2つを作るでしょ?
そうしたら、2)の要件も2つ目の関数で解決するでしょ
バグが有ったとしても、修正する箇所は1つで済む

914 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 18:29:31.08 ID:RSdG5rFg.net]
>>845
もう少しStaticおじさんのことを調べてStaticおじさんって言葉の本質を知りなさいよ
理解した上で機能制限をしたコードを書くのと理解しないで書くのとでは全く違う

君が個人で書いているなら何も文句はないし、好きにすれば良いよ
でも、コミュニティでそれをアウトプットするようなら話は変わってくる
Staticおじさんという言葉がプログラマ界隈で話題になったのも
そういった害悪なアウトプットをするからなのよ

915 名前:デフォルトの名無しさん mailto:sage [2016/10/16(日) 18:46:10.81 ID:RSdG5rFg.net]
で、話は>>841に戻る
せっかく君が持っている多くの「純粋な」知識や経験が全く生かされない
それは君自身の損失でもあるし、コミュニティの損失でもある

だから、そういった古い習慣(思想や概念)を取り払って欲しいのよ

916 名前:デフォルトの名無しさん [2016/10/16(日) 22:50:24.82 ID:9xwX5cNS.net]
>>846
>そのコピペが繰り返される
日経バソだったかな、日経はあまりにもバカ臭い内容だったので、1回代金を払った後はとっていない。
この手法を、最新の話題・技術として記載されていた。

日経パソは経営者向けの内容なので、管理職クラスの人がよく読み、まねをする。
そのうち現場が破綻する。破たんしたら、銀行が吸収合併の手続きを取る。
芋づるルーチンと呼んでいる手法で、サブルーチンコールを避けることで高速動作を確保する手法。
ご指摘の通り、保守に手間がかかるから、1回使ったら捨てる(結果に問題があっても手作業で修復する)、ソフトに多用される手法。

>文字列型のバッファに文字列を格納する関数と
これは、かなりメモリーを食う手法なので、重複起動しないタスクにしか使えない。
ファイルアクセスに時間がかかるので、
そのファイル関係の処理を全部まとめて、結果のみを保存する
ようにしないと、処理が早くならない。
複数機能を入れて結果をまとめて

917 名前:蜍L憶だけを使うように設計する。

>修正する箇所は1つで済む
逆もある。
一つのルーチンにまとめた場合「障害があるから、と直してしまう」と、どこかのルーチンの方で障害が出ることがある。
参照側で、変更ができるかどうか、いちいち検査する必要がある。
解析解が存在する場合だったらばともかく
鞍部問題や解の巣問題の場合には、発言力の強い人が勝手に変更してしまって、
その結果が他に影響が出る(バグの巣窟となる)という多々見られる。
かといって総当たり(等高線ともいう)をやったらば、遅くて仕方ないでしょう。
一つにまとめるか、分割するかは、解析解が存在するか否か、が目安
https://ja.wikipedia.org/wiki/%E8%A7%A3%E6%9E%90%E7%9A%84
>解析解: 問題が「解析的に解ける」とはその解が既知の函数や定数などを用いて閉じた形の式に表せることを言う[1]。対義語は数値解
[]
[ここ壊れてます]

918 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 07:54:12.54 ID:ioKnq3J9.net]
>>849
>これは、かなりメモリーを食う手法なので、重複起動しないタスクにしか使えない。
答えはNOだよ
ファイルから文字列を文字列型のバッファに読み込む
そのバッファを文字列カウントアルゴリズムに通す
その結果を出力する

この動作に使用されるメモリは、1つの関数内でやろうが関数を分けようが変わらない
なぜなら、何方にしてもバッファは必要であり
バッファを参照(あるいはポインタ)としてカウント関数に渡せば良いから

>一つのルーチンにまとめた場合「障害があるから、と直してしまう」と、
>どこかのルーチンの方で障害が出ることがある。
これも答えはNOだよ
バグを修正したからといって、その関数の使用先の修正の必要性はない
なぜなら、その関数の設計段階で期待される結果が決められているから

オブジェクト指向言語が主流になって設計の重要性が叫ばれているけれど
それに限った話ではなく、手続き型言語であっても同じこと
何を関数として汎化して切り出すか、それを設計段階で疎かにするから
無駄な読み難いコードが出来上がる

Staticおじさんの一連の騒動ををしっかりと調べた?
派生した話ではなく、その話題の発端となった話のことね
言っていることがまんまその人と同じなんだけど、危機感を持つべき事案だよ

919 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 08:11:13.23 ID:ioKnq3J9.net]
>>849
オブジェクト指向の話で申し訳ないが、このスライドを見てよ
少し極端な話ではあるけど、参考になると思うよ
ttp://www.slideshare.net/MoriharuOhzu/ss-14083300

この内容を額面通り受け取らず、手続き型言語において、この思考をどう活かせるか
慣れ親しんだ思考を取り敢えず横に置いておいて思考を巡らして下さいよ

理解を「出来る、出来ない」に関してアレコレ言うつもりはないけれど
理解を「しようとする、しない」の姿勢に対しては言わせてもらうわ
レガシープログラマは、新しい「もの」に対して拒絶的なのよ
そのくせ、新しい「物」を使いたがる
だけど、古いままの使い方を無理やりする

920 名前:デフォルトの名無しさん [2016/10/17(月) 18:44:10.12 ID:f7KVzbkf.net]
>>850 ちょっとこれから出るので、簡単にこたえられる事だけ。
>バッファは必要でありバッファを参照(あるいはポインタ)として
より、これはメモリーのバカ食いの手法。
市販機器にのせてある主記憶装置に十分な余裕があるときに限ってできる手法。
入力ファイルは処理が終了するまで変化しては困るので、占有する/コピーして使用する。
コピー先を外部記憶装置にするか、主記憶装置にするか、で、>>850 では、主記憶装置を選んでいる。

>設計段階で期待される結果が決められている
仕様書のあいまいさがユーザー側では多い。
また、古いソフトの転用があるときには、一部仕様の変更が発生して、両者に対応する必要性が出てくる。
色々なルーチンをデータベースに入れて、転用するという考え方もあるが、成功した例を近所では聞いていない。
直接ソフト業界に関係していないせいかもしれない。

>発端となった話
は見つからなかった。

921 名前:デフォルトの名無しさん [2016/10/17(月) 18:47:10.02 ID:f7KVzbkf.net]
ハングするソフトの作成に成功した。
AS03 → AS02, AS01 の3つのファイルを作成して
AS01 に限って
IAA = AS02_AAAA(TakaHWND , InValLing, RetValLong()) → IAA = 10
と書き換える。
'AS03.Bas
#Include "ASCom.bi"

Function AS03_AAAA(TakaHWND As HWND, InValLing As Long, RetValLong() as Long) As Long
Dim As Long IAA, IBB, ICC, IDD
IAA = AS02_AAAA(TakaHWND , InValLing, RetValLong())
AS03_AAAA =IAA
IDD = 0
For IBB = 1 To IAA
For ICC = 1 To IAA
DimDataLong2(IBB, ICC) = IBB*IAA + ICC
If (RetValLong(IBB, ICC) <> DimDataLong2(IBB, ICC)) Then IDD = IDD +1
Next ICC
Next IBB
ReDim DimDataLong2(IAA, IAA) As Long, RetValLong(IAA, IAA) as Long
ReDim DimDataString2(IAA, IAA) As String
For IBB = 1 To IAA
For ICC = 1 To IAA
DimDataLong2(IBB, ICC) = IBB*IAA + ICC
RetValLong(IBB, ICC) = DimDataLong2(IBB, ICC)
Next ICC
Next IBB
End Function



922 名前:デフォルトの名無しさん [2016/10/17(月) 18:48:21.62 ID:f7KVzbkf.net]
ASCom.bi の内容は以下の通り。
#include once "windows.bi"

Declare Function AS01_AAAA(TakaHWND As HWND, InValLing As Long, RetVal() as Long) As Long
Declare Function AS02_AAAA(TakaHWND As HWND, InValLing As Long, RetVal() as Long) As Long
Declare Function AS03_AAAA(TakaHWND As HWND, InValLing As Long, RetVal() as Long) As Long

Const DimDim As Long = 2
Dim Shared TakaHWND As HWND
Dim Shared DimDataLong1() As Long
Dim Shared DimDataLong2() As Long
Dim Shared DimDataLong3() As Long
Dim Shared DimDataString1() As String
Dim Shared DimDataString2() As String
Dim Shared DimDataString3() As String

923 名前:デフォルトの名無しさん [2016/10/17(月) 18:51:40.05 ID:f7KVzbkf.net]
チュートリアルの最初の頃と同じように、何もしない表示枠を作成して

ボタン(Button)3つ追加。
#Include "Mod/ASCom.bi"
Dim As Long IAA, IBB
Dim InValLing As Long, RetVal() as Long

Case IDC_BTN1
'
IBB = AS01_AAAA(TakaHWND,IAA, RetVal())
Case IDC_BTN2
'
IBB = AS02_AAAA(TakaHWND,IAA, RetVal())
Case IDC_BTN3
'
IBB = AS03_AAAA(TakaHWND,IAA, RetVal())
とやるとハングする。どこに追加するのかは、わかるよね。
わからなかったらば全部まとめてupするから知らせて。

では今日はこれで。帰りは酔っぱらっているから、会話にならないと思う。

924 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 19:34:55.84 ID:ioKnq3J9.net]
>>853>>854>>855
ざっとコード読んでみたけど、そりゃ上手く動かんだろうね

>Dim InValLing As Long, RetVal() as Long
ここで、RetVal()は動的配列を宣言して、その後関数に渡される
関数内の
>If (RetValLong(IBB, ICC) <> DimDataLong2(IBB, ICC)) Then IDD = IDD +1
   ^^^^^^^
この部分で配列RetValLong()を参照しているけど
RetValLong()の参照元の動的配列RetVal()は、まだ具体的な要素数でメモリを確保していない
redim RetValLong(IAA, IAA) as Longの場所が悪いね

925 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 20:05:26.95 ID:ioKnq3J9.net]
同様に>>854のグローバル配列も関数内でredimで領域確保していないな
>ReDim DimDataLong2(IAA, IAA) As Long, RetValLong(IAA, IAA) as Long
こいつらの宣言場所が悪い

まずさ、FreeBASICの言語機能を理解しようよ
言っちゃ悪いが、こんなの初歩だと思うんだけど…

926 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 20:28:00.52 ID:ioKnq3J9.net]
それとさ
サンプルコードなのだから取り敢えずいらない部分は削ぎ落とそうよ
やっていることは至極簡単なのに余計な部分が多々あるから読み難いよ

動くかどうか試していないけど、取り敢えずいらないものを排除したコード
変数iddが何に使うのか知らんけど、一応入れておいた

function AS03_AAAA(RetValLong() as long) as long
dim as long iaa = AS02_AAAA(RetValLong())
dim as long idd

redim DimDataLong2(iaa, iaa), RetValLong(iaa, iaa)

for ibb as long = 1 to iaa
for icc as long = 1 to iaa
DimDataLong2(ibb, icc) = ibb * iaa + icc
'' idd += -(RetValLong(ibb, icc) <> DimDataLong2(ibb, icc)) こういう書き方も出来る
idd += iif(RetValLong(ibb, icc) <> DimDataLong2(ibb, icc), 1, 0)
RetValLong(ibb, icc) = DimDataLong2(ibb, icc)
next icc
next ibb

return iaa
end function

927 名前:デフォルトの名無しさん mailto:sage [2016/10/17(月) 20:47:28.64 ID:ioKnq3J9.net]
>>858
補足
redimはそれが宣言された時点でその型のデフォルト値で初期化されるから
値を保持したいなら、Preserve使ってな

928 名前:デフォルトの名無しさん [2016/10/18(火) 21:56:55.45 ID:1JWqtMl4.net]
>>846
>アドレスを住所に置き換えたとしたら、ポインタはある地点の住所を書き留めたメモ
「住所を書き留めたメモ 」をアドレステーブル、中に書かれている「住所」をアドレスと呼んでいたのは、
機械語の限界が見えて(Winを使いだしてDebug.exeの使用を

929 名前:やめた)、来る前。

機械語に置き換えて考える癖が抜けないので、ポインターはアドレスだね。
機械語の場合、リロケートするのが*.comファイルなので、
アドレスといっても、相対アドレスの場合が多い。ポインターとの大きな違いはないと思われる。
[]
[ここ壊れてます]

930 名前:デフォルトの名無しさん [2016/10/18(火) 21:59:11.60 ID:1JWqtMl4.net]
リロケート(普通のOSの実行形式はこの形式)の意味は
https://kotobank.jp/word/%E3%83%AA%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%88-9856
リロケート禁止なシステムPGをやる人はいないと思う。

931 名前:デフォルトの名無しさん [2016/10/18(火) 22:54:11.09 ID:1JWqtMl4.net]
>>851
MoriharuOhzu/ss-14083300
見直しながら、気が付いたこと。これ、ゲームソフトの考え方だよね。某氏の母校の。

ゲームソフトでは、盗作(懐石ともいう)を防止する観点から、解析が困難なソフトを用意する。
大体同じて、ちょっとだけ違う、ルーチンを大量に用意して解析されないようにする。

言語になれていない間は、
三項演算子の使用は、開発初期の試験プログラムでは危険。
 理由は算術Goto文が消えたことを思い出してほしい。
Else 文は必須。
 想定外の異常事態の処理、致命的エラーの処理に接続する。これをしないと、原因不明のもっともらしい値が得られるが虚偽で原因の特定にやたら時間がかかる。
 バク取りが十分行われて、不要になれば、エディタの専用マクロ処理(Basicで組んでも良いけど)で一括削除すれば良いだけ。

スプール
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%97%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0
の使用は、スプーラの使用選定の問題、機種依存機能の問題等があるので、ある程度以上の能力のある人以外勧められない。
極端な場合、私が作ったソフトは、800*600 CRTディスプレーしか対応していません(他のディスプレイは持っていませんのて゜ソフトが作れません)、と個人では済ませてしまう方法がある。
しかし、スプーラーを入れると、スプールが対応しなければならないので、やたら面倒。



932 名前:デフォルトの名無しさん [2016/10/18(火) 22:55:59.03 ID:1JWqtMl4.net]
過去に作った作画ソフトで、初代がグラフィックディスプレーを使っていて、作画命令がタートルだった。
https://ja.wikipedia.org/wiki/LOGO
以後、処理系がタートルをさぼーとしていたので作画はタートルで処理・タートルで保存していた。
おかげで、V.B.で自前でタートルを作る羽目にあった。
色々ゴチャゴチャやったけど、APIを直接操作する特定の命令のルーチンを書いてきた。
自分で必要なルーチンはライブラリーで用意してあるから、これをAPIで対応させなければならない。
API関連が200位、ライブラリーの1/3位を占めている。
何の機能を用意して、何の機能を捨てるか、の取捨選択に迫られる。
慣れないと、この取捨選択は無理。できない。

FreeBasic でタートルをサポートしているのかな?。クラフィック関係までは手を出していない。
解の巣 (X-1)(X-1.1)(X-1.01)(X-1.001)中略 (X-1.?????1)=0 の解を求めよ
なんて時まで使わないから。使いだすのはちょっと先。

933 名前:デフォルトの名無しさん [2016/10/18(火) 23:17:04.53 ID:1JWqtMl4.net]
>>857
>んなの初歩だと思うんだけど…
そりゃそうだ。
問題は、原因不明の変数食いつぶしが発生しているから、
意図的に、変数食いつぶしを発生するようなソフトを書いてみた。

DIM ???()宣言後に???()に値を定義すると
実行時の例外を表示後停止しないで、ハングする
という仕様には参った。

ハングさせることに成功していないが、
構造体を宣言した後に構造体を構成する変数の一つを定義してから、引数に引き渡す必要がある模様。

makoto-watanabe.main.jp/freebasic/TutDynamicArrays.html
>多くの人々が、動的配列で苦労をしている
のもわかった。
エラーが表示されないで、ハングだから原因の特定にやたら手間がかかる。

>>858 >変数iddが何に使うのか知らんけど
例外の発生、つまり変数食いつぶしの発生を調べている。
IDD が1以上ならば、異常発生のメッセージを示すための物。

わざとおかしなソフトを書いて、暴走させて、どのような条件の時に暴走するか、を特定するのも
処理系を使用し始める時にすること。
分量が多くなってくると、訳が分からなくなるから
訳が分かる程度の少ない分量で、ハングさせることが必要になる。
余計な部分は、ある程度までできたらば、For-Next で回して、スタックを圧迫させるための物。
このルーチンを作っていないので、Const で定数にしておいた。

934 名前:デフォルトの名無しさん [2016/10/18(火) 23:43:13.10 ID:1JWqtMl4.net]
一つ思い出したこと。
処理系名がわからないのだが、Win95の頃のC言語で
サブルーチン(又はファンクション)の深さが10から16を超えるとハングする
という処理系があった。
そのため、サブルーチンコールを避けて、1000-3000行がざらな芋づるルーチンとしていた。

コンパイラー、特にスタック管理がよくないと、サブルーチンの深さでハングする。
画像データなんて使うと、MB単位でスタックに放り込むから要注意。

935 名前:デフォルトの名無しさん mailto:sage [2016/10/19(水) 00:16:50.83 ID:xkr0DzJS.net]
>>862
>見直しながら、気が付いたこと。これ、ゲームソフトの考え方だよね。某氏の母校の。
全く違う、大事なことなのでもう一回言う、全く違う
オブジェクト指向の考え方をここで説明することは到底無理なので
興味があったら独自に調べてよ
そういう返答がくるとは全く想定していなかったわ
本気にそういう認識する人いるんだな

>三項演算子の使用は、開発初期の試験プログラムでは危険。
?

936 名前:デフォルトの名無しさん mailto:sage [2016/10/19(水) 00:25:01.97 ID:xkr0DzJS.net]
>>864
>原因不明の変数食いつぶしが発生しているから
?、勘違いだと思うよ

>エラーが表示されないで、ハングだから原因の特定にやたら手間がかかる。
動的配列を知ってたら、ミスすることはないと思うけどね
まあ、標準の動的配列なんて余り使わないけどね
殆どの場合、静的配列で何とかなるし、new/delete使うし

>>865
>サブルーチン(又はファンクション)の深さが10から16を超えるとハングする
今も変わらないんじゃない?
そんなに多層に関数を呼び出すことないもの
それも設計の問題でしかないよ

937 名前:デフォルトの名無しさん [2016/10/19(水) 00:52:12.31 ID:q7KUmHuY.net]
>>867 >勘違いだと思うよ
>>652-655 参照。

>静的配列で何とかなるし、
良いね。10位で作成して、100位で使っていて、10000-50000位のデータがたまに送られてくる。

>多層に関数を呼び出すことないも
Quick Sort で再帰が5-6。
作った簡易電卓では、主ルーチンから、
1. 非常駐部マクロ実行の制御を呼び出して、
2. 常駐部通常実行ルーチンの呼び出し
3. 通常実行ルーチンから非常駐部のマクロ実行ルーチンを予備だす
4. 非常駐部のマクロ実行ルーチンから常駐部通常実行ルーチンの呼び出し(ここで再帰がかかる)
5. 常駐部通常実行ルーチンから、個別の非常駐部処理ルーチンを呼び出す
と、ここまでに5重使ってしまう。

quick Sort で5重ぐらい使ってしまうから、
合計20位ないとQuickSort ができない。複数キーによる整列をかけるから、さらに再起呼び出しがかかる。

938 名前:デフォルトの名無しさん mailto:sage [2016/10/19(水) 00:56:32.69 ID:xkr0DzJS.net]
まあ何というか、古い思想や概念を払拭出来ないから
知識が無駄になっているとしか言いようがないな
言語仕様の不理解、それを知識で補おうとするけれど
それが上手く生かされていないって印象だな

オブジェクト指向のスライドを提示したのも
手続き型言語でも有効な抽象化や汎化など考え方を理解してほしかったからなんだよね
あのスライドを見て、そういった認識しか出来ないってのは残念でならないわ

これまでのやり取りを振り返って思うことは
思考(思想も含む)と知識の切り離しが出来ていないから認識が不足するって事かな
だから、知識の提示に躍起になっていて、こちらの言い分への理解に努めようとしない
こっちは勉強になるけれども、もっと柔軟な思考を持った方が良いよ

思考がStaticおじさんと同等なのは本当に危機感持って欲しいわ

939 名前:デフォルトの名無しさん mailto:sage [2016/10/19(水) 01:09:20.38 ID:xkr0DzJS.net]
>>868
勘違いじゃないの
>>657で問題点上げているじゃない

>再帰
場合によっては利用するけれど
関数の再帰呼び出しはなるべくしないってのが一般的だと思うよ
再帰呼び出しを禁止するコーディング規約すらある
末尾再帰なら、普通にループ処理で実装可能だしね

940 名前:デフォルトの名無しさん [2016/10/19(水) 23:04:12.09 ID:q7KUmHuY.net]
>>869 こういうのがわかりやすい。
www.comp.tmu.ac.jp/shintani/japanese/openUniversity/node5.html
一般的に挙げられるオブジェクト指向の三大概念について考えて見ましょう.
継承 (親から受け継ぐモノがたくさんあれば楽?)
カプセル化 (細かいところは見せません・操作させません)
多態性 (問いかけに対する応答はオブジェクト自身が適切に判断)

>な抽象化や汎化など考え方を
>抽象化とは,ある物事(とその集団)から固有の特徴や共通部分を取り出す作業である
より、ライブ(ラリー)化することでしょう。
ライブ化は、今やっているような動作試験に使うルーチンではいくらやっても無意味。
お遊びソフトを何本か作ってみて、共通部分が見いだせるような、ルーチンの作り方を覚えないと、使えないし、
定番ソフトに使えるようなルーチンを作れるようにならないと、
ライブ化は無理。元々持っていたライブラリーの修正は別にして、
新規に作ったソフトが15+42個。42個はもう使うことがない、としたソフト。
15個の内1個が既存のライブラリーの動作試験で、新規は残る14個。
14個は、全部廃棄予定だね、使い道がない。
つまり、このままではライブラリーに登録(抽象化)することはない。

941 名前:デフォルトの名無しさん [2016/10/20(木) 19:46:24.79 ID:48/+sWie.net]
大域宣言について
'Dim AAAA()
'DimChk11D.bas(6) error 146: Default types or suffixes are only valid in -lang deprecated or fblite or qb in 'Dim AAAA()'
'Dim Shard AAAA()
'DimChk11D.bas(8) error 146: Default types or suffixes are only valid in -lang deprecated or fblite or qb, found 'AAAA' in 'Dim Shard AAAA()'
Dim Shared As Single AAAA()
とこれが、大域配列の宣言となる。
Dim As Single AAAA()
も可能ではあるが、Function で定義されるサブルーチンからの参照ができない。



942 名前:デフォルトの名無しさん [2016/10/20(木) 19:48:11.30 ID:48/+sWie.net]
Redim の使用例。Function WndProc()内ルーチンだけ記載「IDC_BTN1」をクリックしてからでないとハングする。
クリックした後だと、添え字(()内数値)が範囲外でもそのにまま通ってしまう。
Case IDC_BTN1
ReDim AAAA(10)
Case IDC_BTN2
AAAA(-1) = 1
Case IDC_BTN3
AAAA(0) = 1
Case IDC_BTN4
AAAA(1) = 1
Case IDC_BTN5
AAAA(10) = 1
Case IDC_BTN6
AAAA(11) = 1

Case IDC_BTN7
BBBB = AAAA(-1)
Case IDC_BTN8
BBBB = AAAA(0)
Case IDC_BTN9
BBBB = AAAA(1)
Case IDC_BTN10
BBBB = AAAA(10)
Case IDC_BTN11
BBBB = AAAA(11)
多分、Basic では、宣言がなくても、AAAA(10)の宣言があったものとして処理する、という処理系があるので、無前言でも使用できるように用意したルーチンだと思う。
全体が必要な人は知らせてくれ。D:\bas\Projects\DimChk11D\DimChk11D.bas 他をUPするから。

943 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 20:49:23.76 ID:tZ8NDPa6.net]
>>868
今時、オリジナルのQuickSortは使わんでしょ
メディアンキラーの数列問題あるし、最悪時間がO(n * n)だし
それこそ言う通りスタックオーバーフローの問題がある
一定の再帰深度に至ったらInsertionSortに切り替えたり
MergeSortとの複合だったりするハイブリッドなQuickSortが主流よ
一般的にはIntroSortの名前で知られている

>>871
その提示されたリンク先を見たら、その結論には至らないと思うけど?
自分も手続き型言語からオブジェクト指向型言語に

944 名前:w習を移したけど
根本的なコーディングの思考は両者共に変わらない
部品化して再利用と保守性を高めるコーディングが求められるのには違いがない
コーディングによる思考と言語に求められる思考は同列ではない

話は変わるけど、ライブラリをライブって省略する人始めて見たよ
[]
[ここ壊れてます]

945 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 20:53:50.31 ID:tZ8NDPa6.net]
>>872
>'Dim AAAA()
>'Dim Shard AAAA()
FreeBASICは静的型付け言語

>Dim Shared As Single AAAA()
>とこれが、大域配列の宣言となる。
>Dim As Single AAAA()
>も可能ではあるが、Function で定義されるサブルーチンからの参照ができない。
これ前にも指摘したよね
グローバル変数、スコープなどなど

946 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 21:00:34.59 ID:tZ8NDPa6.net]
>>873
>多分、Basic では、宣言がなくても、AAAA(10)の宣言があったものとして処理する
>という処理系があるので、無前言でも使用できるように用意したルーチンだと思う。
他のBASIC系がそういった処理であろうがなかろうがFreeBASICには関係ない
FreeBASICにはそれの仕様がある
勝手な解釈をしないで、マニュアル読みなさいよ

単純に範囲チェックをしていないだけ
何のためにlbound()やubound()が用意されていると思ってんの
範囲チェックは配列の外で独自にやる仕様なの

947 名前:デフォルトの名無しさん [2016/10/20(木) 22:31:20.44 ID:48/+sWie.net]
>>874
>一定の再帰深度に至った
以後知らなかった。

>ライブって省略する人始めて見たよ
ライブ(LIB)、ライブラ(libr)が省略語。
ライブラリー(library)を起動したときに表示されるコマンドプロンプトの読み。
LIB> とか LIBR■ とか表示された機械を使っていた。

>>875 今までの経緯をまとめただけ。
必ずハングするソフトを作成しておくと、以後の保守の参考になる。

>>876
>用意されていると思ってんの
こんな便利なもの Fotran6にはなかった。
Dim 実行時の範囲(the total number)を定義した変数(N,M,L とコピーNN, MM, LL)を残しておくのが、多くのFotran のライブ。
極端な言い方をすれば、
10次元とか20次元の数値を使うことになりかねないので、大域のDim実行を一つのフラグにまとめて初期化している。
初期化フラグをみて非参照側は、処理せずRteurnするか、処理をするかの判断をしている。
メニュー側は、Hide(SW_HIDE, SW_SHOW)とかの処理になる。
このあたりは全部省略した。

948 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 22:43:15.63 ID:tZ8NDPa6.net]
>>877
まあ確かに、LibraryをLibって省略するけど
日本語に訳した語句を文章に書く人も始めて見たよ
そういうのはなるべく元の英文で書いた方が良いよ
勘違いの元になるから

>こんな便利なもの Fotran6にはなかった。
FreeBASICマニュアルの熟読が必須だな

FreeBASICは手続き型言語が元だから
OOP言語の要素を取り入れてもその形態は変わらないと思う
C++に近い感じ
だけど、グローバル変数の使用は控えた方が良いね
大抵の場合、使わなくてもコードは書けるからね

949 名前:デフォルトの名無しさん [2016/10/20(木) 22:45:33.28 ID:48/+sWie.net]
古いC言語の資料で
構造体などの入力変数を、いつ、どこで、だれが、どのように、初期化するのか
はっきりしていない
との記載があった。
Dim as (適当な型名) (適当な変数)
で初期化されるのか、
(適当な変数).(適当な要素名) = (適当な値)
で初期化される(すべての要素に値が定義される)のか、
が見つからなかった。

大域の数値・文字変数の宣言は、
makoto-watanabe.main.jp/freebasic/ProPgErrorHandling.html
>エラーは、静かに無視され、コードの実行は、続きます。
というので、エラーコードの取得を目的に作った。
>コードは、ERR 関数を使って、次の行で、可能な誤りを処理するべきです。
だから、あえて、N等を使わないで実行させた。

950 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 22:57:31.91 ID:tZ8NDPa6.net]
>>879
FreeBASICの構造体、type ... end typeは
Cの構造体的な古い使い方も出来るけど、基本はOOPのクラスのように使う
クラスの初期化は、クラスが行う
FreeBASICではconstructor()の特殊メンバー関数が用意されている
この辺り、かなり覚えることが

951 名前:多くなるから、まだ手を出さない方が良いよ []
[ここ壊れてます]



952 名前:デフォルトの名無しさん [2016/10/20(木) 23:05:48.47 ID:48/+sWie.net]
古いC言語の資料で、
(For-Next, Do-Loop, While-Wend 等の)ループ処理で、途中からの飛び出し命令(Exit For, Exit Do)を使うと
スタックに関係変数が残り、メモリーリークの原因になる
同様に、サブルーチン(Exit Function, Exit Sub 等)でも起こりうる
For-Next はループ変数に終値を代入して飛び出すか、フラグを立てて内部処理をしないで回す、等の処理が必要
なんてのが、あったんだが、
ttp://www.slideshare.net/MoriharuOhzu/ss-14083300
では、やたら飛び出しを勧めている。

手持ちの流れ図作成ソフトでは、Exit Sub 等を理解できないので、ブロックIF文で末尾に飛ばしていた。
流れ図作成ソフトでチェックしていた非常駐部等の処理(Call モジュール名.ルーチン名)が出てきてないが
ReDim の処理の検査として、流れ図作成ソフトで変数の追跡をする関係もある。

953 名前:デフォルトの名無しさん mailto:sage [2016/10/20(木) 23:56:24.26 ID:tZ8NDPa6.net]
>>881
FreeBASICは関数やループブロックから飛び出しても問題ない
Gotoで飛び出しても大丈夫なくらい、きっちりと処理してくれる
C/C++でも問題ない

情報が古すぎるよ
N88BASICを思い出したわw
浦島状態なの?

954 名前:デフォルトの名無しさん [2016/10/21(金) 00:06:56.14 ID:5SWCZ9aM.net]
>>882 助かるわ。
>浦島状態なの?
近い。
V.B. 6.0の頃で金がなくてNetが買えなくて、ズルズル。
V.S. のお試し版を入れて、操作がさっぱりわからなくて、削除。
さっき、変な英語のメッセージが出たので、なんか残っているみたい。

N88は、3か月ぐらい使っていた。課長と隣課の係長が変なことを言い出したので、
N88は使うのをやめた。係長が使っていたけど。
N88はロードランナーに徹した。
リセッターになるべく見ていたけど、結局わからなかった。

955 名前:デフォルトの名無しさん mailto:sage [2016/10/21(金) 00:18:27.22 ID:AfigWPHq.net]
>>883
なるほど、こりゃ一苦労だな
もうね、君とのやり取りで、これまで自分が言ってきた数々のことを
何も考えずに信じて、頭空っぽにして一から学習した方が良いな

古い思想や概念を捨てきれない人って思ってたけど
単に時代の流れに取り残されただけなんだな(失礼)
Staticおじさんとはまた違うタイプだわ

せっかく学習する気になっているのだから
新しい思想や概念を新しい言語と共に習得して欲しいわ(本気で懇願するわ)
これは正にチャンスだよ

956 名前:デフォルトの名無しさん [2016/10/21(金) 00:54:30.23 ID:5SWCZ9aM.net]
>>877 の続き。
大域変数の宣言は

Sub CommonStringSet()

CommonStringSetFig = 1
Ierror = 0
Dim なんたらかーたら
Call あれれ.○×▼initialize
IF (Ierror = 0) then CommonStringSetFig = 2
End Sub

で初期化して

Sub なんか仕様()
IF (CommonStringSetFig = 0) then Call CommonStringSet()

IF (CommonStringSetFig <= 0) then
'未初期化、初期化ルーチンの障害等
ElseIF (CommonStringSetFig = 1) then
'初期化作業中
'あれれ.frmから参照がある場合等
ElseIF (CommonStringSetFig = 2) then
'初期化終了
else
'致命的障害・終了処理中
end IF
End sub

でやっていた。なんかの参考にして。ベン図
https://kotobank.jp/word/%E3%83%99%E3%83%B3%E5%9B%B3-8692#E6.97.A5.E6.9C.AC.E5.A4.A7.E7.99.BE.E7.A7.91.E5.85.A8.E6.9B.B8.28.E3.83.8B.E3.83.83.E3.83.9D.E3.83.8B.E3.82.AB.29
の場合分けを徹底しておかないと、不定の値で計算してしまう、なんて発見が困難な障害に出会うことになる。

957 名前:デフォルトの名無しさん [2016/10/21(金) 20:13:13.49 ID:5SWCZ9aM.net]
現在 556KB、500KB越で書き込みが一切できない板もある。
新スレを作る話

958 名前:をしていた方々、ヨロ。 []
[ここ壊れてます]

959 名前:デフォルトの名無しさん [2016/10/21(金) 20:25:40.68 ID:5SWCZ9aM.net]
こんなのを作ってみた。マルチモジュール。IDC_BTN1-IDC_BTN3でちょっと違う。連続して書いたらば禁止用語で引っかかった。
Case IDC_BTN1 → Case IDC_BTN2 → Case IDC_BTN3
Dim As Long IAA, IBB, ICC
IAA = 10: ICC = IAA
IBB = AAAA( IAA)  → IBB = AAAAByVal( IAA)  → IBB = AAAAByRef( IAA)
MessageBox(TakaHWND,

960 名前:デフォルトの名無しさん [2016/10/21(金) 20:27:41.63 ID:5SWCZ9aM.net]
途切れたので、途切れた部分から続き
MessageBox(TakaHWND, "Hello ("+ Str$(IBB)+") " + Str(IAA) +"/"+Str$(ICC), "Messagebox caption", MB_ICONINFORMATION)

同じくIDC_BTN4-IDC_BTN6でちょっと違う。
Case IDC_BTN4 → Case IDC_BTN5 → Case IDC_BTN6
Dim As Long IAA, IBB, ICC
IBB = BBBB(TakahWnd) → IBB = BBBBByVal(TakahWnd) → IBB = BBBBByRef(TakahWnd)

以下 D:\bas\Projects\DimChk11E\DimChk11E01.basの内容。
Function AAAA( IAA As Long) As Long
IAA = 5
AAAA = 8
End Function
以下、AAAA系統で、異なる点だけ。
Function AAAAbyVal(ByVal IAA As Long) As Long
AAAAbyVal = 8
Function AAAAbyRef(ByRef IAA As Long) As Long
AAAAbyRef = 8

961 名前:デフォルトの名無しさん [2016/10/21(金) 20:30:04.01 ID:5SWCZ9aM.net]
次にBBBB系統。
Function BBBB(TakahWnd As HWND) As Long
Dim As Long IAA, IBB, ICC
IAA = 10
ICC = IAA
IBB = AAAA( IAA)
MessageBox(TakaHWND, "Hello E("+ Str$(IBB)+") " + Str(IAA) +"/"+Str$(ICC), "Messagebox caption", MB_ICONINFORMATION)
BBBB = 9
End Function
違うところだけ
Function BBBBbyVal(TakahWnd As HWND) As Long
IBB = AAAAbyVal( IAA)
BBBBbyVal = 9
Function BBBBbyRef(TakahWnd As HWND) As Long
IBB = AAAAbyRef( IAA)
BBBBbyRef = 9



962 名前:デフォルトの名無しさん [2016/10/21(金) 20:41:44.32 ID:5SWCZ9aM.net]
要点は、Function なんたら() の引数の前置句を
無指定、ByVal, ByRef
の3種類用意した。
参照側 → 非参照側への値の引き渡しは、今回は試していないが、無指定で可能。
しかし、
非参照側 → 参照側への値の引き渡しは、ByRef のみ可能
という結論に達した。
makoto-watanabe.main.jp/freebasic/ProPgPassingArguments.html
で、
>これは、手続きは、手続きに渡された元の変数やオブジェクトを、変更できることを意味します。
と、主語が2つあるやや難解な日本語で説明されていた。

QBでは、どっちの方法をとっても、非参照側⇔参照側の相互引き渡しが可能であった。
これを発見するまでは、かなり苦労した。
Basic は、大域に全数値が置かないと、自由に変数をいじれない、という現実が立ちはだかっていたのである。
なるべく早く、フローチャート作成ルーチンを復活させないと、
引数で非参照側から参照側へ値を送っているルーチンがほとんど(無理やりSub → Functionに書き換えた)のルーチンが使い物にならなくなる。

963 名前:デフォルトの名無しさん [2016/10/23(日) 10:06:03.38 ID:xOvwZfT4.net]
構造体の初期化に関して、
手持ちのMIDIによるBEEP音が
'park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200707/07070177.txt
しかないので、これ関係。
'declare function midiOutOpen(byval phmo as LPHMIDIOUT, byval uDeviceID as UINT, byval dwCallback as DWORD_PTR, byval dwInstance as DWORD_PTR, byval fdwOpen as DWORD) as MMRESULT
より、
Dim midHnd As HMIDIOUT__
Dim ImidHndPTR As HMIDIOUT = @midHnd
Dim ImidHndPTRPTR As LPHMIDIOUT = @ImidHndPTR
を用意して
midHnd.unused = 0
If (ImidHndPTR <> @midHnd) Then
MessageBox(TakaHWND, "Hello (ImidHndPTR) 範囲外" + Str(ImidHndPTR)+","+Str$(@midHnd), "Messagebox caption", MB_ICONINFORMATION)
EndIf
If (ImidHndPTRPTR <> @ImidHndPTR) Then
MessageBox(TakaHWND, "Hello (ImidHndPTRPTR) 範囲外" + Str(ImidHndPTRPTR)+","+Str$(@ImidHndPTR), "Messagebox caption", MB_ICONINFORMATION)
EndIf
とやったらば、MessageBox()が実行されなかった。だから、構造体に値が入っているかどうかは別にして、
アドレス(ポインター)はDimで決定されるみたい。

964 名前:デフォルトの名無しさん [2016/10/23(日) 10:15:29.01 ID:xOvwZfT4.net]
MSの Replace()は、手持ちで類似ルーチンがあるので、類似ルーチンを使用して

MSReturnCode = midiOutOpen(@ImidHndPTR, MIDI_MAPPER, 0, 0, CALLBACK_NULL)
MSReturnCode = midiOutClose(@midHnd)
Private Function BeepMidiOut(ImidHnd As HMIDIOUT__, DataString as String) As Long
'ルーチン名の変更 Sub Midi_out() →

965 名前:Sub BeepMidiOut()
ImidHndPTR = @ImidHnd
ImidHndPTRPTR = @ImidHndPTR
MSReturnCode = midiOutPrepareHeader(ImidHndPTR, @lpMidiOutHdr, Len(lpMidiOutHdr))
MSReturnCode = midiOutLongMsg(ImidHndPTR, @lpMidiOutHdr, Len(lpMidiOutHdr))
で、コンパイルエラーはなくなった。

しかし、ハングする。今のところ、対応はわからない。
[]
[ここ壊れてます]

966 名前:デフォルトの名無しさん [2016/10/23(日) 14:27:32.03 ID:xOvwZfT4.net]
>>892 のつづき。
TakaDammyReturnCode = BeepMidiOut(midHnd, MdiMsg)
入れておく必要があるかな?。

機械の方のMIDIを見るべく、手持ちのMIDIファイルをエクスプローラーでクリック。
MIDI 音源がありません
とのこと。MIDI 関係はここで打ち切り。
Win 10, 32bit で動きそうな仮想音源があったらば、知らせてほしい。
検索で見つかったところは、
homepage3.nifty.com/3gatudo/mididl.htm
ぐらいで、
Microsoft GS Wavetable SW Synth
は見つからない。DirectXが入っていないのかもしれない。
SW−10
は、Nifの販促CD-ROM(2001)より。ソフトが起動してしまって、中身が見られなくて、スージーを使ってコピー。
起動したけど、動かなかった。
S−YGX50
は、ヤマハのサイトが見つからなくて試せず。

967 名前:デフォルトの名無しさん [2016/10/23(日) 20:38:27.04 ID:xOvwZfT4.net]
makoto-watanabe.main.jp/freebasic/tipsFileDialog.html#start
いじったことのある方へ。
当方 Win10, 32Bit で以下の障害メッセージが発生。
先頭から
'********************* Usage: *****************************
までを
D:\bas\Projects\File03\Mod\FL01SBCom.BI へコピー。
Function FileSelectFolder (Byref title As String = "Choose A Folder", ByVal nCSIDL As Integer, iFlags As ULong = BIF_EDITBOX, ByRef sz_InitialDir As String) As String
'D:\bas\Projects\File03\Mod\FL01SBCom.BI(91) warning 36(0): Mismatching parameter initializer, at parameter 3 (iFlags) of FileSelectFolder()
ret = SHGetSpecialFolderLocation(HWND_DESKTOP, nCSIDL, @bi.pidlRoot)
'D:\bas\Projects\File03\Mod\FL01SBCom.BI(101) error 180: Invalid assignment/conversion, at parameter 3 of SHGETSPECIALFOLDERLOCATION() in 'ret = SHGetSpecialFolderLocation(HWND_DESKTOP, nCSIDL, @bi.pidlRoot)'
ret = SHGetFolderLocation(HWND_DESKTOP, CSIDL_DESKTOP , NULL, NULL, @bi.pidlRoot)
'D:\bas\Projects\File03\Mod\FL01SBCom.BI(106) error 180: Invalid assignment/conversion, at parameter 5 of SHGETFOLDERLOCATION() in 'ret = SHGetFolderLocation(HWND_DESKTOP, CSIDL_DESKTOP , NULL, NULL, @bi.pidlRoot)'
CoTaskMemFree bi.pidlRoot
'D:\bas\Projects\File03\Mod\FL01SBCom.BI(135) error 180: Invalid assignment/conversion, at parameter 1 of COTASKMEMFREE() in 'CoTaskMemFree bi.pidlRoot'
以上、警告メッセージ1、障害メッセージ3が発生。

968 名前:デフォルトの名無しさん [2016/10/23(日) 20:46:42.61 ID:xOvwZfT4.net]
#Ifndef _FILE_HELPERS_WIN32
という、コンパイラに対する命令文の意味が分からず
C:\tool\FreeBASIC
"C:\FbEdit"
makoto-watanabe.main.jp/freebasic/
ではヒットしない。
誰かが、何かの条件で、どこかで決めているはずだけれども
search.yahoo.co.jp/search;_ylt=A2RA2EPKogxYJGMA2UIDdNt7?p=_FILE_HELPERS_WIN32&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=&oq=&afs=
では、本家と日本語サイトのみに記載有り。

969 名前:デフォルトの名無しさん mailto:sage [2016/10/23(日) 22:49:17.73 ID:LVHhfsuk.net]
>>895
#Ifndef _FILE_HELPERS_WIN32
#Define _FILE_HELPERS_WIN32
#Endif

そりゃそうだw
このマクロは「インクルードガード」だもの
これが何なのかはググってね

970 名前:渡辺真 [2016/10/23(日) 23:24:58.78 ID:jMLXBD1u.net]
>>893
>Win 10, 32bit で動きそうな仮想音源があったらば、知らせてほしい。

直接の返答にはなっていませんが、私の Win10 32bit では、下記を実行したら MIDI を再生できました。
makoto-watanabe.main.jp/freebasic/E

971 名前:xtLibfmod.html []
[ここ壊れてます]



972 名前:デフォルトの名無しさん [2016/10/24(月) 21:19:21.72 ID:sdyc/Oh5.net]
>>897 関連。
UsingFMOD_A_Tutorial.zip
の入手には成功。
使われているファイル、"fmod.bi"の所在が分からず、ネットを検索して見つからず。
ネットをfmod.dll で検索していたら、本体に入っているらしき文言があり、手持ちのファイルを検索したら
C:\tool\FreeBASIC\inc\fmod.bi に発見。
C:\tool\FreeBASIC\内を検索して、米国では普及している音楽ファイル *.mod の再生ルーチン
C:\tool\FreeBASIC\examples\manual\libraries\fmod1.bas
*.mp3 再生ルーチン
C:\tool\FreeBASIC\examples\manual\libraries\fmod2.bas
C:\tool\FreeBASIC\examples\sound\FMOD\mp3-player.bas
を発見した。
なお、www.fmod.org/ には課金情報の記載もあり、
英語が天才的にできない吾輩としては、API情報などの入手はあきらめることにした。

手持ちのMIDIによるBEEP音
'park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200707/07070177.txt
は、1バイトづつ送って再生するルーチンを使っているので、
ファイルを一括出力する
makoto-watanabe.main.jp/freebasic/ExtLibfmod.html
とは考え方に違いがあり、同様な使い方はできない。
MIDIファイルを大量に作成して、使うことが原則となる。
ファイル管理等のルーチン作成が必要になった。

なお、まだ音は出していない。
コンパイラーを通して、エラーが出なくなって、
常駐しない実行形式のファイルが作成できただけ。

973 名前:デフォルトの名無しさん [2016/10/24(月) 21:22:53.53 ID:sdyc/Oh5.net]
DIMの有効範囲について、次のように、
IFブロック内宣言をすると、IFブロック外で参照できない、
という仕様を発見した。

Function PlayMIDIfile1(ByRef ActionType As Integer) As Long
Dim As Long IAA, IBB
PlayMIDIfile1 = 0
If (IAA = IBB) Then
ActionType =0
Else
ActionType =1
Dim As Long Ptr IAAptr = @IAA
IBB = *IAAptr
'エラー発生せず
EndIf

If ( ActionType =1 ) Then
' IBB = *IAAptr: 'ここでエラー
'BeepFmod.bas(45) error 41: Variable not declared, IAAptr in 'IBB = *IAAptr'
EndIf
End Function

974 名前:デフォルトの名無しさん [2016/10/24(月) 21:34:57.84 ID:sdyc/Oh5.net]
>>896
www.slis.tsukuba.ac.jp/~fujisawa.makoto.fu/cgi-bin/wiki/index.php?C%2CC%2B%2B%A5%E1%A5%E2#c98802a3
ヘッダファイルなどが複数回読み込まれるのを防ぐのに#ifndefを用いる.
#ifndef _HEADER_H_
#define _HEADER_H_
ヘッダの内容
#endif // _HEADER_H_
ユーザーレベルで(プログラム作成者が)決定する内容なのね、
こりゃ、訳が分からぬ内容だわ。

975 名前:デフォルトの名無しさん [2016/10/24(月) 23:05:55.00 ID:sdyc/Oh5.net]
>>898 のつづき。
再生に成功した。正しい物理調律による不協和音の連続となる、MIDI再生。
安物の低性能スピーカーに対応した、MP3再生に。

MIDIは、
ファイル終了後繰り返し再生になって、制御が参照ルーチンに戻ってこない
という状態。
MP3再生終了後に、制御が参照ルーチンに戻る、
という状態。

前者を制御しているのが゜Sleep 命令らしい、というところまではつかんだ。
www.fmod.org/ ではゲーム音楽が主体という解説があり、何らかの手段でマルチタスク化、つまり、音楽再生を続けたまま制御が参照側に戻るという処理があるはずなのだが
UsingFMOD_A_Tutorial\basic_fmod_guide.txt
には、
If your needs extend beyond this tutorial, you are encouraged to explore additional FMOD calls and its documentation.
このチュートリアルを超えて使用する必要性がある場合は、FMODのマニュアルに追加されたのFMOD関係参照を調べることをお勧めします。
とあり、basic_fmod_guide.txtの英文解読が必要の模様。
FMODのマニュアルは会員制のため、英語が天才的にできない吾輩としては、あきらめる必要がある。

www.freebasic.net/wiki/wikka.php?wakka=Ke

976 名前:yPgSleep
と比較して、
http://makoto-watanabe.main.jp/freebasic/PgSleep.html
で気が付いたこと。

任意の旗。 通常の睡眠に対して、0 の値を与えます。
Optional flag; give it a value of 0 for a normal sleep,
より、日本語訳の「旗」、原文の「flag」は、ユーザーが指定するから、スイッチの意味と思わせれる。
「通常の睡眠」は、「通常のsleep(命令)」の意味でしょう。
「「深い」睡眠」、原文の「 a "deep" sleep」は、""が使われていることから辞書用語
https://kotobank.jp/ejword/deep
ではあまり使われない「5 (程度が)強度の, 極度の, 強烈な」の意味と思われます。
キー入力を受け付けない、ことを「deep」と表現しているものと思われます。
[]
[ここ壊れてます]

977 名前:渡辺真 [2016/10/25(火) 00:45:39.69 ID:wjYYOxoL.net]
>>898
>1バイトづつ送って再生するルーチンを使っている

ToneGrid - Playing MIDI Notes
www.freebasic.net/forum/viewtopic.php?t=21027

QB like PLAY plus more...
www.freebasic.net/forum/viewtopic.php?t=12995
が役に立ちそうですね。

978 名前:渡辺真 [2016/10/25(火) 00:50:54.71 ID:wjYYOxoL.net]
>>902
#include once "windows.bi"
#include once "win\mmsystem.bi"

type MidiMessage field=1
Number as UByte
ParmA as UByte
ParmB as UByte
Reserved as UByte
end Type

#define MidiSendMessage(MSGVAR) midiOutShortMsg(MYPLAYDEVICE, *cptr(integer ptr,@MSGVAR))
dim shared as HMIDIOUT MYPLAYDEVICE '// MIDI device interface for sending MIDI output
var FLAG = midiOutOpen(@MYPLAYDEVICE, MIDI_MAPPER, 0, 0, null)
if (FLAG <> MMSYSERR_NOERROR) Then
print "Error opening MIDI Output."
end If

Dim Shared as MidiMessage MidiMsg
MidiMsg.Reserved = 0
Sub NoteOn(channel As UByte, note As UByte, velocity As UByte)
MidiMsg.Number = &h90 + (channel And &hf)
MidiMsg.ParmA = (note And &h7f) 'NOTE
MidiMsg.ParmB = (velocity And &h7f) 'volume
MidiSendMessage(MidiMsg)
End Sub

Dim I As Integer
For I =1 To 50
NoteOn(0,I,127)
Sleep 200
Next I

979 名前:デフォルトの名無しさん [2016/10/26(水) 00:12:47.34 ID:iMPAbDCn.net]
>>902 現在、ソースリストを解読中。
midiOutOpen(@MYPLAYDEVICE, MIDI_MAPPER, 0, 0, null)
の戻り値が 2 となっているので、MIDIドライバーを入れない限りは動作不能。
本家を検索して、FMOD の定数の定義らしきものを発見。
#define FSOUND_LOOP_OFF 0x00000001 /* For non looping samples. */
等。
解読には時間がかかりそう。
MIDIは正確な物理調律をしているので、不協和音となりやすい。
だから、警告音としては最適なんだけど、現在使えない。

980 名前:渡辺真 [2016/10/26(水) 10:24:24.17 ID:zIa530P9.net]
>>904
>MIDIは正確な物理調律をしているので、不協和音となりやすい。

私の Win10 32bit では、
makoto-watanabe.main.jp/freebasic/tipsMIDI.html
の「QB like PLAY plus more...」の「BrazillianThemeMusic.bas」(PlayMidi.bas を含む。PlayFMOD.bas ではないので注意。)
を実行したところ、単音ですが音楽を再生できました。

981 名前:デフォルトの名無しさん [2016/10/28(金) 19:40:16.34 ID:zii2+97k.net]
MIDI ドライバーを入手することに成功した。
rksw.blog.fc2.com/blog-entry-14.html
Win8- 10 でMIDIが鳴らない人ならば試す価値があると思う。
coolsoft.altervista.org/en/virtualmidisynth

私が引っ掛かったのは「virtualMIDISynthの初期画面」で、
右上の「+」を押すとファイル選択画面になること、「十



982 名前:噬{タンで、」がわからなかった。

導入先が、C:\Windows\Win32\ 内固定なので、エクスプローラーの
「表示」でみられる、右上端のほうの「隠しファイル」にレ印を入れないと導入先が見つからない。
しかも、一旦エクスプローラーを終了して、再起動しないと、表示内容が更新されない。
「SGM-V2.01」の圧縮が 7-ZIPで
http://www.vector.co.jp/soft/dl/win95/util/se252429.html
2014.07.04に新バージョンになっている。
旧バージョンの2004年版を使っていたが、2004年版では解凍できなかった。
使っている操作ソフトは、以前はベクターにあったのだが、現在行方不明に付お知らせできません。
http://www.csdinc.co.jp/archiver/
で差がしてください。

>>903は音が出ました。
ドライバーの問題が解決したので、MIDI関係の進捗が見込めます。

NoteOn 関係を探してみたら
http://www.g200kg.com/jp/docs/tech/midi.html
を発見。
種類が多いので、ハンドDTM、つまり、BasicソフトでMIDI-Massige を送信しながらの作曲は、敷居が高そう。
高校の時に、合計2時間ぐらい作曲を教えてもらって、何曲か作ってみたけれど
オルガンで弾いても幽霊の登場シーンのような不気味な曲になる。
[]
[ここ壊れてます]

983 名前:デフォルトの名無しさん [2016/10/31(月) 20:43:37.20 ID:+6lHFHa+.net]
ちょっとMIDIから外れるのだが、
スーパーの文具売り場で、学校教育用カスタネット350円を買ってきた。
手持ちのオルガンと合わせて、作曲用機材はそろった。

984 名前:デフォルトの名無しさん [2016/10/31(月) 21:47:59.25 ID:+6lHFHa+.net]
Function midiOutLongMsg()の使用で、
lpMidiOutHdr.lpData = VarPtr(MLMsg(0))
lpMidiOutHdr.dwBufferLength = UBound(MLMsg) + 1&
と、連続する領域にMIDIデータを保存することが必要となる。
>>829 で指摘があった通り、配列を確保すると各要素に約40バイトの付属データが伴う。
つまり、MSが規定している MIDIHDR 構造体のlpMidiOutHdr.lpDataの示すアドレスからlpMidiOutHdr.dwBufferLength個の連続した主記憶装置にMIDIデータを保存するための領域が確保できないことを示している。

これ関係での動作試験。
Dim12SB1.bas に保存。DimChk12.basより参照。

985 名前:デフォルトの名無しさん [2016/10/31(月) 21:48:57.96 ID:+6lHFHa+.net]
Public Function StringPeek(ActionType As Long) As long
StringPeek = 0
Const LenZstring = 20
Dim As ZString * LenZstring AAzstring, BBzstring, CCzstring
Dim As String AAstring, BBstring
Dim As Long IAA, IBB, ICC
Dim As ZString Ptr AAzstringPTR

AAstring = ""
For IAA = 1 To LenZstring
AAstring = AAstring + Str$(IAA Mod 10)
Next IAA
AAZString = AAstring
AAzstringPTR = @AAZString
MessageBox(TakaHWND,"Hello ("+AAZString+")"+Str$(Len(AAzstring))+" , "+Str$(len(CCzstring)),"Messagebox caption",MB_ICONINFORMATION)
BBstring = ""
For IAA = 0 To LenZstring -1
IBB = Peek(UByte, AAzstringPTR + IAA)
BBstring = BBstring + Str$(IBB - &h30)
Next IAA
BBZString = BBstring
If (AAZString <> BBZString) Then
MessageBox(TakaHWND,"Hello ("+BBZString+") ("+AAzstring+")","Messagebox caption",MB_ICONINFORMATION)
Else
MessageBox(TakaHWND,"Hello ("+BBZString+")"+Str$(Len(AAzstring))+" , "+Str$(len(CCzstring)),"Messagebox caption",MB_ICONINFORMATION)
EndIf
End Function
とまー、何とか領域が確保できた。

986 名前:デフォルトの名無しさん [2016/10/31(月) 21:52:07.76 ID:+6lHFHa+.net]
今度は構造体での指定と、データ転送。
Zstring で&h00-&hFFのデータを取り扱えるかどうか、Poke で転送しなければならないのかは不明。
今日はここまで。

987 名前:デフォルトの名無しさん [2016/11/01(火) 19:56:19.86 ID:B69ilPhK.net]
Const MLMsgTSU = 64
Dim MLMsg() As UByte
Dim MLMsgString as String, MLMsgZString as ZString * MLMsgTSU
Dim As Long IAA, IBB, MLMsgSU
Dim lpMidiOutHdr As MIDIHDR: ' MIDIHDR 構造体
Dim ImidHndPTRPTR As LPHMIDIOUT
ImidHndPTRPTR = @ImidHndPTR: 'ImidHndPTR = @ImidHnd

IBB =

988 名前:Len(DataString): IAA = IBB Mod 2&
If (IAA <> 0&) Then DataString = Left$(DataString, Len(DataString) - 1&)
MLMsgSU = Len(DataString) \ 2& - 1&
If (MLMsgSU <= 0&) OR (MLMsgSU > MLMsgTSU- 3)Then
Else
ReDim MLMsg(0& To MLMsgSU): MLMsgString = ""
For IAA = 1& To Len(DataString) Step 2&
IBB =Val("&H" & Mid(DataString, IAA, 2&))
MLMsg((IAA - 1&) \ 2&) = IBB
MLMsgString = MLMsgString + Chr$(IBB)
Next IAA
MLMsgZString = MLMsgString
For IAA = 0& To MLMsgSU
If Asc(Mid$(MLMsgZString, IAA+1,1)) <>MLMsg(IAA) Then MessageBox(TakaHWND, "ZString("+Str$(MLMsg(IAA))+") と異なります"+Str$(IAA), "Messagebox caption", MB_ICONINFORMATION)
Next IAA
lpMidiOutHdr.lpData = VarPtr(MLMsgZString)
lpMidiOutHdr.dwBufferLength = MLMsgSU + 1&
lpMidiOutHdr.dwFlags = 0&
MSReturnCode = midiOutPrepareHeader(ImidHndPTR, @lpMidiOutHdr, Len(lpMidiOutHdr))
[]
[ここ壊れてます]

989 名前:デフォルトの名無しさん [2016/11/01(火) 20:03:22.69 ID:B69ilPhK.net]
で、音が出た。Dim MLMsg() As UByte の場合と音が同じ。
とすると、Byte型配列の場合には、テータが連続して存在するのかもしれない。
前は、Dim MLMsg() As Byte だったんだが、Srt$()で-120とかの負数が表示される。
このため、as Byte から As Ubyte に変更した。

出た音は、Win2000の頃の音とは異なる。どこが原因なのかは特定できていない。

990 名前:デフォルトの名無しさん [2016/11/01(火) 20:06:39.53 ID:B69ilPhK.net]
音量調節関係
Public Function BeepInfomation(ActionType As Integer, ByRef CurrentVolLeft As ULong, ByRef CurrentVolRight As ULong, ByRef IER As Long) As Long
'*-* 音量調節 'ActionType = {1;音量取得, -1;音量設定}
Dim BothVolumes As DWORD
Dim MSerrorCodeMM as MMRESULT

Dim WAVEOUT as HWAVEOUT__
Dim WAVEOUTptr as HWAVEOUT
Dim WAVEOUTptrPtr as LPHWAVEOUT
WAVEOUTptr = @WAVEOUT
WAVEOUTptrPtr = @WAVEOUTptr

BeepInfomation = 0
IER = 0
If (ActionType = 1) Then
MSerrorCodeMM = waveOutGetVolume(0, @BothVolumes)
CurrentVolLeft = LoWord(BothVolumes)
CurrentVolRight = HiWord(BothVolumes)
ElseIf (ActionType = -1) Then
BothVolumes = CurrentVolRight * &h10000 + CurrentVolLeft
MSerrorCodeMM = waveOutSetVolume(WAVEOUTptr, BothVolumes)
Else
IER = 10
End If
End Function
で音量変更ができた。次回はミュート関係の予定。

991 名前:717 mailto:sage [2016/11/02(水) 09:40:51.99 ID:LbzPwQ+w.net]
>>886
今回でいったん終わりの扱いでいい。
継続スレは要らないから関与しない。
要望が出ても俺は立てない。新しいスレが立っても不定期ROM化してる。



992 名前:デフォルトの名無しさん [2016/11/02(水) 20:04:49.63 ID:uE83Sw4M.net]
起動*.bas (Gr03.bas)で存在しないルーチン名
Declare Function Beep03SC_CommonStringSet(ByVal hWin As HWND) As long
を定義して
IAA = Beep03SC_CommonStringSet(TakaHWND)
と参照すると、
Gr03.o:fake:(.text+0x42): undefined reference to `BEEP03SC_COMMONSTRINGSET@4'
と、存在しないサブルーチンを参照しているとの警告メッセージ゜が出る。
リンカーメッセージだと思うが、ルーチン名が大文字になっているので気が付きにくい。

993 名前:デフォルトの名無しさん [2016/11/08(火) 21:40:52.96 ID:johYCdoD.net]
IAA = DispGRPinsideMove00(1, WidthDisp1, HeighDisp1, WidthPoint1, HeightPoint1)
の末尾に  as Long をつけて
IAA = DispGRPinsideMove00(1, WidthDisp1, HeighDisp1, WidthPoint1, HeightPoint1) as Long
と、末尾に修飾語をつけた場合のエラー
'File04.bas(77) error 3: Expected End-of-Line, found 'as' in 'IAA = DispGRPinsideMove00(1, WidthDisp1, HeighDisp1, WidthPoint1, HeightPoint1) as Long'
が発生する。 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


994 名前:デフォルトの名無しさん [2016/11/11(金) 00:12:50.40 ID:U4vU37r5.net]
ミキサー関係がさっぱりわからないので、他をいじり始めた。
Function (適当)(ByRef (適当な配列) as Long) as long
とやったらばエラーになった。
ルーチン内で数値を定義して返す変数を 一律 ByRef とする

995 名前:アとは問題がある模様。

'C:\FbEdit\Projects\Samples\FindFile\FindFile.Bas
をちょっといじったらば、じばけするようになった。原因の特定ができていない。

File04.rc タブをクリック、IDD_DIALOg をクリック、IDC_LiST1をクリック
一番上の行の、資源をクリック、言語をクリック
表示されたLanguage に JANG_Japanese を選択
Sub langauage を未指定

で緑の▼をクリック
C:\tool\FreeBASIC\fbc -s gui "File04.bas" "File04.rc"

Error!
Line 13 of Resource Script (File04.RC):-
Sub language cannot be higher than 3Fh:-
1

OBJ file not made

Make done
とエラーメッセージが発生する。
どこか間違えて、ファイルを配置している模様。
[]
[ここ壊れてます]

996 名前:渡辺真 [2016/11/11(金) 20:54:50.64 ID:AOIhEjGq.net]
>>917
>'C:\FbEdit\Projects\Samples\FindFile\FindFile.Bas
>をちょっといじったらば、じばけするようになった。

コメントを日本語にしてみました。
makoto-watanabe.main.jp/freebasic/tipsFindFile.html
お試し下さい。

997 名前:デフォルトの名無しさん [2016/11/12(土) 15:52:56.30 ID:fBKZn4cJ.net]
>>917 のつづき。
ディレクトリーボックス(だったかな)を作るべく、
IDC_TRV1 SysTreeView32 をFile01.rc に導入。
さて、値を定義しようとして、c:\FbEdit\*.rc, C:\Tool\FreeBASIC\*.rc
で、IDC_TRV1 や SysTreeView32 を検索したが見つからず。
search.yahoo.co.jp/search?p=SysTreeView32+OR+IDC_TRV+OR+TREEVIEW&aq=-1&oq=&ei=UTF-8&fr=top_ga1_sa&fl=0&x=wrt
てもそれらしきものは見つからず。
ファイル(ディレクトリー)選択ルーチンをどうしようかなというところ。

998 名前:デフォルトの名無しさん [2016/11/13(日) 23:54:50.63 ID:qSS9FuJA.net]
>>918
複写修正した内容を全破棄、再度作り直して
全角文字も表示できるディレクトリー一覧が作成できました。

現在、
特定のディレクトリーに限って表示する
中止ルーチンの削除(変数 hThread の排除)
親ディレクトりーの表示と移動
子ディレクトりーの表示と作成
選択ディレクトりー内のファイル作成
チルドレン(子プロセス)で参照できるようなライブ化
に向けて作業中。

999 名前:デフォルトの名無しさん mailto:sage [2016/11/14(月) 21:35:11.21 ID:A2iFoZHP.net]
QBASICに
PEEK POKEとマシン語呼び出しできる
機能はありますか?

1000 名前:デフォルトの名無しさん [2016/11/14(月) 23:03:05.89 ID:eAKgqUSA.net]
>>921 あったことは覚えているが、
制御を移す(ES:等の状態からQB使用値を取得する)方法がわからず
機械語の参照をしなかった。*.COMファイルをQBで作成(ハンドアセンブル)して
Autoexec.batやConfig.sys をQBで書き換えて、ドライバーとして登録して、Boot させて使っていた。

だから、答えられない。

1001 名前:デフォルトの名無しさん mailto:sage [2016/11/16(水) 13:11:13.73 ID:d7D9Ori4.net]
>>922
ESて何?



1002 名前:デフォルトの名無しさん [2016/11/16(水) 22:27:19.99 ID:rTqrc2OY.net]
>>923
ken-crate.blue.coocan.jp/asm/8086r.htm
ES エクストラセグメント・レジスター
    説明:DSの補助的なセグメント
DefSig(だったかな)でPEEK, POKEの対象セグメントレジスタを定義する。
通常は、
固定配置の文字列のセグメントとアドレスを指定し、POKEで命令を書き込む。
(命令忘却)で制御を移す。
「文字列のセグメントとアドレス」の取得方法がわからなかった。
また、CS:IP の指定方法もわからなかった。
そこで、Config.Sys にドライバーを定義して、マウス割り込みのInt (16?, 33?忘却)により道のルーチンをつけて、
機械語ルーチンが実行されるようにした。
PEEK でInt のアドレスが読み取れるので、ドライバーのアドレスもわかり

1003 名前:、制御可能になった。

1秒を下回る時間経過を取得するだけしか使わなかった。
1秒単位の時間は、TIME命令で取得可能なのでこちらを使っていた。
[]
[ここ壊れてます]

1004 名前:デフォルトの名無しさん [2016/11/17(木) 20:18:54.48 ID:PRY0yNKF.net]
FreeBasic では、ちょっと手の込んだ論理演算をすると警告メッセージが出る。
DBool =((wfd.dwFileAttributes And FILE_ATTRIBUTE_READONLY) >0)
EBool = (Mid$(ComFileAttributeString, 32, 1) = "1")
DBool = ((wfd.dwFileAttributes And FILE_ATTRIBUTE_READONLY) >0) And (Mid$(ComFileAttributeString, 32, 1) = "1")
DBool = DBool Or (((wfd.dwFileAttributes And FILE_ATTRIBUTE_READONLY) >0) And (Mid$(ComFileAttributeString, 32, 1) = "1"))
File01.bas(286) warning 38(0): Mixing operand data types may have undefined results

1005 名前:デフォルトの名無しさん mailto:sage [2016/11/17(木) 21:28:16.84 ID:oM0V2Zu8.net]
>>925
演算子のオペランドがboolean型と整数型をミックスしているからだよ
boolean型同士の演算のみ、boolean型が返る
それ以外は整数型が返る(-1:true, 0:false)

>Mixing operand data types may have undefined results
複数のデータ型のオペランドの混同において、未定義の結果になる場合がある
って警告を出してくれている

>論理演算
気になるなら、オペランドの型をキャストして揃えればよい

1006 名前:デフォルトの名無しさん [2016/11/19(土) 17:32:14.27 ID:7lQvEpwE.net]
>>926 前半の意味が分からなかった。
後半はなんとか。
www.sophia-it.com/content/%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88

DBool = (((wfd.dwFileAttributes And FILE_ATTRIBUTE_READONLY) >0) and (Mid$(ComFileAttributeString, 32, 1) = "1"))
ABool = ABool or DBool: DBool = (((wfd.dwFileAttributes And FILE_ATTRIBUTE_HIDDEN)>0) and (Mid$(ComFileAttributeString, 31, 1) = "1"))
(以下略)
なんて調子に変更した。

マルチモジュール対応の便利機能を発見。
適当なBasかBIファイルを FbEdit で編集状態にして
プロジェクト(p)
 Insert Selected as #Include
とクリックすると、編集画面の位置に#Include命令の一文が挿入される。

ライブラリーとして、
D:\bas\Projects\Kako02\Mod\Taka01b.bas を使うときに Taka01b.bas 内で
#Include "TakaCom1.bi"
とやると、D:\bas\Projects\Kako02\Mod\TakaCom1.bi を読み取る。

1007 名前:デフォルトの名無しさん [2016/11/19(土) 18:00:48.90 ID:7lQvEpwE.net]
FbEdit で上から4行目に表示されるファイル名をクリックして
離さずに、左右に動かすと、ファイルの表示の順番が入れ替えられる。

マルチモジュールにすると、分類の仕方にもよるが、10-20個のファイルを
ライブラリーや共通ルーチンとして使用する。
編集が済んだからと言って、外してしまうとルーチンが見つかりません、とリンカーと思われるメッセージが現れるので外せない。
右端の見えない位置に山積にしてしまうという、手法が使えるようになる。

1008 名前:デフォルトの名無しさん [2016/11/19(土) 20:30:39.66 ID:T/wP/yiF.net]
数年プログラミング言語やって気づいたことは、
ソースコードのほとんどは「覚えゲー」でしかない。
特にJava系はそう、自分のアイデアはなくひたすらきめまりきった
ものを書くだけだ。
その中で唯一頭を使って自分のオリジナリティを発揮できる
領域がある。
if() while() の () の中だ、for()があるのにwhile()も
あるのはこのためだ。
これはLinuxソースとか解読してるとガチ。
あと、いきなりプログラミング言語で何かしら作ろうとしても
思いのほかつまらない、其れよりはVim とかEmac

1009 名前:sをまず練習
する、
あとWikipediaエディタで、コードで複雑な数学のの書き方を覚える、
一見回りくどいようだがやってみればわかるけどこれがガチで面白い。
[]
[ここ壊れてます]

1010 名前:デフォルトの名無しさん [2016/11/20(日) 09:04:57.11 ID:M6Gp69qv.net]
>>920のつづき。
中止ルーチンの削除(変数 hThread の排除)
に成功した。されど、初期設定ルーチンが成功していない。

1011 名前:デフォルトの名無しさん [2016/11/20(日) 09:43:18.27 ID:M6Gp69qv.net]
>>929 
最近の言語はライブ化が進んでいるからそんなところかな。
16ビット整数演算までのライブで、16ピット超えの整数を取り扱う方法の宿題を出したらば
ライブに登録がなくできません
32ビット ライブを使って簡単にできるのになぜこんなことを要求するのか
と、出題の間違いを指摘する回答が目立った
なんて、話を何かで読んだ。
主題の意図は、論理変数の配列を使って無限な倍精度演算ルーチンを作れという内容なんだけど。

整数演算は比較的簡単に作れるけど、三角関数以上になると有効桁が取れなくて苦労する。
8087系を超える有効桁を求めるとかなりきつくなる。



1012 名前:デフォルトの名無しさん [2016/11/20(日) 09:44:02.32 ID:M6Gp69qv.net]
Vim たぶん
https://ja.wikipedia.org/wiki/Vim
Emacs たぶん
https://ja.wikipedia.org/wiki/Emacs
Wikipediaエディタ たぶん
https://ja.wikipedia.org/wiki/Wikipedia:%E3%83%93%E3%82%B8%E3%83%A5%E3%82%A2%E3%83%AB%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%83%BC
だろうけど、わたししゃ使いこなせないだろうな。

今はサクラ
https://ja.wikipedia.org/wiki/%E3%82%B5%E3%82%AF%E3%83%A9%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF
を使っているけど、使ったことがないメニューが半分を超える。
MSのEDLINE
https://ja.wikipedia.org/wiki/EDLIN

https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E5%B8%B3
がつかものにならなくて、自前で作ったけど低性能。
結局、いろいろ試して、物理制限がほとんどないサクラに落ち着いた。
フォートラン用のラインエディタ EDI.PG のサブセットぐらいの機能しか使っていない。

変な癖のある目倉うち、正規の
https://ja.wikipedia.org/wiki/%E3%82%BF%E3%83%83%E3%83%81%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0
ではなく(指がぶつかる・指が短くて届かない)、右手又は左手で書籍や紙をなぞりながら、反対側の片手だけを使って(キーボートの角に小指が親指をひっかけてホームポジションとする)、キーボートやディスプレイを見ないで
ひたすら紙だけを見ながら打ち込む方法で、この年まで乗り切ってしまった。

小脳や運動前野の学習が成立したら、簡単には打ち方を変えられないから、最初のエディタの選択には十分注意すること。
この使い方を一生背負ってゆくことになるから。

1013 名前:デフォルトの名無しさん mailto:sage [2016/11/20(日) 14:06:06.88 ID:4zKqcZHF.net]
当時流行したBASICはFORNEXTであっても複数文に
及んで機能していたわけではなく、それぞれ独立して機能していた
FORに対するNEXTではないというエラーメッセージがあるのが
その証拠である。
C言語のような括弧書きで複数行を纏める言語になってから
BASICはBASICではなくなっている。

1014 名前:デフォルトの名無しさん [2016/11/20(日) 23:01:51.93 ID:en+u1OOF.net]
www.dotup.org/uploda/www.dotup.org1068514.txt.html

現在使っている数値処理関係のリンク集です。
数学の話題が出たから、UPします。

現在はわかりませんが、かってはLISPの信者って結構いました。
https://ja.wikipedia.org/wiki/LISP
かってはLISPだけだったのです。無限倍精度演算が可能な言語は。

もし、数処理にあきたら、使える言語で無限倍精度演算に挑戦してみてください。
1学年後輩、3年先に卒業した人ですが、MS-DOSの機械語で無限倍精度演算に挑戦した人がいました。
原因は、
デカコンを使って計算していたら、4日たっても終了せず、5日目の朝に終了しました。
またされた情報処理関係教授に暴行を受けました。
それて、他学科のMS-DOS機(WinよりもUnixよりもはるかに速い)を借りて、無限倍精度演算を行いました。
リンク集には、類似の問題の解説が含まれています。

1015 名前:デフォルトの名無しさん [2016/11/20(日) 23:10:37.92 ID:en+u1OOF.net]
狂気の2桁2乗計算法
13*13 = (3*3) + 2 * (3 * 10) + 10 * 10 = 9 + 60 + 100 = 169
という(X + Y) * (X + Y) = (略)
となる、中学校か高校で習う公式を使った計算方法。
これを手計算で使うと、狂人認定となる。
sssp://o.8ch.net/jcf7.png

1016 名前:渡辺真 [2016/11/21(月) 00:30:17.07 ID:hydzNU9U.net]
>>934
>使える言語で無限倍精度演算に挑戦してみてください。

FreeBASIC では、任意精度計算ライブラリ(GMP)を使えます。
makoto-watanabe.main.jp/freebasic/ExtLibgmp.html

1017 名前:デフォルトの名無しさん [2016/11/21(月) 20:14:32.82 ID:o66uhtT9.net]
>>936 ライブ化が進んでいる。
80?87を使わないで、80?87を超える有効桁が取れる環境であってほしい。
今は、FreeBasic の雰囲気をつかむ、無茶な操作法を見つけ出す、ことで手一杯なので、そっちまで手が回らないけど
30番系統、30-36番のライブラリーが、無限倍精度のライブなので、これを廃止できるかもしれない。

>>920
チルドレン(子プロセス)で参照できるようなライブ化
の一つとして、
Xクリック終了を、異常停止。Button クリック終了を正常停止。
とするための「Button クリック終了」ルーチンが組めた。
詳しくは、
eternalwindows.jp/winbase/window/window05.html
参照。
Case IDC_BTN4
'MessageBox(TakaHWND, "Hello 終了処理", "Messagebox caption", MB_ICONINFORMATION)
'declare function PostMessageA(byval hWnd as HWND, byval Msg as UINT, byval wParam as WPARAM, byval lParam as LPARAM) as WINBOOL
MSReturnCode = PostMessage(hwnd, WM_CLOSE, 0, 0)
return 0

1018 名前:デフォルトの名無しさん [2016/11/22(火) 20:29:45.11 ID:y8LZzMie.net]
>>936 をみたら、三角関数などを求めるルーチンがないので、ヒントだけ
https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A4%E3%83%A9%E3%83%BC%E5%B1%95%E9%96%8B

1.マクローリン展開(テーラー展開の特異解?、高校の工業数学の教書には乗っていたはずmathtrain.jp/maclaurin )して、関数を級数に置き換える。
2.級数を計算する。
有効桁に注意 www.nagaoka-ct.ac.jp/~araki/s/sisoku.html
たしか、この前やった時には、COS()が不安定で泣いた。
7.2桁(単精度実数)で、50項から100項まで計算しないと誤差がひどい。

高速化するならば、近似解(ニュートン法)等いろいろある。
http: // ayapin-film . sakura . ne . jp /LJ/Docs/27th.pdf
愛用の方法は
jr4pdp.blog.enjoy.jp/myblog/picmicom/
三角関数は時間がかかると思われますので、sin()の0度から90度までを予め、PCで計算し、その結果を10000倍した数値を整数として、配列に記憶させ、sin(deg)はそのまま取り出し、cos(deg)はsin(90-deg)で取り出す事にしました。
とあるように、
計算値をファイルに保存しておいて、ファイルから値を読みだす
という方法。電卓並みの速度(1秒以下)が得られる。

1019 名前:デフォルトの名無しさん [2016/11/22(火) 23:55:18.03 ID:W05eTR51.net]
『電子計算機のための数値

1020 名前:計算法III』(「数理科学シリーズ 5」、培風館、1970)
には、三角関数に関する近似式がいろいろと掲載されています。
その中で、テイラー展開によるsinとcosの計算法があり、
ただ、三角関数の周期性を利用して|x|<π/2の範囲で計算すると
精度もよく、計算も速いと書いてあります。
それ以外に、最良多項式近似式も出ています。
いまでは、入手が難しいかもしれませんが、数値計算用サブルーチンを
作りたい人は一読の価値があるでしょう。
[]
[ここ壊れてます]

1021 名前:デフォルトの名無しさん [2016/11/23(水) 22:19:02.11 ID:V77GbOhM.net]
>>939 この本の話は、学生時代から聞いていて、何回か入手を試みたがすべて失敗。
一番近くの図書館が都内というありさま。
高校の副読本(線形代数・微積方程式等)ですら、公立図書館にはおいていない。



1022 名前:デフォルトの名無しさん [2016/11/23(水) 22:37:15.00 ID:V77GbOhM.net]
>>933 QBがらみで思い出したけど
For-Next ループ内で、Goto 先をNext の行番号にすると、おかしなことが発生したような記憶がある。
Nextで複数のループ変数をまとめないで、
一つのループ変数に対して一つのNext文を
拡張Doループは、GosubかCallか数値関数のみ
IF等を使って、あるいは、マルチステートのNext は暴走しやすいので、Nextは先頭に

なんてやっていた。

1023 名前:デフォルトの名無しさん [2016/11/23(水) 23:54:37.72 ID:qZZB3vTy.net]
>>929
全国の公立図書館は、お互いに本の貸し借りをする協定を結んでいますので、
お近くの公立図書館にない場合は、リクエストすると取り寄せてもらうことが
可能です。
もし都立中央図書館にあるならば、リクエストする際に都立中央図書館にありますと
伝えるといいでしょう。
国会図書館は全国の公立図書館に貸し出してくれますが、ただその場合
取り寄せてくれた図書館内での閲覧のみ、コピーは可能ですので、
借り出すことはできません。

1024 名前:デフォルトの名無しさん [2016/11/23(水) 23:57:30.39 ID:qZZB3vTy.net]
>>931
ねんの為に「日本の古本屋」で検索したら、3巻揃いが妥当な値段で出品されていました

1025 名前:渡辺真 [2016/11/25(金) 23:28:20.51 ID:tPNxGDnY.net]
>>938
>936 をみたら、三角関数などを求めるルーチンがない

本家の掲示板にプログラム例がありました。
www.freebasic.net/forum/viewtopic.php?t=23225
「new header file GMP」の2つめのコメント
by dodicat ≫ Jan 17, 2015 1:11
の中にあるプログラムです。

1026 名前:デフォルトの名無しさん [2016/11/27(日) 01:33:25.35 ID:xONUe7m9.net]
>>920 の
選択ディレクトりー内のファイル作成
チルドレン(子プロセス)で参照できるようなライブ化
の2点を除いて、作成終了。たぶん。
1-2回試しただけなので、本格的バグ取りはしていない。

リストボックスの特定の項目を「選択」にしていするには
Astring = left$(szDefPath, 1)
nInx = instr(ComDevString, Astring) - 1
IF (nInx < 0) then nInx = -1
SendDlgItemMessage(hWin, IDC_LST3, LB_SETCURSEL, nInx, Cast(LPARAM, @buff)): '単項目だけ選択可能なときに特定の項目を選択する
な調子で。「 Cast(LPARAM, @buff)」は何かあるかもしれないので、つけた。意味などはわからない。

V.B.のドライブボックス相当は作れた。
ComDevString(以下ではiDevString)の定義は、
iDevString = ""
For IAA = Asc("A") to ASC("Z")
DevString = chr$(IAA) + ":\"
IBB = getVolInfo(DevString, VSNoString, FlStmString, MaxPathLenLong, DevTypeLong)
IF (MaxPathLenLong = 0) then
'ドライブが存在しない
Elseif (DevTypeLong = 0) and (ActionType = 2)Then
else
iDevString = iDevString + chr$(IAA)
End if
Next IAA
な調子で収集。

1027 名前:デフォルトの名無しさん [2016/11/27(日) 01:42:35.88 ID:xONUe7m9.net]
Public Function getVolInfo(DevString As String, ByRef VSNoString As String, ByRef FlStmString As String, ByRef MaxPathLenLong As Long, ByRef DevTypeLong As Long) As Long
Const TakaSubRoutineNo as long = 3&
'*-* ボリウムシリアルナンバーとファイルシステムを取得する
'VSNoString (出)ボリウムシリアルNo
'FlStmString (出)ファイルシステム名
'MaxPathLenLong (出)最大パス長さ, 0;障害
'DevTypeLong (出) 0;(障害), 1;交換可能ディスク(FD/MOなど), 2;固定ディスク, 3;リモート or ネットワークドライブ, 4;CD_ROMドライブ, 5;RAMディスク, (他);未定義}

'Const MAX_PATH& = 260
Const FileSystemNameBufferLenULng As ULong = 32&
Dim RootPathNameString As String 'ルートディレクトリ
Dim strVolumeNameBuffer As String * MAX_PATH = space$(MAX_PATH) 'ボリューム名バッファ
Dim VolumeSerialNumberULng As ULong 'ボリュームのシリアル番号
Dim MaximumComponentLengthULng As ULong 'ファイル名の最大の長さ
Dim lngFileSystemFlagsULong As ULong 'ファイルシステムのオプション
Dim FileSystemNameBufferString As String * FileSystemNameBufferLenULng = space$(FileSystemNameBufferLenULng) 'ファイルシステム名を格納するバッファ
Dim As Long IErrorLong
Dim As String AAString

1028 名前:デフォルトの名無しさん [2016/11/27(日) 01:46:06.53 ID:xONUe7m9.net]
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
getVolInfo = 0

RootPathNameString = Left$(DevString, 2) & "\" + Chr$(&H00)
AAString = ""
IF (Mid(RootPathNameString, 2,1) <> ":") then
AAString = AAString & "(" & RootPathNameString & ")" & "デバイスの指定がありません。"
else
IErrorLong = GetVolumeInformation(RootPathNameString, strVolumeNameBuffer, MAX_PATH, @VolumeSerialNumberULng, @MaximumComponentLengthULng, @lngFileSystemFlagsULong, FileSystemNameBufferString, FileSystemNameBufferLenULng)
IF (IErrorLong = 0) then
'障害発生
end if
If (lngFileSystemFlagsULong) Then
'(2005.09.05 済) Sub getVolInfo() ボリウムシリアルNoを4桁から8桁に変更
VSNoString = NHexStringUL(VolumeSerialNumberULng, 8): 'ボリウムシリアルNo
FlStmString = NulCatString(FileSystemNameBufferString): 'ファイルシステム名
MaxPathLenLong = MaximumComponentLengthULng: '最大パス長さ

If (lngFileSystemFlagsULong And FS_CASE_IS_PRESERVED) Then AAString = AAString & "ファイル名大文字小文字維持"
If (lngFileSystemFlagsULong And FS_CASE_SENSITIVE) Then AAString = AAString & "ファイル名大文字小文字区別"
(中略、こんな調子で、属性フラグを作成しているのだが、ロボットチェックに引っかかってかけないんだわ) 

1029 名前:デフォルトの名無しさん [2016/11/27(日) 01:47:29.12 ID:xONUe7m9.net]
If (lngFileSystemFlagsULong And FILE_SUPPORTS_SPARSE_FILES) Then AAString = AAString & "スパースファイル"
If (lngFileSystemFlagsULong And FILE_VOLUME_QUOTAS) Then AAString = AAString & "ディスククォータ"
Else
' エラーを表示
AAString = AAString & "(" & RootPathNameString & ")" & "属性は取得できません。"
VSNoString = ""
FlStmString = ""
MaxPathLenLong = 0&: '(2008.05.30 済) Sub getVolInfo() 障害時に0を返すように変更
EndIf
EndIf

IF (Mid(RootPathNameString, 2,1) <> ":") then
IErrorLong = 0
else
'declare function GetDriveTypeA(byval lpRootPathName as LPCSTR) as UINT
IErrorLong = GetDriveType(RootPathNameString)
EndIf
DevTypeLong = IErrorLong - 1&
If (DevTypeLong < 0&) Then DevTypeLong = 0&
End Function

1030 名前:デフォルトの名無しさん [2016/11/27(日) 11:56:15.91 ID:lZFUoVdV.net]
>>944
Function equals overload(a As mpf_t,b As mpf_t) As Integer
のように、型「mpf_t」をどこかで定義している模様。手持ちのFreeBasic 関係ファイルには未発見。

検索では、
math-www.uni-paderborn.de/~aggathen/vorl/2004ws/sem/markus-steinborn.pdf#search=%27Type+mpf_t+gmp.bi%27
www-it.sci.waseda.ac.jp/teachers/w405201/CPR2/cprogram15.pdf#search=%27mpf_t+gmp.bi%27
がヒット。
前者はドイツ語なので、英語よりも理解できない

1031 名前:度の語学力なので詳細不明。
後者は日本語ですが、C言語の解説です。記載頁64, アクロバット67頁右段に
>任意精度の整数・有理数・実数をサポートしています.実数型はmpf_tと宣言します.
とあり、BIファイルを見つけてFreeBasic用に変換しないと使えないでしょう。

>この不正確さを払拭するには,エネルギー保存が満たされるような常微分方程式の解法アルゴリズムを採用するといった手段が王道とされています.がしかし,精度を100桁くらいに増やして計算してみるといった力技も捨てがたい魅力があります.
とあるように、
数学や物理を専門としない人(数学を専門としない人々)にとっては、力技に頼るしかない。
数学なんて、難しくてわからないから、多倍精度演算で、小中学校で学ぶ範囲の数処理を使って、えぃ!ゃー!、とやる方法です。
[]
[ここ壊れてます]



1032 名前:渡辺真 [2016/11/27(日) 21:40:18.83 ID:22yXElOy.net]
>>938
>936 をみたら、三角関数などを求めるルーチンがない

日本語訳を追加しました。
makoto-watanabe.main.jp/freebasic/tipsGmpFunctions.html
翻訳していて、内容のすごさに感激しました。

1033 名前:デフォルトの名無しさん [2016/11/29(火) 21:43:47.63 ID:MxHdA4L3.net]
>>920 の
選択ディレクトりー内のファイル作成
が作成終了。
残るは、ライブ化。

>>950
中身を試してみることはやっていませんが、
LISPでコケるのが、多倍精度演算ルーチンの作成で、多くの人々が数値計算から去ってゆきます。
>採用するといった手段が王道
なんてことは、デカコンがいくらでも使える人々ならやっているわけで
素人同然の学部生ができないのです。
一部の人間だけが独占して、てかい面している(暴行すらも許される)世界です。
高卒程度のズブのド素人が、数値計算の世界に手を突っ込めるということは、素晴らしいことです。

母校の情報処理関係学科の定員は45名、卒業生は1桁。30名以上が毎年中退してします。
同級生の奥様も、役人やっている通称お姉さまも、結局中退しました。
数値処理の世界を多くの人々に広げられれば良いですね。

1034 名前:デフォルトの名無しさん [2016/12/01(木) 21:57:52.24 ID:FgpY/gwj.net]
コマンド行、実行形式のファイル名の後に付ける修飾語、コマンドラインについてなんだけど
makoto-watanabe.main.jp/freebasic/PgCommand.html
スイッチ命名法が慣れ親しんだ 360とは異なる。
360 では、
/ スイッチの先頭を示す記号で、その後スイッチがついて、修飾語が必要な場合には:て゛区切って、空白で終わる。
/Switch:9999
スイッチの前に目的語が付く。
たとえば、実行形式のTARA.PG を起動するときに
Tara.PG /PI:20 と優先度20で実行する。
末尾指定のスイッチ。

FreeBasic では、
-x foobar.exe -m baz foo.bas bar.bas baz.bas
と先頭指定なんだよ。

スイッチの解釈ルーチンをどうしよう?。
なれていないから、スイッチの文法がよくわからぬ。
コンパイルのコマンド行は、多分作成できない。
FbEditでも、スイッチの指定をいじるとまともにコンパイルされない。

1035 名前:デフォルトの名無しさん [2016/12/01(木) 22:40:35.97 ID:FgpY/gwj.net]
>>952 でスイッチの解釈が問題になった理由
pepper.is.sci.toho-u.ac.jp/index.php?plugin=attach&refer=%BB%B3%C6%E2%A4%CE%BC%F8%B6%C8%A4%CE%A5%DA%A1%BC%A5%B8%2F11%BD%A9%2F%A5%AA%A5%DA%A5%EC%A1%BC%A5%C6%A5%A3%A5%F3%A5%B0%A5%B7%A5%B9%A5%C6%A5%E0&openfile=ss_04.pdf
#search=%27%E8%B3%87%E6%BA%90+%E5%8D%A0%E6%9C%89+%E8%A7%A3%E6%94%BE%27
がわかりやすいかな?
ファイル選択ルーチンをライブ化すると、複数のタスクから要求が来るわけで、
一つのタスクが終了するまで、他のタスクからの要求を排除しなければならない。

File01.exe がファイル選択ライブで、
作業指示ファイル File01.ini に処理の詳細を記載して、File01.exeを子プロセスとして起動する。

File01.ini のフラグを見て、使っていないのであれば使用する、とするフラグを立てて、実行する。
FreeBasic では、子プロセスが終了するまで待ち状態になる起動方法がサポートされているので、タスクの切り替えはシステム任せとなる。
ユーザーである File01.exe が起動されたときに、
非特権ユーザーからの起動では、ファイルを選択して終了、だけで済むのだが
特権ユーザーからの起動では、ファイルを選択するという作業をしないで、待ち状態の管理をしなければならない。
「待ち状態」の管理、つまり、
File01.ini の全削除
File01.ini の占有情報の破棄
File01.ini の異常値(他のユーザー(タスク)に開放するから、異常値を指定される場合もありうる)の修正
あたりをしなければならない。
特権で起動されたのか、一般として起動されたのか、を区別するために、スイッチが必要になってくる。

スイッチを昔ながらの360方式(すでに作成済み、変数名を修正したら動いたライブに入っている)を使うか、
FreeBasic 方式に合わせたスイッチを指定するようにするのか
が今迷っている内容。

1036 名前:デフォルトの名無しさん [2016/12/01(木) 23:46:44.16 ID:FgpY/gwj.net]
>>950 gmp 6.1.0(gmp-6.1.0.7z) ?? かな https://www.mediafire.com/?5y8d3rqwyx32ocv
users.freebasic-portal.de/frisian/GMP/gmp.7z 内に入っていた ReadMe.txt の日本語解読。

gmp.h.org
The orignal .h file produced by GCC
GCCが作成した本来の.hファイル

gmp.h
The edited .h file that was used for FBfrog
FBfrogが使用可能になるように編集した.hファイル
(「FBfrog」は、FreeBasic 関係の何かのソフトっぽい。)

Online code was removed since it will not work in FreeBasic
FreeBasicでは動作しないため、オンラインコードが削除されました

gmp.bi.fbfrog
The .bi file produced by FBfrog from gmp.h
gmp.hからFBfrogによって生成された.biファイル

gmp.bi
The final file with some alterations and additions
複数の変更や追加を経た最終ファイル

libgmp.a
Static libary file of GMP build with: --disable-shared --build=i486-pc-mingw32
「--disable-shared --build=i486-pc-mingw32」を使ってビルドされたGMP静的ライブラリファイル
Passed all checks
すべての検査が終了した。

1037 名前:デフォルトの名無しさん [2016/12/01(木) 23:48:07.06 ID:FgpY/gwj.net]
>>954 のつづき。
Make tuneup failed (complaints about missing file)
調整には失敗した(不足しているファイルについての問題)。

test_gmp.bas
A (sort of) program I made to test the new header file, don't take it to serious.
新しいヘッダファイルをテストするために作った(ある種の)プログラム。 複雑にしないでください。

D:\FreeBASIC-1.00.0-win32
+--bin
+--doc
+--inc <== bmp.bi needs to go here (rename or save the old gmp.bi file if you want to preserve it).
bmp.bi はここの保存する必要がある(古いファイルを保存したい場合には、名前を変更するか他の場所に保存する)。
\--lib
\--win32 <== libgmp.a needs to go here (if you have installed a libgmp.a by yourself rename/

1038 名前:save the old one).
libgmp.a はここの保存する必要がある(libgmp.a を使用したい場合には、名前を変更するか他の場所に保存する)。
The gmp.bi file need two files to work properly, long.bi and stddef.bi.
gmp.biファイルが正しく動作するために2つのファイル、long.bi と stddef.biが必要です。
[]
[ここ壊れてます]

1039 名前:デフォルトの名無しさん [2016/12/02(金) 00:11:55.45 ID:loKG2Fku.net]
ちょっと前に話題にした、INI ファイル関係。
キーを削除する場合
IErrorRetCodeLong = WritePrivateProfileString(SecNameString, KeyNameString, 0, FileString)
セクションを削除する場合
IErrorRetCodeLong = WritePrivateProfileString(SecNameString, 0, 0, FileString)
Visual Basic では、VBnul という定数を指定していた。ヌル "" を指定すると削除されず
「なんたら=」とか「=」が保存された。即値の0を指定する必要がある。
IErrorRetCodeLong = GetPrivateProfileSection(SecNameString, strValue, StrLength, FileString)
IErrorRetCodeLong = GetPrivateProfileSectionNames(strValue, StrLength, FileString)
のような&h00区切り文字列の場合は、分離するサブルーチンを作成せず、読み取った直後に分離するようにした。
読み取りルーチンは、引数の種類で分けて、16種類になってしまった。
うまく書き込みがされているかどうかは試験していないもの(String 以外の型の文字変数)もある。

1040 名前:デフォルトの名無しさん [2016/12/03(土) 12:38:01.18 ID:HN6NcG00.net]
makoto-watanabe.main.jp/freebasic/PgOpen.html
ock_type ディスク・ファイルに、他の処理(スレッドやプログラム)からアクセスするときの制限を課します。下記のいずれかを使います。
Shared (ファイルは、他の処理から自由ににアクセスできます。)
Lock [Read] [Write] (読み書き両方について、他の処理からのアクセスを否定することができます。)

タスクの重複起動を禁止するために
実行形式ファイル DimChk16.exe を占有することを模索。
書き込みのみを禁止する方法は発見できたが、読み取りを禁止する方法は発見できず
File = Exepath + "\AAA.txt"
FileNoLong = FreeFile
'Open File For Input Lock Read Write As #FileNoLong (読み書き可能)
'Open File For Input Lock Read As #FileNoLong (読み書き可能)
'Open File For Input Lock As #FileNoLong (読み書き可能)
'Open File For Input, Read As #FileNoLong (エラー)
'Open File For Input Read As #FileNoLong (エラー)
'Open File For Input, Lock Read As #FileNoLong (エラー)
'Open File For Binary As #FileNoLong: '他タスクによる書き込みだけ禁止
'Open File For Binary Shared As #FileNoLong: '他タスクによる書き込みだけ禁止
Open File For Binary Lock As #FileNoLong: '他タスクによる書き込みだけ禁止
MessageBox(TakaHWND,"Hello ","Messagebox caption",MB_ICONINFORMATION)
Close #FileNoLong

MessageBox()でタスクを止めておいて、エクスプローラーから、メモ帳を使って、File をOPEN, 読み取って、編集して、書き込む、という方法で検査。

If (App.PrevInstance) Then に変わる手法を探している。
'microsoft.public.jp.access.narkive.com/VGCEWUUt
が理解できた方法だが、よくわからないので、INIファイルを使う方法を検討中
起動直後にRename する方法もあるが、分割LOADをWinが使っていた場合に、絶望的な状況に陥りやすい。

1041 名前:デフォルトの名無しさん [2016/12/03(土) 22:43:19.48 ID:HN6NcG00.net]
>>957 のつづき。INIファイルを使った重複起動の抑制ルーチン
参照側 Function WndProc() 内。 BootCountとIAA はLOCALで宣言。
' Case WM_INITDIALOG
' hWnd = hWin
' TakaHWND = hWin: '大域変数
' IAA = DoubleBootStates(-1, BootCount)
' If (DoubleBootChick(BootCount)) Then
' '初回起動
' IAA = taka01b_CommonStringSet(TakaHWND)
' IAA = Taka01H_CommonStringSet(TakaHWND)
(等の起動処理、初期化など)
' Else
' '重複起動 → 終了処理
' MessageBox(TakaHWND, "Hello 終了処理", "Messagebox caption", MB_ICONINFORMATION)
' MSReturnCode = PostMessage(hwnd, WM_CLOSE, 0, 0)
' return 0
' End If
' Case WM_DESTROY
' IAA = DoubleBootStates(1, BootCount)
' PostQuitMessage(NULL)
' '
' Case Else



1042 名前:デフォルトの名無しさん [2016/12/03(土) 22:44:41.89 ID:HN6NcG00.net]
Public Function DoubleBootChick(ByRef BootCount as Long) as Bool
Const TakaSubRoutineNo as long = 20&

Dim As Long IAA
'Dim As String AppExeNameString (大域)
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
If (CommonStringSetFi

1043 名前:g = 0) then IAA = Local_CommonStringSet(ReadActionType)
'Const DoubleBootSecName As String = "DoubleBoot" (大域)
IAA = IniFileRead2(CtrlFile5String, DoubleBootSecName, AppExeNameString, BootCount)
DoubleBootChick = (BootCount = 1)
End Function
[]
[ここ壊れてます]

1044 名前:デフォルトの名無しさん [2016/12/03(土) 22:54:02.60 ID:HN6NcG00.net]
Dim Shared CtrlFile5String As String: '重複起動検査用
Const IniNameString as String = "taka01b"
Dim Shared AppExeNameString As String

Private Function Local_CommonStringSet(ActionType as Integer) As long
Const TakaSubRoutineNo as long = 2&
'このファイルを使用するときに初期化する必要がある内容
IF (CommonStringSetFig = 0) then
CommonStringSetFig = 1
Local_CommonStringSet = 0
CtrlFile5String = Exepath + "\" + IniNameString + ".Txt"
AppExeNameString = Right(Command( 0 ), Len(Command( 0 )) - InStrRev(Command( 0 ), "\"))
CommonStringSetFig = 2
else
Local_CommonStringSet = 1
end if
End Function

1045 名前:デフォルトの名無しさん [2016/12/03(土) 22:55:18.26 ID:HN6NcG00.net]
Public Function DoubleBootStates(ActionType as Integer, ByRef BootCount as Long) as Long
Const TakaSubRoutineNo as long = 20&
'BootCount (出)

Dim As Long IAA
'Dim As String AppExeNameString (大域)
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
DoubleBootStates = 0
IF (CommonStringSetFig = 0) then IAA = Local_CommonStringSet(ReadActionType)
'Const DoubleBootSecName As String = "DoubleBoot"
Select Case ActionType
Case -1 '開始
IAA = IniFileRead2(CtrlFile5String, DoubleBootSecName, AppExeNameString, BootCount)
BootCount = BootCount + 1
IAA = IniFileWrite(CtrlFile5String, DoubleBootSecName, AppExeNameString, str$(BootCount))
Case 0 '破棄
IAA = IniFileKeyDelete(CtrlFile5String, DoubleBootSecName, AppExeNameString)
Case 1 '終了
IAA = IniFileRead2(CtrlFile5String, DoubleBootSecName, AppExeNameString, BootCount)
BootCount = BootCount - 1
IAA = IniFileWrite(CtrlFile5String, DoubleBootSecName, AppExeNameString, str$(BootCount))
Case Else
IAA = IniFileRead2(CtrlFile5String, DoubleBootSecName, AppExeNameString, BootCount)
End select
End Function

1046 名前:デフォルトの名無しさん [2016/12/03(土) 22:59:53.72 ID:HN6NcG00.net]
Public Function IniFileWrite(FileString as String, SecNameString as String, KeyNameString as String, KeyValString as String) as long
Const TakaSubRoutineNo as long = 20&
Dim As Long IErrorRetCodeLong
'Win 2000 では、&H09が使用可能、Win98では不可
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
If (Len(FileString) = 0&) Or (Len(SecNameString) <= 0&) Or (Len(KeyNameString) = 0&) Or (Len(KeyValString) = 0&) Then
IniFileWrite = 1
Else
IErrorRetCodeLong = WritePrivateProfileString(SecNameString, KeyNameString, KeyValString, FileString)
IniFileWrite = abs(sgn(IErrorRetCodeLong))-1
End If
End Function

Public Function IniFileRead2(FileString As String, SecNameString As String, KeyNameString As String, ByRef KeyValLong as Long) as Long
Const TakaSubRoutineNo as long = 25&
'IniFileRead の倍精度整数用
Dim strValue As String * IniBuffSize: '1024
Dim as Long StrLength, IErrorRetCodeLong, IAA
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
StrLength = Len(strValue)
IniFileRead2 = 0
If (Len(FileString) = 0) Or (Len(SecNameString) <= 0) Or (Len(KeyNameString) <= 0) Then
KeyValLong = 0&
Else
IErrorRetCodeLong = GetPrivateProfileString(SecNameString, KeyNameString, "", strValue, StrLength, FileString)
KeyValLong = Val(strValue)
End If
End Function

1047 名前:デフォルトの名無しさん [2016/12/03(土) 23:03:27.50 ID:HN6NcG00.net]
Public Function IniFileSecDelete(FileString As String, SecNameString As String) As Long
Const TakaSubRoutineNo as long = 32&
Dim As Long IErrorRetCodeLong
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
IniFileSecDelete = 0
If (Len(FileString) = 0) Or (Len(SecNameString) <= 0) Then
Else
IErrorRetCodeLong = WritePrivateProfileString(SecNameString, 0, 0, FileString)
End If
End Function

>>958-963(たぶん) がINIファイルを使った重複起動禁止

1048 名前:デフォルトの名無しさん [2016/12/04(日) 12:12:45.27 ID:Dpp2DwtE.net]
FreeBasic 型の「 -x foobar.exe -m baz foo.bas bar.bas baz.bas」のようなコマンドラインの解釈ルーチンが完成。
やってみたら、ユーザー依存が強い(スイッチに前置詞・後置詞があるかはユーザー側で判断)ので、
空白と「-」を区切り文字とする配列を作っただけ。
スイッチの解釈(スイッチと語句との分離)は、ユーサー任せで、ライブラリーは関与できない。
関与するとしたら、スイッチの後置詞をライブに登録する必要が出てくるから。
スイッチの後置詞内にスイッチを指定する、なんて処理は比較的容易に作れるだろう。
例 SPL 05/DV DK05/VL:trtrta をシスオペに指示する Mount 命令の場合には
/を!に, :を; に書き換える必要がある。これやらないと、Mount命令のスイッチとして解釈してしまうから

ナルト(アットマーク)処理、
makoto-watanabe.main.jp/freebasic/CompilerOptoptfile.html#start
は、360とあまり違っていないので、360処理のライブにかぶせる予定だが
読んだ雰囲気では、解釈が一部違う。めんどくさいから、独自の文法による拡張命令にするか。
ライブでの処理は、今のところ考えていない。
というか、
@処理はバッチ処理のタスクの所轄なので、バッチ処理を考えていない今では、何も作れない。
システムを操作する必要も出てくるから。

1049 名前:デフォルトの名無しさん [2016/12/06(火) 23:36:17.80 ID:bNLFehP7.net]
File01.rc を直接編集して、
#define IDC_LST1 1002
#define IDC_STC1 1004
以下の番号の順番をそろえてみた。表示画面がみだれて
CONTROL "RBN1",IDC_RBN1,"Button",0x50010009,144,45,21,9
が単なるButton
CONTROL "決定",IDC_

1050 名前:BTN4,"Button",0x50010000,153,24,30,15
のように描かれる。どうせ番号を間違えたのだろう、と今度は、
FBEdit のRCタグを使って、ID番号を変更。
横▽をクリックして、コンパイル。
ハングした。

今の技能では、ID番号をそろえるのは不可能であると判断した。
現在の、File01系統、ファイル選択ライブの作成で、全ディスクサイズで1MB、圧縮BAKファイルで100KB、位。
やっと終わりが見えてきた。

以前紹介した、アイコン作成ツール、使って作成に成功。
オハナシ゛ャー.ico、漢字で書くとお花茶屋.icoで、アイコン登録のつもりが
コンパイラーか、FBEditか、わからないが、読み取れない。HanaJaya.icoで登録した。
Oが足らないって?、アルファベットのOは旧バージョンの意味で付ける接頭語なので使えない文字なんだわ。
登録の仕方は、http://www.hi-ho.ne.jp/makoto_watanabe/FbEdit/tut2.htm#start 参照。
[]
[ここ壊れてます]

1051 名前:デフォルトの名無しさん [2016/12/08(木) 20:19:45.21 ID:fg85d7ok.net]
ライブラリーの整理を始めた。名称の統一なんだけど。
その中で、起動表示枠の表題の取得と変更には失敗した。
Dim buff As Zstring * MAX_PATH
' GetDlgItemText(hWin, IDD_DIALOG, @buff, SizeOf(buff))
' MessageBox(TakaHWND,"IDM_FILE_01" + Buff ,"Messagebox caption",MB_ICONINFORMATION)
'取得できず
'buff = "てきとう"
' SetDlgItemText(hWin, IDD_DIALOG, @buff)
'変更できず

QBでは、たしか、使わない*.objには、ダミーの*.objをリンクさせて、容量を減らすという機能があった。
このスレでは、いろいろ話題になった、バグ取りルーチンのうち、エラー記録ルーチンを外す*.OBJを作ることとした。
Function文と名称に定義する行とEnd Function 行の3行にする。
手作業でなんてやったらば間違えるので、自動化した。

ついでに、Declare 文も一部自動作成するようにした。
大域参照するルーチンだけ自動作成にして、局所参照は今まで通り手作業で入れることとした。
今のところは、単にかき集めただけだが、他への流用を考えて、整列などをしなければならないだろう。



1052 名前:デフォルトの名無しさん [2016/12/10(土) 12:42:07.74 ID:K21NAgqS.net]
ライブラリーの整理の都合で、タイムゾーン関係をいじり始めることになった。
msのサイトを見ても、よくわからないので、見つけた関数を試している。
Function TimeZonTest(ActonType As Integer) As Long

'Dim TakaTimeZon As DYNAMIC_TIME_ZONE_INFORMATION
'Dim TakaTimeZonPtr As PDYNAMIC_TIME_ZONE_INFORMATION
Dim TakaTimeZon2 As _TIME_ZONE_INFORMATION
Dim TakaTimeZon2Ptr As LPTIME_ZONE_INFORMATION

Dim MsRetCode As DWORD
'TakaTimeZonPtr = @TakaTimeZon
TakaTimeZon2Ptr = @TakaTimeZon2
TimeZonTest = 0

'MsRetCode = GetTimeZoneInformation(TakaTimeZon) 致命的エラー
'MsRetCode = GetTimeZoneInformation(@TakaTimeZon) 警告エラー
'MsRetCode = GetTimeZoneInformation(TakaTimeZonPtr) 警告エラー
'MsRetCode = GetTimeZoneInformation(TakaTimeZon2) 致命的エラー
MsRetCode = GetTimeZoneInformation(@TakaTimeZon2)
MsRetCode = GetTimeZoneInformation(TakaTimeZon2Ptr)
End Function

1053 名前:デフォルトの名無しさん [2016/12/10(土) 17:12:16.00 ID:BUzq8JlI.net]
タイムゾーン関係のライブを見ていたら、
西暦⇔日数の換算ルーチンで、倍精度超過の整数ルーチンがあり
しっかと、無限倍精度ルーチン、BDC型が使われていた。

新ライブに移行するにも、英文解読が終わっていないからして、
結論、自前の無限倍精度ルーチン復活。

1054 名前:デフォルトの名無しさん [2016/12/10(土) 20:05:27.64 ID:BUzq8JlI.net]
C:\tool\FreeBASIC\fbc -s gui "Menu01.bas" "Menu01.rc" "..\Kako02\Mod\Taka01H.bas" "..\Kako02\Mod\Taka00f.bas" "..\Kako02\Mod\Taka01I.bas"
"..\Kako02\Mod\Taka00c.bas" "..\Kako02\Mod\taka01G.bas" "..\Kako02\Mod\Taka00e.bas" "..\Kako02\Mod\Taka01.bas" "..\Kako02\Mod\Taka00d.bas"
"..\Kako02\Mod\Taka05.bas" "..\Kako02\Mod\Taka01M.bas"
C:\tool\FreeBASIC\bin\win32\ld.exe: reopening Menu01.exe: Permission denied

C:\tool\FreeBASIC\bin\win32\ld.exe: final link failed: Permission denied

Make done

なにやら、抽象的障害メッセージを表示して、

1055 名前:停止した。 []
[ここ壊れてます]

1056 名前:デフォルトの名無しさん [2016/12/11(日) 10:27:06.45 ID:5UvE8iG9.net]
>>969 放置しておいて、再起動したら、発生しなくなった。
原因不明。変数領域の食いつぶしか、モジュールの登録・削除を繰り返したために主記憶領域が乱れたものと思われる。

>>968 無限倍精度ルーチン、ベクトル演算とBDC演算のライブ化終了。
といっても、複数の表示枠の表示方法がわからないので、単機能枠だけしか作っていない。
起動枠(Dialog as main相当)から
保守ルーチン一群の選択メニュー枠を表示して
選択メニュー枠から個別の保守ルーチン・動作試験ルーチン枠を起動していた。
この分離方法が今のところ分からない。
ライブから起動していた、非常駐部のルーチンはごく少しだが常駐部に移動することを始めた。
しかし、今のところ、保守ルーチンの起動方法がわからないので、放置。
特権の最上位で起動して、他からの干渉を排除して、動かすという方法もあるが、
INIファイルの占有方法がわからないので、他からの干渉を排除する方法がわからない。
ユーザーレベルで(個別のタスクが個別に)対応するのは簡単だが、ノートパットという誰でも起動できる強力なタスクが干渉することを排除できない。

1057 名前:デフォルトの名無しさん [2016/12/11(日) 10:43:50.97 ID:5UvE8iG9.net]
レジストリー関係を覗いたいたら、
Win 95-2000の頃には存在していた、
OS起動直後に中身を全削除する親キー(HKEY_CLASSES_ROOT等)がわからない。
ユーザーレベルで対応するときに、
何かおかしなことが発生した、つまり、
占有中であることを宣言して、宣言を破棄して開放する前に、異常終了した場合
時に、占有関係データを破棄する必要がある。
OS起動時に、中身を全削除してくれるレジストリーは、占有情報の保管場所として適切な場所にある。

これがわからない。
ユーザーレベルでやるのであれば、スイッチ、多くの場合には存在を隠しているスイッチを指定して、
関係情報を全削除、終了、という方法をとる。

1058 名前:デフォルトの名無しさん [2016/12/12(月) 22:09:02.25 ID:5xU3iLZ7.net]
金土日の3日間の処理で、
Declare 文を集めた *.biファイルのサイズが 35KB から 55KBに増えた。
よくまー、。これだけの単純作業を繰り返したもので。

コンパイラーが通れば、多少おかしな状態でも可能
という条件だからこそできた早業。これで入出力引数のチェックなんて入れたらば、終わるわけがない。

引数リストの作成ルーチンも復活させなければならないが、ファイル選択ルーチンが未完成。

1059 名前:デフォルトの名無しさん [2016/12/13(火) 21:43:00.09 ID:4e1gXBvt.net]
V.B.の WeekDay(), DataPart()関数を使っていた。
Free-Basic では、内部処理用時間変数を引数とする場合しか認めていない、文字変数を引数とする場合を認めていないので、エラーになる。
前者はどこかに作っておいたはず。みつけるだけ。
後者は、0から作ることになる。

どちらも、曜日を指定する場合で、RFC型時間変数にしか使わないのがせめてもの救い(後回しにできる)。
これは、
メール処理として、メールサーバーが記録した日時を読み取るルーチンを作った。
対として、逆関数も作った。この逆関数が残っていたもの。
正関数と逆関数の2つのルーチンを作って、乱数でてきとうな値を作って、
元値と、正関数・逆関数を通した値を比較する。
両者に違いがあれば、どこかに間違いがあることがわかる。

1060 名前:デフォルトの名無しさん [2016/12/14(水) 22:54:08.74 ID:2JEVbY+L.net]
>>973 つづき。
中身をみたら、引数の違いだけで両者ともに同じ処理。
ほぼ同一処理の引数違いの自家製ルーチンを見つけて、復活。

1061 名前:デフォルトの名無しさん [2016/12/15(木) 21:14:04.49 ID:9nAvfrOI.net]
バイナリファイルへの書き込みで
Put #FileNo2Long, , AAByte()
がFreeBasic の書式。FortranやVisual Basic では、AAByte と配列全体を示す場合には()をつけない。
違いに注



1062 名前:モ。半角⇔全角の変換命令がないので作った。余計な部分は、大域変数として宣言すると常駐するための物。
現時点でどのライブファイルが担当するのか決めていないので、局所宣言になっている。
Public Function StrConvAsc2SjisString(ChacterType As Integer, AAString As String) As String
Const TakaSubRoutineNo as long = 10&
'*-* ASC半角カタカナを全角平仮名・全角片仮名に書き換える
'ChacterType (入);{2;全角平仮名, (他);全角片仮名}
'AAString (入);書き換え前の文字列
'StrConvAsc2SjisString (出);書き換え後の文字列
Dim As String ChacterGLstring(&h20 To &h7E), ChacterGHstring(&hA0 To &hDF)
Dim As Long ChacterGAsetFig1 = 0
Dim As Integer ChacterGAsetFig2 = 0
Const GLstring = " !”#$%&’()*+,−./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_‘abcdefghijklmnopqrstuvwxyz{|} ̄"
Const GHstring1 = " 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜"
Const GHstring2 = " 。「」、・をぁぃぅぇぉゃゅょっーあいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわん゛゜"
Dim As Long IAA, IBB
Dim As String BBstring

TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
IF (ChacterGAsetFig1 = 0) or (ChacterGAsetFig2 <> ChacterType) then
ChacterGAsetFig1 = 1
IBB = 0
[]
[ここ壊れてます]

1063 名前:デフォルトの名無しさん [2016/12/15(木) 21:14:46.37 ID:9nAvfrOI.net]
For IAA = &h20 To &h7E
IBB = IBB + 1
ChacterGLstring(IAA) = Mid$(GLstring, IBB, 2)
IBB = IBB + 1
Next IAA

IF (ChacterType = 2) then
'ASC半角カタカナを全角平仮名に書き換える
IBB = 0
For IAA = &hA0 To &hDF
IBB = IBB + 1
ChacterGHstring(IAA) = Mid$(GHstring2, IBB, 2)
IBB = IBB + 1
Next IAA
ChacterGAsetFig2 = ChacterType
else
'ASC半角カタカナを全角片仮名に書き換える
IBB = 0
For IAA = &hA0 To &hDF
IBB = IBB + 1
ChacterGHstring(IAA) = Mid$(GHstring1, IBB, 2)
IBB = IBB + 1
Next IAA
ChacterGAsetFig2 = 1
End if
ChacterGAsetFig1 = 2
End if

1064 名前:デフォルトの名無しさん [2016/12/15(木) 21:15:32.70 ID:9nAvfrOI.net]
BBstring = ""
For IAA = 1 to Len(AAString)
IBB = asc(Mid$(AAstring, IAA, 1))
Select Case IBB
Case &h00 to &h1F, &h7F, &HFF
'BBstring = BBstring + "-"+Hex$(IBB)+"-"+Chr$(IBB)
BBstring = BBstring + Chr$(IBB)
Case &h20 To &h7E
BBstring = BBstring + ChacterGLstring(IBB)
Case &h80 to &H9F
BBstring = BBstring + Chr$(IBB)
IAA = IAA + 1
BBstring = BBstring + Chr$(IBB)
Case &hA0 To &hDF
BBstring = BBstring + ChacterGHstring(IBB)
Case &HE0 To &hFE
BBstring = BBstring + Chr$(IBB)
IAA = IAA + 1
BBstring = BBstring + Chr$(IBB)
Case else
BBstring = BBstring + Chr$(IBB)
End select
Next IAA
StrConvAsc2SjisString = BBString
End Function

1065 名前:デフォルトの名無しさん [2016/12/15(木) 21:25:32.19 ID:9nAvfrOI.net]
GH領域の半角空白、&hA0は、GL領域の半角空白と等値であるとして処理している。

>>957のつづき。Put 命令関係を探していたら、
makoto-watanabe.main.jp/freebasic/PgBinary.html
をみつけた。まだ試していないが、一息ついたらばやってみる予定。

1066 名前:sage [2016/12/15(木) 21:30:42.16 ID:VRbOmxa/.net]
https://www.youtube.com/watch?v=xHx5MbIGEoY

https://www.youtube.com/watch?v=8fPmkq1CkCU

https://www.youtube.com/watch?v=PR6r40GbIfk

1067 名前:デフォルトの名無しさん [2016/12/16(金) 21:56:34.17 ID:rZ3nkbqi.net]
>>978 のつづき。
Dim Shared As String TestFileString, ReadDataString
Dim Shared As Long FileNoLong
Dim Shared As UByte aByte(0 To &h0F)
と大域宣言して
TestFileString = ExePath + "\test.test.txt"
FileNoLong = FreeFile
Open TestFileString For Output As #FileNoLong
Print #FileNoLong,"0123456789ABCDEF";
Print #FileNoLong,"0123456789ABCDEF";
Print #FileNoLong,"0123456789ABCDEF";
Print #FileNoLong,"0123456789ABCDEF";
Close #FileNoLong
と、試験ファイルを作成して。
TestFileString = ExePath + "\test.test.txt"
Open TestFileString For Binary Access Read Write Lock Read Write As #FileNoLong
For IBB = 1 To 3
Get #FileNoLong, , aByte()
ReadDataString = ""
For IAA = LBound(aByte) To UBound(aByte): ReadDataString = ReadDataString + Chr$(aByte(IAA))+"

1068 名前: ": Next IAA
MessageBox(TakaHWND, "Hello ("+ReadDataString +")", "Messagebox caption", MB_ICONINFORMATION)
Next IBB
Close #FileNoLong
と、読みだすと、メッセージボックス表示中に、ノートパットで中身を覗ける
[]
[ここ壊れてます]

1069 名前:デフォルトの名無しさん [2016/12/16(金) 22:21:02.16 ID:rZ3nkbqi.net]
>>597 つづき。
実行形式ファイル内に存在しないファイルのアイコンの表示には、相変わらず成功していない。
'IconFile = "D:\bas\Projects\Editbox\Res\Anchor1.ico"
'declare function LoadIconA(byval hInstance as HINSTANCE, byval lpIconName as LPCSTR) as HICON
'hIcon=LoadIcon(hInstance, @IconFile)
''hIcon=LoadIcon(hInstance, Cast(ZString PtrIconFile)): '構文エラー
SendMessage(TakaHWND,WM_SETICON,NULL,Cast(LPARAM,hIcon))
コンパイラーは通るが、ディスク上のファイルを読み取って表示しない

実行形式ファイル内のアイコンの切り替えには成功した。
Case IDC_BTN1
hIcon=LoadIcon(hInstance,Cast(ZString Ptr,500))
SendMessage(TakaHWND,WM_SETICON,NULL,Cast(LPARAM,hIcon))
Case IDC_BTN2
hIcon=LoadIcon(hInstance,Cast(ZString Ptr,501))
SendMessage(TakaHWND,WM_SETICON,NULL,Cast(LPARAM,hIcon))

1070 名前:デフォルトの名無しさん [2016/12/16(金) 22:36:53.84 ID:rZ3nkbqi.net]
V.B.と同じだと思っていた Byte 型変数。
比較ルーチンを使っている場合に、FreeBasic での違いに泣くので要注意。

makoto-watanabe.main.jp/freebasic/PgByte.html#start
-128〜127 の範囲の値を保持できます。
V.B.では
makoto-watanabe.main.jp/freebasic/PgUbyte.html#start
0〜255の範囲の値を保持できます。
と同じなので、
移植作業の時には、As Byte 宣言を一律 As UByte 宣言に書き換えても良いかもしれない。

V.B.のころは
値返しのFunction 文で、名称の末尾1文字を
I;単精度整数, L;倍精度整数, S;単精度実数, D;倍精度実数で、
末尾に Bool が付いた場合には論理変数で
あたいを返す用にしていた。入力引数のほうもほぼ同様な扱いにしていた。
ところが、整数型がFreeBasicではやたら増えて、合計15種類もある。
>>962 のように番号で区別するように、変更中。

1071 名前:デフォルトの名無しさん [2016/12/18(日) 12:29:50.18 ID:1/CaK5B1.net]
makoto-watanabe.main.jp/freebasic/ExtLibZip.html#start
の見本ファイルが構文障害で動作せず。
Private Sub unpack_zip_file(ByVal zip As zip_t Ptr, ByVal i As Integer)
Dim As zip_file_t Ptr fi = zip_fopen_index(zip, i, 0)
と、
As zip → As zip_t、As zip_file → As zip_file_t
の変数型の変更で動作するようになった。

"C:\tool\FreeBASIC\inc\zip.bi"
から、
Dim As String filename = *zip_get_name(zip, i, 0)
より「zip_get_name」の宣言文を見つけて、引数「zip」の宣言に合わせた。
以下同様。



1072 名前:デフォルトの名無しさん [2016/12/18(日) 12:31:31.87 ID:1/CaK5B1.net]
>>983 つづき。
コンパイラーが通っただけだから。圧縮・解凍するかは試してない。

1073 名前:デフォルトの名無しさん [2016/12/18(日) 21:17:31.69 ID:1/CaK5B1.net]
>>984 つづき。
リンカーが通らなかった。
C:\tool\FreeBASIC\fbc -s gui "DllZip01.bas" "DllZip01.rc" "LZH01.bas"
C:\tool\FreeBASIC\bin\win32\ld.exe: cannot find -lzip
C:\tool\FreeBASIC\bin\win32\ld.exe: cannot find -lz

Make done
>>983の内容が LZH01.bas にコピーしてある。
*.dll 又は *.a ファイルを探すことになるのだが
https://search.yahoo.co.jp/search?_adv_prop=web&x=op&ei=UTF-8&fr=top_ga1_sa&fr2=op&submit=%E6%A4%9C%E7%B4%A2&
va=libzip&va_vt=any&vp=&vp_vt=any&vo=lz.a+lz.dll+lzip.a+lzip.zip+&vo_vt=any&ve=&ve_vt=any&vd=all&vst=0&vs=&vf=all&vc=&fl=0
どうもソースコード配布らしい。
makoto-watanabe.main.jp/freebasic/ の
https://nih.at/libzip/libzip-1.1.3.tar.xz

https://nih.at/libzip/libzip-1.1.3.tar.gz
も、ソースコードらしきものがあったが、*.A, *.DLL は発見で゜傷。
Win10用のgz系圧縮ファイルの解凍ソフトは
www.vector.co.jp/soft/

1074 名前:winnt/util/se489109.html
が見つかった。
gz系解凍のみのために用意していたソフトがWin10で使えなくなったので助かった。
[]
[ここ壊れてます]

1075 名前:デフォルトの名無しさん [2016/12/18(日) 21:40:48.13 ID:1/CaK5B1.net]
ライブ関係ファイル >>969 に一部表示してあるけど、訳が分からなくなって
ルーチンの引数の入出力情報を整理しようとして始めた。
ライブとして整理が終わったファイルが30位、2つの疑似というか偽装というかファイル。
後者の2つは自動作成だから、元ファイルがまともに作られているのであれば、無検査。
700個ぐらいのルーチンがある。
ルーチン名、引数の型、入出力形式の3つを保存する必要に迫られた。
各ルーチンの番号をフルわけで、
Const TakaSubRoutineNo as long = 109&
行を入れてゆく。ついでに、バグ取りルーチン、現在実行中のルーチン名を保存する
TakaDammyReturnCode4 = TakaErrorPointSach(IniNameString, TakaSubRoutineNo)
行も書き込む。
そのほかに、ファイル名(モジュール名)を保存する
Const IniNameString as String = "taka01G"
や、モジュール内に存在するルーチン数を示す
'サブルーチン総数 : 10
や、ソースの取り扱いを容易にする
'#Include Once "..\Kako02\Mod\TakaCom0.bi"
等のコメント行も自動で書き込む。
当然こんなことをすれば、書き間違いを結構するわけで、未処理のファイルはそっくり残しておきたい。
ディレクトりー内一括圧縮保存ルーチン、SendToZIP
hatenachips.blog34.fc2.com/blog-entry-376.html
相当ルーチンを作ろうとしたのが、今日の一連の作業。

現在 (なんたら)\MOd\ 内ファイル数約100、サイズ5MB。
内、約30ファイルが作成したもの、約30ファイルが修正不能として放置したファイル、残り40ファイルが手を付けていないファイル。

1076 名前:渡辺真 [2016/12/18(日) 21:41:51.20 ID:Mt5C7DVY.net]
GMP(任意精度算術ライブラリ)の上手い使い方を教えてもらいました。
makoto-watanabe.main.jp/freebasic/tipsGmpOverloading.html
構造体として、GMP のユーザ定義型を作り、演算子の多重定義を含めて .bi ファイルにします。
これをインクルードすれば、通常のプログラムの Dim 文の変数の型を修正するだけで、取り扱える数値の桁数を、任意に拡張できるのです。
これは感激です。

もう一つ。
素因数分解の関数も教えてもらいました。
makoto-watanabe.main.jp/freebasic/tipsGmpPrimefactors.html
これを使うと、例えば、21桁の数値 121,439,531,096,594,251,777 を、3分足らずで素因数分解できました。

1077 名前:デフォルトの名無しさん [2016/12/20(火) 20:26:41.53 ID:UXtQEXtu.net]
>>986 のつづき。
一部書き換えた場合に、
どこが違っているのか、を比較して意図した内容になっているか、
を見る必要がある。意図してない内容ならば、バグかウィルスソフトにしか過ぎない。
2ファイルの比較ソフトとして使っていたのだが、異なる行の色表示が一致行との色表示と同じなので、使わなかった。
ぷれぷれDiff
www.vector.co.jp/soft/dl/winnt/util/se141425.html
不一致行の色を指定する方法が見つかったので、Win10でも使えることが判明した。
起動後、も左上、枠線上に6種類のマーク画像が並んでいる。
上から4つ目、下から3つ目、ネイルハンマー
image.search.yahoo.co.jp/search;_ylt=A2RCMY5aE1lY4hoA1iuU3uV7?p=%E3%83%8D%E3%82%A4%E3%83%AB%E3%83%8F%E3%83%B3%E3%83%9E%E3%83%BC&aq=-1&oq=%E3%83%8F%E3%83%B3%E3%83%9E%E3%83%BC&ei=UTF-8
とスパナの頭が重ね書きになっているところをクリック。「環境設定」の表示枠が表示される
左上、「文字色」内の「追加行」・「変更行」・「移動行」が「背景」と同じ白色になっていたので、

1078 名前:クリック。
「色の設定」枠が表示されるので、適当に選んで「OK」をクリック。

こんな調子で使えるようになった。
[]
[ここ壊れてます]

1079 名前:デフォルトの名無しさん mailto:sage [2016/12/22(木) 13:29:17.73 ID:qSEuLaQE.net]
GPLのプログラムを使う自由があって
GFDLのドキュメントを使う自由がある。
本来のライセンスによる提供物は本来のライセンスの提供物のままであって
自分にはキュレーションメディアは必要無い。
ただ単に自分が使いたいように使い倒すまでのこと。

1080 名前:デフォルトの名無しさん [2016/12/22(木) 20:56:55.91 ID:Vulz5JgX.net]
>>978 GH領域の半角空白、&hA0は、
が間違い。しばらくコードをいじっていなかったので記号を忘れた。GRが正しい記号。
00euc.jp/i18n/charcode.ja.html
ISO 2022 の構造(8単位系)
参照。

1081 名前:デフォルトの名無しさん [2016/12/22(木) 21:35:21.72 ID:Vulz5JgX.net]
Lcase$()関数とUcase$()関数は、7Bitコード対応らしく、8Bitに対応していなかった。
第8bit目を見ないで、一律7bitコードとして処理している(Or40だったかな)模様。
たしか、関係システムディレクトリー、注意 末尾¥付、あたりだったか、じばけする。

今のところ、コメント文の処理に困るぐらいで、大きな被害は出ていない。そのうち対応に迫られることとなる。
使い方としては、
Bstring = "#Include "
TakaDammyReturnCode = CodeChing5(Astring, Bstring, Bstring, 0)
"#Include "、大文字小文字の混在している"#InCluEe "、全部大文字の"#INCLUDE "、全部小文字の"#include "あたりを"#Include "に書き換えるという処理。



1082 名前:デフォルトの名無しさん [2016/12/22(木) 21:36:10.43 ID:Vulz5JgX.net]
>>975 にあるように
'*-* ASC半角カタカナを全角平仮名・全角片仮名に書き換える
と怪しげなコメント行がある。「'*-* 」が各サブルーチンに1行だけ存在し、ルーチンの概要を示している。
これをかき集めて、先頭に書き並べると、ライブファイル内のルーチンの一覧表が完成する。
Visual Basic では、ワードを使ってドキュメントがどうのこうのと書いてあったが、理解できなかった。
それで、Wterm www.vector.co.jp/vpack/filearea/dos/net/term/wterm
という通信ソフトの取扱説明書のどこかに、ソースから引き抜いして説明書を作ったのでおかしな日本語がある。旨の記載があった。
これをまねして作ったのが、怪しげなコメント行。'* * の4文字が固定、*と*の間の1文字に特殊な意味を持たせている。
ここにUcase$()で一律大文字にしてInstr(???, "'*-* ")=1等で行の意味を特定していた。
Ucase$() が使えないので、先頭5文字だけ切り出して比較するという処理に変えた。

FreeBasic で&hA0を使っているとヤバイのだが、
文字定数を意味する ""内処理と""外処理では意味が変わってくる。
自動書き換えルーチンで書き換えの対象となる後者と、書き換えてはマンマシンテンターフェース上問題になってしまうであろう前者の違いである。
MS-DOSの頃は&h00を使っていたのだが、FreeBasicでは文字変数の末尾という意味で使っているので使えない。
かわりに&hA0を使って""内を塗りつぶしてInstr()文で検索している。

1083 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´Д`)<519KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef