- 【QBASIC互換!?】FreeBasic【GPL】
946 :デフォルトの名無しさん[]:2016/12/03(土) 12:38:01.18 ID:HN6NcG00 - http://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 に変わる手法を探している。 'http://microsoft.public.jp.access.narkive.com/VGCEWUUt が理解できた方法だが、よくわからないので、INIファイルを使う方法を検討中 起動直後にRename する方法もあるが、分割LOADをWinが使っていた場合に、絶望的な状況に陥りやすい。
| - くだすれFORTRAN(超初心者用)その6
926 :デフォルトの名無しさん[]:2016/12/03(土) 20:32:29.57 ID:HN6NcG00 - >>924
最適解を求める方法は、刻み値の変更方法を含めて UP応用数学選書7 最小二乗法による実験データ解析 プログラムSALS https://www.utp.or.jp/bd/978-4-13-064067-1.html にくわしい。大学系の図書館ならおいてあるはず。 境界値があって、連続計算できない場合に 最小二乗法だと、不安定になりやすいので、収束が悪いけど、絶対値法 残差二乗和の極小値ではなく、残差絶対値和の極小値を求めると、収束まで2-3倍の回数を計算しなければならないけど、安定しやすい。 残差が増加したときに、一旦計算を打ち切って、解を出力する。 出力した解を初期値として、刻み幅を1/10位(2進数の関係で1/8か1/16)に減らして、再度計算する。 収束で、計算機Eの1024倍ぐらいまでが積分を求めた時の1桁の精度になる(こっちの経験値、問題と演算系によっては大幅に変わる)ので Y=F(X)の、Xを少しずらした時の値を計算して、このくらいずれる値を見つけておいてくれ。 左(0)から近づけた場合と右(∞)から近づけた場合に、不連続点の付近で、制度が大きく変わる。 こっちが取り扱った問題では、右からは1程度、左からは1E-12程度、計算機Eの影響を受ける。 こんな場合には、最小二乗法・絶対値法ともに使えない。OR https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%BA%E3%83%BB%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%81 を使う。 一次方程式の場合には、計算方法が規定されているが、 他の場合には、 適当な初期値を使って計算して、少しずらした値を計算して、極小値を初期値にして再度計算、 の繰り返しになる。不連続点は計算しない。 「少しずらした値」は1/1024を使って、その後1/2づつ減らした。 収束はかなり悪い。3000-5000回の繰り返し演算が必要だった。 計算機Eによる影響は、この方法で求めた。 なお、温度の変化を追いかける計算ではないので、参考にならないかもしれない。
| - 【QBASIC互換!?】FreeBasic【GPL】
947 :デフォルトの名無しさん[]:2016/12/03(土) 22:43:19.48 ID:HN6NcG00 - >>946 のつづき。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
| - 【QBASIC互換!?】FreeBasic【GPL】
948 :デフォルトの名無しさん[]:2016/12/03(土) 22:44:41.89 ID:HN6NcG00 - 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 (CommonStringSetFig = 0) then IAA = Local_CommonStringSet(ReadActionType) 'Const DoubleBootSecName As String = "DoubleBoot" (大域) IAA = IniFileRead2(CtrlFile5String, DoubleBootSecName, AppExeNameString, BootCount) DoubleBootChick = (BootCount = 1) End Function
| - 【QBASIC互換!?】FreeBasic【GPL】
949 :デフォルトの名無しさん[]:2016/12/03(土) 22:54:02.60 ID:HN6NcG00 - 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
| - 【QBASIC互換!?】FreeBasic【GPL】
950 :デフォルトの名無しさん[]:2016/12/03(土) 22:55:18.26 ID:HN6NcG00 - 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
| - 【QBASIC互換!?】FreeBasic【GPL】
951 :デフォルトの名無しさん[]:2016/12/03(土) 22:59:53.72 ID:HN6NcG00 - 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
| - 【QBASIC互換!?】FreeBasic【GPL】
952 :デフォルトの名無しさん[]:2016/12/03(土) 23:03:27.50 ID:HN6NcG00 - 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 >>947-952(たぶん) がINIファイルを使った重複起動禁止
|
|