トップページ > プログラム > 2016年12月03日 > HN6NcG00

書き込み順位&時間帯一覧

8 位/208 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000001000000010518



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【QBASIC互換!?】FreeBasic【GPL】
くだすれFORTRAN(超初心者用)その6

書き込みレス一覧

【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ファイルを使った重複起動禁止


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。