実行時エラー70について


ペペロン  2004-09-18 06:29:31  No: 116368

自作したプログラムで、ある計算をした結果をCommonDialog
を使用してファイルに出力しています。
この作業を5000回ぐらいするのですが、計算途中で
「実行時エラー"70"書き込みできません。」
というメッセージがでます。
これは、どういうことなのでしょうか。


通りすがり  2004-09-18 08:37:49  No: 116369

そんな質問の仕方だと誰も答えないよ。
どうやってそのエラーを再現させればいいの??

どんな計算かもわからない
どのタイミングで書き込んでるかもわからない
エラーが起きてるタイミングすらわからない

説明下手ならソースをだしてください。


ペペロン  2004-09-18 09:49:42  No: 116370

そうですよね。どうもすいません。
説明が下手なので、ソースを書きます。

For i=1 to 10000
 call keisan
 CommonDialog1.filename = "kekka.dat"               
  If i = 1 Then
    Open CommonDialog1.filename For Output As #5
    Print #5, kotae(i)
  ElseIf 1 < i < 10000 Then
    Print #5, kotae(i)
  Else
    Print #5, kotae(i)
    Close #5
  End If
If i > 10000 Then GoTo 15
15:
next i

keisan という計算サブルーチンでは、Shellを使いexeファイルを
実行しkotae(i)を算出しています。
ここでは、エラーは発生していません。

現在、パソコンを2台使用して計算しているのですが、
このプログラムを作成したパソコンではエラーは発生していません。
しかし、作成したプログラムを別のパソコンに移して計算すると、
エラーが発生します。

”vb 実行時エラー70”でネット検索すると、
http://support.microsoft.com/default.aspx?scid=kb%3Bja%3B257757
というのがあり、officeの問題なのかもしれません。
しかし、パソコンに詳しくないのでよくわかりません。

まだ、説明不足かもしれませんがよろしくお願いします。


魔界の仮面弁士  2004-09-18 12:13:31  No: 116371

> 説明が下手なので、ソースを書きます。
掲示板上に直接書くのではなく、現象を再現できるコードを貼って下さい。

>  ElseIf 1 < i < 10000 Then
少なくとも、上記のコードはおかしいですよね。
(この式だと、常にTrueとなってしまいますから…)

本当は、
   ElseIf 1 < i And i < 10000 Then
と書きたかったのですよね?


ぺペロン  2004-09-19 09:05:02  No: 116372

すいません。
コードは長いので書き込みました。

コードを貼りたいのですが、とても長いです。よろしいのでしょうか?


Dental  2004-09-19 11:03:12  No: 116373

> コードは長いので書き込みました。
??

> コードを貼りたいのですが、とても長いです。よろしいのでしょうか?
もちろん駄目でしょう。

こういう時は、コードの全文を貼るのではなく、現象を再現可能な
最低限のコードを貼ってください。

第3者でも検証可能なコードが掲載されれば、原因の特定も容易になりますが、
長いコードがそのまま貼られるのは、聊か問題です。
(デバッグは、あくまで本人がやるべき事ですし)

まずは「エラーが起きる最低限のコード」を作るためにも、
現在のコードのどの行でエラーが発生しているのかを突き止めて下さい。
どこでエラーが起きているのかさえ分からない状態で質問しても、
有効な回答は得られないでしょうから…。


ペペロン  2004-09-21 07:35:28  No: 116374

何度もみなさんすいません。
どこでエラーが起こっているかわかりました。
exeファイルを使い計算しているのですが、
おかしい条件の時にexeファイルが無限ループに陥る
ことがあり、ある時間が経過した時exeファイルを強制的に
終了させていました。この次の条件を計算する時にエラーが
起こっていました。強制的に終了した時に、時間を空けてやると
うまく実行できました。

<時間を空けてやるところ>
Public Function WaitTimer(SC As Single) As Double
  Dim sv As Single
  sv = Timer
  Do Until Timer > sv + SC
    DoEvents
  Loop
  WaitTimer = Timer
End Function

<exeファイルの計算>
 Dim Ret
 STRDATA = ""
 '****** exeファイルが終了するまで待機する ******
    lngProcessID = Shell("D:\VB\Kaiseki.exe", vbNormalFocus)
    hProcess = OpenProcess(SYNCHRONIZE Or PROCESS_TERMINATE, True, lngProcessID)
    ShellEnd (lngProcessID)
    Call TerminateProcess(hProcess, 0&)
    Call CloseHandle(hProcess)
    If ti >= 10 Then  
     WaitTimer 0.1
    End If
上の3行を追加。

<exeファイルの終了まで待機>
Private Sub ShellEnd(ProcessID As Long)
    Dim hProcess As Long
    Dim EndCode As Long
    Dim EndRet   As Long
     hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, ProcessID)
  ti = 0
    Do         '10秒経過するとexeファイルを終了させる
      If ti > 10 Then GoTo 2
        EndRet = GetExitCodeProcess(hProcess, EndCode)
        DoEvents
    Loop While (EndCode = STILL_ACTIVE)
2:
     EndRet = CloseHandle(hProcess)
End Sub


ひろ  2004-09-24 20:17:01  No: 116375

今頃遅いかもしれませんが、

Timer関数は日付が変わると0に戻ることをので処理の終了判定に使うと
日付の変わる直前に起動した処理が永久に終わらないことがあります。

今回みたいに短い時間の処理なら無限ループに嵌る可能性は低いですけど。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加