- PR -

subが2度呼ばれてしまう。

投稿者投稿内容
osa
会議室デビュー日: 2005/03/22
投稿数: 14
投稿日時: 2007-04-13 14:52
引用:

ぶさいくろうさんの書き込み (2007-04-13 13:51) より:
>私なりに調べた事ですが、1回目の流れで問題なくテキストファイル名が引数として渡され、
>コピー処理を行いデータベース登録後、コピー元のテキストファイルを削除された後
>もう一度同じパスでファイルコピーを行なおうとしているようです。

とあったのでああやって書いたんだけど・・・
普通こんなので考えられるのって配列の中身が意図していないか。
はたまた自分の思ったとおりの制御フローを通っていないかでしょ?
実際のところどういう経路で2回実行されるのか書いた方がいいんじゃない?

P.S.
デバッグ実行しているならコンパイラの最適化による不具合の心配はないと思われ。



ぶさいくろうさん、ご意見ありがとうございます。
ご指摘されました文章は、エラー発生後のファイル状況とDB状況を調べた結果の私の憶測になります。
ぶさいくろうさんにウォッチでのデバッグを教えていただく前のエラーの出方を書きます。

プログラム経路(エラーの発生する周辺だけを抜粋します)

  ・
  ・
ファイル検索←---
  ↓       |
ファイルコピー  |
  ↓       |
ファイル読込   |
  ↓       |
DB登録--------
  ・
  ・

まず、ブレイクポイントを設定せずに「Debug.print」を使用してイミディエイトに
配列の中身とファイルコピー処理に渡ったPATHを出力させました。

※[1]は「Call DataCopy(aryFileName(i))」を繰り返すfor文の中にdebug.printを記述
 [2]は「DataCopy」のサブルーチンの変数宣言前に記述

エラーの場合
==========================================================
[1] << 配列要素1
[2] << PATH1
[1] << 配列要素2
[2] << PATH2
[2] << PATH2       ←エラー発生
[1] << 配列要素3
[2] << PATH3
[1] << 配列要素4
[2] << PATH4
[2] << PATH4       ←エラー発生
[1] << 配列要素5
[2] << PATH5
==========================================================
規則性があるのか不明ですが、上記のように出力されます。

狙い通りの処理の場合(コンパイルオプションの「コードのサイズを最適化」を選択)
==========================================================
[1] << 配列要素1
[2] << PATH1
[1] << 配列要素2
[2] << PATH2
[1] << 配列要素3
[2] << PATH3
[1] << 配列要素4
[2] << PATH4
[1] << 配列要素5
[2] << PATH5
==========================================================

以上です。
ご意見お待ちしております。
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2007-04-13 17:04
引用:

osaさんの書き込み (2007-04-13 14:52) より:
引用:

ぶさいくろうさんの書き込み (2007-04-13 13:51) より:
>私なりに調べた事ですが、1回目の流れで問題なくテキストファイル名が引数として渡され、
>コピー処理を行いデータベース登録後、コピー元のテキストファイルを削除された後
>もう一度同じパスでファイルコピーを行なおうとしているようです。

とあったのでああやって書いたんだけど・・・
普通こんなので考えられるのって配列の中身が意図していないか。
はたまた自分の思ったとおりの制御フローを通っていないかでしょ?
実際のところどういう経路で2回実行されるのか書いた方がいいんじゃない?

P.S.
デバッグ実行しているならコンパイラの最適化による不具合の心配はないと思われ。



まず、ブレイクポイントを設定せずに「Debug.print」を使用してイミディエイトに
配列の中身とファイルコピー処理に渡ったPATHを出力させました。

※[1]は「Call DataCopy(aryFileName(i))」を繰り返すfor文の中にdebug.printを記述
 [2]は「DataCopy」のサブルーチンの変数宣言前に記述




デバック文を出力されるなら、下のように出力したほうがいいですよ。
まぁ、ブレークポイントを設定して、トレースすればいいでしょうが・・
※[1]は「Call DataCopy(aryFileName(i))」を繰り返すfor文の中にdebug.printを記述
 [2]は「DataCopy」のサブルーチンの変数宣言前に記述
 [3]は「DataCopy」のサブルーチンを抜ける部分1
 [4]は「DataCopy」のサブルーチンを抜ける部分2

あと、同じデータの場合、必ず同じ結果になりますか?
クイックソートに関係する処理をコメントアウトするとどうなりますか?
osa
会議室デビュー日: 2005/03/22
投稿数: 14
投稿日時: 2007-04-16 09:53
引用:

ゆうじゅんさんの書き込み (2007-04-13 17:04) より:

デバック文を出力されるなら、下のように出力したほうがいいですよ。
まぁ、ブレークポイントを設定して、トレースすればいいでしょうが・・
※[1]は「Call DataCopy(aryFileName(i))」を繰り返すfor文の中にdebug.printを記述
 [2]は「DataCopy」のサブルーチンの変数宣言前に記述
 [3]は「DataCopy」のサブルーチンを抜ける部分1
 [4]は「DataCopy」のサブルーチンを抜ける部分2

あと、同じデータの場合、必ず同じ結果になりますか?
クイックソートに関係する処理をコメントアウトするとどうなりますか?




ゆうじゅんさん、ご意見ありがとうございます。
お返事が週をまたいでしまい、申し訳ございません。
ご指摘いただいた方法でプログラムを実行してみましたら、
下記のように出力されました。

=============================================================
[1] << 配列0       ←1ファイル
[2] << DataCopy開始
[3] << 引数0
[4] << DataCopy終了
[1] << 配列1       ←2ファイル
[2] << DataCopy開始
[3] << 引数1
[4] << DataCopy終了
[1] << 配列2       ←3ファイル
[2] << DataCopy開始
[3] << 引数2
[4] << DataCopy終了
[1] << 配列3       ←4ファイル
[2] << DataCopy開始
[3] << 引数3
[4] << DataCopy終了
[1] << 配列4       ←5ファイル
[2] << DataCopy開始
[3] << 引数4
[4] << DataCopy終了
[1] << 配列5       ←6ファイル
[2] << DataCopy開始
[3] << 引数5
[4] << DataCopy終了
=============================================================

また同じデータを使用する事やクイックソートをコメントアウトしましても
同じ出力結果でした。

今、試しにコンパイルオプションを元に戻しましたら、狙い通りの処理結果となりました。

ネイティブ コード コンパイル
 コードのサイズを最適化
     ↓
ネイティブ コード コンパイル
 コードの実行速度を最適化

あの現象がなぜ起きるのか調べてみたいと思います。
osa
会議室デビュー日: 2005/03/22
投稿数: 14
投稿日時: 2007-04-16 11:19
subが二度呼ばれてしまう原因が見えてきました。
ファイルコピー処理の中でファイルサイズチェックを行なっているのですが、
SleepAPIを使用して、ファイルサイズに変更がないかをfor文の中でチェックしているのですが
どうやら、ここでの私の記述がおかしいようです。

もう少し調べてみます。
osa
会議室デビュー日: 2005/03/22
投稿数: 14
投稿日時: 2007-04-16 11:44
原因がわかりました。
DoEventsの使用方法を誤っていました。
お騒がせしてしまい申し訳ございません。

下記は私が誤っていた記述方法を指摘するMSDNのヘルプ文です。

========================================================================
DoEvents 関数を使用して制御を戻した場合、予期しない動作になることがあります。
たとえば、次に示す Click イベント プロシージャでは、ボタンがクリックされてから
10 秒間待機した後、メッセージが表示されます。

待機中に同じボタンがクリックされた場合、
また、このイベント プロシージャが呼び出されます。
後から呼び出されたプロシージャから先に終了します。
========================================================================

今後は、よく調べてからこの会議室を利用させていただきます。
ご意見をいただいた皆さん、ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)