[表示 : 全て 最新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/

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

862 名前:デフォルトの名無しさん [2016/10/09(日) 18:54:04.23 ID:jP/U8Kom.net]
>>801-802 処理系の違いってけっこうあるんだね。
makoto-watanabe.main.jp/freebasic/OpPrecedence.html
の「最も高い優先順位」の表をみると、上から、算術演算子、比較演算子、論理演算子、の順番になっている。細かいことを覚えないで、群で覚えていた。

数値型変数と数値型定数の演算だから、「OR」を算術演算子と解釈したのが混乱の原因だった。
「OR」を論理演算子、As BOOLEAN 型変数同士の演算の場合、と、As ULong 型変数(数値型変数)の演算の場合で区別してくれると、勘違いしていた。

MS-DOS のバージョンの変遷だったか、何かのライブラリーの変遷だったか、覚えていないが
障害発生時の分岐を JC でやるか、JNZ でやるか、の処理で問題になった時がある。
製造元では、OR AX,AX JNZ で処理していてので、問題なかったんだが、ユーザーの方で JC でやっていた(1マシンサイクル早い)人がいたので問題になった。
バージョンアップで NC(キャリーフラグに0が定義されている状態)でも正常終了するようにかわったのが直接の原因。

863 名前:デフォルトの名無しさん mailto:sage [2016/10/09(日) 19:30:32.08 ID:ECXHthzl.net]
>数値型変数と数値型定数の演算だから、「OR」を算術演算子と解釈したのが混乱の原因だった。
流石にその解釈は…

andやorは左右オペランドが整数型ならビット演算子として動作し
boolean型(0か-1の符号付き整数型も)なら論理演算子として動作するのよ
C/C++系だと、前者が&や|、後者が&&や||ね
0か-1の符号付き整数型は、内部表現が&h00000000か&hFFFFFFFFだから論理演算可能なのよ

If文は「0かそれ以外か」の判断をするから前者も後者も条件式として渡せてしまう
でもやっぱり論理演算が条件式となるべきなんだよね
boolean型や0か-1のみ表現する符号付き整数型の何方かね

864 名前:デフォルトの名無しさん [2016/10/09(日) 21:35:11.73 ID:jP/U8Kom.net]
>>805
>らビット演算子として動作し
型宣言を覚えていないけど、ビット型変数、バイト型変数、ワイド(2バイト)型変数、ダブルワイド(4バイト)型変数があって、
これらの変数に限って、論理演算子(AND, OR, NOT, XOR, XNOR)が使えた。
比較演算子 (.lt., .LE., .EQ., .NE., .GT., .GE.)の結果は、2バイトの領域をもつワイド型変数として、-1,0,+1 のいずれがの値となる。
IF (数値変数) Goto (ラベル1), (ラベル2), (ラベル3)
(算術IF文)でJmp (Goto)先が決まった。

という頃の名残。Fotran 6の資産が結構生き残っていた。
論理演算の値は常に正数になるので、負数桁を読み捨てて、0か1になる。
型を無視した処理をやらない限りは負数にならない。
0000かFFFFかという演算ではなくて、00(中略)00か00(中略)01かの1バイトしか見ない。

という頃の話。
>前者が&や|、後者が&&や||ね
この演算子は知りません。
C/C++ は持っているけど、自分で描けなかった。

>ビット演算子
これは、論理演算子と同じく AND, OR, NOR, XOR, XNOR があるのだが、
対象がビット型変数、1ワードの最下位1ビットのみを使った変数、に使う演算子で、
2進法の1桁のみの場合。
論理演算子(1ワード16ビット全体)とほぼ同じ名称なんだけど、1文字余計な語(忘却)が付く。
1回も使ったことがない。
「整数型」「8進型」(型を無視するスイッチを指定すれば実数型も使用可能、実数型の指数部を切り離して不定長実数にするという手法もあった)の場合には、論理演算子
「ビット型」の場合には、ビット演算子(2進演算子)
C言語と使っていたFotranの方言(Jis 規格外演算)の用語の違いと思います。

865 名前:デフォルトの名無しさん [2016/10/10(月) 00:09:02.18 ID:QrjgKXiS.net]
自分が言いたかったのは
ここに書き込むときに表示される内容に
著作権を譲渡する
と書いてあるのとトップページ?に書いてある転載する時には許可が必要?
みたいな内容からここでなんらかの関数等が作られた時に
それが自由に使えなくなってしまうのではないだろうか?
という心配からオープンの方が向いているのではないか?
と思った
という方向性の話だったんです
上のやりとりを見ていてオープン2chを思い出して行ってみたらまだ有ったし
パブリックドメインと書いてあったから
あっちの方がいいんじゃないかな
という事だったのです

GFDLについてどうとか出てるけど
利用に関しては自由に使うという精神に反していると私は感じは無いので特段問題無いと思ってる
法的に完全に黒だみたいな話をしたところで
結局は裁定次第だから出ないと解らない
向こうの人達が訴えるほど侵害されていると判断するかしないかが重要
裁定を要求するほど酷いと向こうが感じて訴求してくるかが一番重要だと自分は思っている
私は裁定の内容に関わらず向こうが駄目だと言うならそれに従うべき
という感じですね

866 名前:デフォルトの名無しさん mailto:sage [2016/10/10(月) 00:48:42.37 ID:6bVjh2uR.net]
GFDLとか、こういう独自ライセンスを作る人は、他のライセンスの使用は、絶対に認めない。
CCなどにライセンスを改変されるのが絶対に嫌だから、わざわざ独自ライセンスを作っている。
他のライセンスへの改変は、最初から認めていない

ライセンスの改変など、著作権法違反で、年間千人とかが有罪だろ。
刑事告訴すればいい。
何年間もの、ものすごい他人の努力を盗む連中は、刑務所へ入れるべき

そもそも著作権を盗まれるのが嫌だから、独自ライセンスにしているのに、
勝手にライセンスを改変する奴が悪い

867 名前:渡辺真 [2016/10/10(月) 10:24:48.00 ID:Zb+8gsTV.net]
GFDL とは

0. PREAMBLE (前文) から抜粋

This License(GFDL) is a kind of "copyleft".
GFDL ライセンスは、「著作物を自由に複製・改変できるようにする思想」の一つです。

The purpose of this License(GFDL) is to assure everyone the effective freedom to copy and redistribute it, with or without modifying it.
GFDL ライセンスの目的は、対象文書を改変するしないを問わず、誰でも自由に、対象文書をコピーして、再配布できるようにすることです。

Secondarily, this License(GFDL) preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.
さらに、GFDL ライセンスは、著作者や出版社が、その著作物に対して名誉・称賛を得る手段を提供します。
また、自分自身が著作した部分以外の、他人が行った改変に対して、責任を負わずに済むようにします。

868 名前:渡辺真 [2016/10/10(月) 10:25:49.78 ID:Zb+8gsTV.net]
GFDL は、上記の目的を達成するために、以下の条文を設けています。
ここが「Public Domain(著作権消滅)」と異なる点です。

4. MODIFICATIONS (8. TRANSLATION)
改変/翻訳

・ E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.
改変/翻訳者は、改変/翻訳に対する適当な著作権表示を、他の著作権表示の近くに追加しなければなりません。

869 名前:デフォルトの名無しさん [2016/10/10(月) 12:51:39.56 ID:kOR6lwYv.net]
RadioBottan、オプションボタン関係。
C:\tool\FreeBASIC\inc\win\winuser.bi
const BS_RADIOBUTTON = &h00000004
const BS_AUTORADIOBUTTON = &h00000009 'ラジオボタン
const DLGC_RADIOBUTTON = &h0040
const DFCS_BUTTONRADIOIMAGE = &h0001
const DFCS_BUTTONRADIOMASK = &h0002
const DFCS_BUTTONRADIO = &h0004
declare function CheckRadioButton(byval hDlg as HWND, byval nIDFirstButton as long, byval nIDLastButton as long, byval nIDCheckButton as long) as WINBOOL
declare function IsDlgButtonChecked(byval hDlg as HWND, byval nIDButton as long) as UINT
const MFT_RADIOCHECK = &h00000200
declare function CheckMenuRadioItem(byval hmenu as HMENU, byval first as UINT, byval last as UINT, byval check as UINT, byval flags as UINT) as WINBOOL: '表示枠上部メニュー関係
が見つかった範囲。 FbEdit の *.rcファイル編集画面で、特異的内容は、
Auto, Groupの2つ。
前者は、クリックしたときの作画処理みたい。後者(Group)がややこしかった。
(Group) にFalse を指定しておくと、存在するすべてのRadioBottanが一群として処理されてしまう。
排他時に、他の選択マークを消してくれるという便利な機能もあるけれども。

芋づる式仕様対応、混乱と混沌を司る吾輩としては、「ちょっと違ったソフト」を作る必要があるときに、
既存のソフトに追記して作成する。もちろん、既存の内容はそっくり残しておく。
つまり、ちょっとだけ異なるサブルーチンがわんさかある、ソースリストが出来上がる。
一番手間が食うのが、人-機械インターフェース、つまり、手作業の分野なので、手作業対応のルーチンの共用が前提。

RadioBottanが1セットしか使えないというのは、致命的な問題となる。
declare function CheckRadioButton() を見ると、連続したID番号をふって、一連の群(Group)として取り扱うらしい。
というわけで、現在 *.Rc ファイルから、関係情報を読みだして、一覧表を作り、ついでに参照るーちんも作ってくれるルーチンを作成中。

870 名前:デフォルトの名無しさん [2016/10/10(月) 15:04:56.18 ID:kOR6lwYv.net]
>>811 つづき
MSReturnCode = CheckRadioButton(TakaHWND, IDC_RBN6, IDC_RBN7, IDC_RBN7)
で成功した。自動作成ルーチンの方。
枠(IDC_GRP?) に囲まれた座標内に、左上点(lef, Top)が存在するかの判断で、
どの枠に属するか、を規定し、先頭と末尾のID(IDC_RBN6, IDC_RBN7)を決定することになる。
連番でないと、なんかおかしなことが起こりそうなので、連番チェックどうしようかな、というところ。
表示メッセージも決めなければならないし。



871 名前:デフォルトの名無しさん mailto:sage [2016/10/10(月) 22:21:29.35 ID:6bVjh2uR.net]
>>809-810
GFDLは、copyleft だろ。
GFDLから派生した著作物も、絶対にGFDLにしなければならない

CCなど他のライセンスへの改変は、絶対に出来ない。
元がGFDLのものは、再帰的に継承していっても、必ずGFDLにしなければならない

絶対に、Public Domainにはしない、ライセンスを放棄しないって書いてあるだろ

だから、何回も言

872 名前:ってるだろ。
わざわざ独自ライセンスを作る人は、絶対に著作権を放棄しないし、
他のライセンスにも変更できない

ましてや有料のCCには変更できない。
著作権に最も厳しい人達だから、これ以上警告を無視して、
ライセンス改変を続けるのなら、刑務所行き

勝手に人の著作物を使うな。
わざわざ独自ライセンスを作っている人の、ライセンスを変えるな。
日本国内と同時に、国外でも刑事告訴されるぞ
[]
[ここ壊れてます]

873 名前:デフォルトの名無しさん [2016/10/12(水) 22:06:46.06 ID:8gvBjqIy.net]
ちょっと大きい *.rc ファイル(5.3KB)、部品数55の処理ルーチンを作っていて
まだ、細かいところまで特定していないが、
局所配列 
Dim As String PartsNameString1(), PartsNameString2(), PartsNameString3()
を参照中にハングするという現象が発生した。
枠("IDC_GRP" GroupBox)番号4、
枠内部品、文字表示("IDC_STC" Static)5, テキスト入力5、コマンドボタン5。
単に、配列の範囲を超えて参照しているためか、領域の食いつぶしがあったのかは、不明。

874 名前:デフォルトの名無しさん [2016/10/12(水) 22:10:04.25 ID:8gvBjqIy.net]
>>813
>>792 で書いたけど
怖いのが、民法1条の規定と民法のこうじょりょうぞくの規定。
なぜ怖いかわかるか。
行政法をやっている人間だと、
この規定で、却下される場合が多いので、注意が必要
と学んでいるはず。

875 名前:デフォルトの名無しさん [2016/10/13(木) 21:24:53.66 ID:7rM2EKzx.net]
>>814 つづき。
変数を大域に置こうとして、*.RCファイル読み取り関係を別ファフイルに移動。
障害がなくなってしまった。要は領域の食いつぶしであった。
スタック領域が少なくて、自己書き換えを行っている模様。
QB ではスタック領域サイズの動的変更が可能だったはずだが、静的変更しか見つからない。
1つのスタックで全変数を処理しているとなること、Windows の意義がなくなってしまう。
ファイル(モジュール)別にスタックが用意されている模様なので、大きな変数を取り扱う場合には要注意。
makoto-watanabe.main.jp/freebasic/CompilerOptt.html

876 名前:デフォルトの名無しさん [2016/10/13(木) 22:02:03.31 ID:7rM2EKzx.net]
>>816 つづき。
8080系では、処理の速さからスタック領域に変数を置く傾向がある。
ところが、スタックによるメモリー破壊を検出する、メモリー保護の例外、という事象が発生しない。
メモリー保護用レジスタがないし、関係命令もない。
スーパーバイザー以外のタスクが使用するメモリーをスーパーバイザーが決定するのが、マルチタスク処理の基本ではあるが、
8080系は、シングルタスク用CPUなので、関係命令がない。
結果として、やたら処理中に原因不明の障害を発生しやすくなる。

makoto-watanabe.main.jp/freebasic/CompilerOptt.html
には、スタックの初期値(無指定時の容量)が記載されていない。MA-DOSの処理では、
サブルーチンコールに、全レジスタの3-5倍ぐらい(8086 で16レジスタ位、32バイトの20倍512バイトをシステム割り込み(INT 21他)用に確保するように記載があったと記憶している。
FCだったかな、80480以後の旧隠し命令、全レジスタのPOPをサブルーチンコールとしてユーザーが使用するようになったのは。
非公開レジスタを含めてPOPするので、かなり巨大なスタック領域を確保する必要がある。
(細かいことはken-crate.blue.coocan.jp/asm/asm_menu.htm のようなサイトを探してくれ)

使う変数の目安としては、入力変数+出力変数の合計を作業変数と近似して
>>814 だと、
入力ファイル 50KB(内1KBを読み取る), 出力ファイル100KB(内4KBか可変、残りは表題などの定数)、出力変数2kbより、作業変数7KB、合計14KBを用意して
ここに、FreeBasic 内ルーチンの参照分(これが不明)を足す。
スタックの消費量の管理については、在庫管理が参考になる。
www2.rku.ac.jp/takada/logist/plan_zaiko.html
在庫が不足すれば、ハングアップという結果が待っているわけで、
目安としては、全容積の50%位を消費するようにして、66%を超えないように管理する。

理論としてはわかっているが、実際のスタックの状況をユーザーレベル(タスク)で検出できないと、対応も取れない。

877 名前:デフォルトの名無しさん mailto:sage [2016/10/13(木) 23:42:39.44 ID:vEZbybAc.net]
>>816>>817
内容は詳しく知らないけど、スタック領域って関数呼び出しに使用されるよね
関数の引数や関数内のローカル変数が割り当てられて
デカイ領域のローカル配列や関数の再帰呼び出しがオーバーフローの原因になる
配列なら動的にヒープ領域確保するか静的領域を使えば良いし
再帰呼び出しもループ処理で代替できる

スタックオーバーフローなんて普通のコーディングで起こり

878 名前:得ないと思うけど?
それ設計ミスなんじゃないの
[]
[ここ壊れてます]

879 名前:デフォルトの名無しさん [2016/10/14(金) 00:22:17.64 ID:ZL7xZTNZ.net]
>>818 >普通のコーディングで起こり得ないと
普通に使うと頻発する。
というのは、配列の大きさを処理群の最大値で決定している。
まず、入力値(60-100個)を(5-10)群に群分けして、割り振る。
ここで、最大数20の群があると、配列が (10群 , 20個)の領域を確保する。
しかし、前後最低1個は、未使用の領域を確保しておく。Dim AA(10)として、未使用領域 AA(0), AA(10)を用意する。
これは、設計があいまいな日曜プログラマーな場合に、バグが頻発する AA(0), AA(10)の使用を避けることで、バグ取りを回避する。
入れる文字を20文字として、32バイト(位置アドレス2つ、8バイト等を12バイトと想定, QBでは、配列全体に10バイト位、個々の配列構成変数に10バイト位使っていたので同じとした、16→32ビットの変化で2倍になっているかもしれない)。
10 * 20 * 32 = 6.4KB が1配列。
5配列もあれば、32KB使ってしまうので、(QBと同じく64KBスタックを使っていれば)簡単にパンクする。
Dim AA(10,20)
AA = Fun1(AA())
Fun1 内に
AA = Fun2(AA())
とあれば、配列が2個使っていることになる(QBと同じだとすると、引数をPush する)から。
FreeBasic だと、障害発生ちょっと前までしか出力ファイルに残っていないのだが、
QB だと、引数1個で、100だか300回位の再起呼び出しでハングした。
再起呼び出しの回数を2-3回に制限して、
巨大な配列は、共通領域なり、外部配列なりに保管して、引数によるスタックを圧迫を抑え
つかっていた。V.B.だと、このあたりを気にしないで済むので、気軽に巨大配列の引数を使っていた。
そのつもりで使ったらば、おかしなことになってしまった。

>ここで、最大数20の群があると、配列が (10群 , 20個)の領域を確保する。
と書いたけど、V.b.時代だと、偏りも考えられるので、(100, 100)の配列を作って使う。
前に、スタック不足と思られる障害が出ていたので、数を数えてから、配列を作るという作業に直してはある。

880 名前:デフォルトの名無しさん [2016/10/14(金) 00:23:16.25 ID:ZL7xZTNZ.net]
>>819 のつづき。
ただ、定数、
IF (AAstring = "寿限無寿限無 なんたらこうたら ") Then
という使い方があった場合に、QBでは、*.OBJファイル別にこの手の文字が並んでいた。
これが、スタック領域に作られる(*.EXEが圧縮状態でスタック領域に解凍する)としたら、結構大きな領域になってしまう。

それと気になったのが
Print #FileNoiLong, "なんたら"
(以後同様に100-200行ぐらい、合計80-90KB)
で出力した内容が途切れるという現象。
ファイル出力内容をスタックに貯めておいて、ある一定量になるまで保管して、まとめて出力する
という処理が行われテいる。
ファイル出力時に出力済みスタックの内容が破棄されて、スタックの移動が行われていれば問題はないのだが
使用済み領域であるマークだけして、スタックをのそのまま残している場合には、
ファイル出力そのものがスタックを食いつぶすことになる。



881 名前:デフォルトの名無しさん mailto:sage [2016/10/14(金) 00:53:09.58 ID:B5drn/wa.net]
>>819
んー?
関数の引数の配列って絶えず参照渡しだから
配列全てがスタックに乗らないと思うんだけど?

>入れる文字列を20文字として
これの型は?string型?
もしそうなら、string型はポインタ、文字列の長さ、キャパシティの各4バイトの合計12バイトの
記述子分しか保持していおらず、文字列自体はヒープ領域(allocateして)に確保している
だからスタックに乗るのは記述子分だと思うんだけど

どうも見えてこないな
思うに1つの関数内でアレコレやりすぎなんじゃないの?

882 名前:デフォルトの名無しさん mailto:sage [2016/10/14(金) 01:36:56.54 ID:B5drn/wa.net]
今試しに、integer型の配列10万個を

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に書き換えた)のルーチンが使い物にならなくなる。






[ 続きを読む ] / [ 携帯版 ]

前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