none
VBA→C→VBAの戻り値がオーバフロー RRS feed

  • 質問

  • いつもお世話になっております。

     

    VBAからCで作ったDLL内関数を呼び出して計算し結果を受け取ったとき、VBA側で

    「実行時エラー6 オーバーフリーしました。」

    というエラーメッセージが出ることがあります。

    Cでdoubleの値をVBAでDoubleで受け取っているのですが、

    常にこのエラーが出るということでもないので困っています。

    どのような原因が考えられますでしょうか?

    なお、C単独で同じ引数で計算を行ったときは正しく結果が出力されます。
    2008年7月11日 11:25

回答

  • 試してみたところ、……

    4 の場合、AREI 関数の log(dbSub) の部分で、dbSub が 0 未満になるようです。

    それで無効操作となりますが、なぜか VBA(Excel) ではオーバーフローと報告されます。

    PTuDuC から戻る前に例外をクリアすると、エラーになりません。

     

    #ちょっと複雑なプログラムなので、私のほうで何か勘違いしている可能性もあります。

    2008年7月14日 11:36

すべての返信

  •  ライト さんからの引用

    どのような原因が考えられますでしょうか?

    今の情報ですと、全く同じ現象の経験者しか回答できません。

     

    どのようなコードでエラーが出ているか、さらなる情報を示すことはできますか?

    2008年7月13日 1:35
    モデレータ
  • 少し長いですが、下記がコードの全部です。宜しくお願いします。

     

    すべてを残しておくことはできないので、一部だけにします。すみません。

     

    //内側の積分
    double AREI(double DS, double s, long DN)
    {

       中略

       while(1){
          X1 = X0 + SS;
          X2 = X1 + SS;
          G1 = SP * exp(-X1 * X1 / 2);
          G2 = SP * exp(-X2 * X2 / 2);
          F1 = 0;
          F2 = 0;

          中略

          dbSub = fabs(SS) / 3 * (F0 + 4 * F1 + F2);
          dbTemp += dbSub;
          if (exp(log(dbSub)-log(dbTemp)) < cnsA) break;

          X0 = X2;
          F0 = F2;
          SS *= cnsC;
     }

     return dbTemp;
    }

    2008年7月14日 1:49
  • 誘導すべき方向性を誤ったようです。申し訳ない。

     

     ライト さんからの引用

    常にこのエラーが出るということでもないので困っています。

    全て同じ引数でも出たり、出なかったりということですか?

    特定の引数で100%発生するのであれば、原因の絞り込みの可能性はあります。

     

     ライト さんからの引用

    なお、C単独で同じ引数で計算を行ったときは正しく結果が出力されます。

    100%再現する引数が分かっているのであれば、C単独で呼び出したときに戻り値がどうなっているかといったものも見るべき要素でしょうか。

     

    あとは、VBAでのDeclare文も気にはなります。

    2008年7月14日 5:40
    モデレータ
  • 必ずエラーとなる引数はこちらです。

    PTuDuC(0.697050003509544, 17, 2, 配列 ,1 ,0 ,0 )

    配列は、

    5 0

    0 4

    の二次元配列です。ここで4を5に変えるとVBAでもエラーになりません。

    この引数でC単独で動かした場合、エラーとはなりません。

     

    VBA側のDeclare分はこちらです。

    Private Declare Function PTuDuC Lib "SSRILibraryC.dll" _
       Alias "_PTuDuC@32" (ByVal dbT As Double, _
       ByVal lngDf As Long, ByVal lngLvl As Long, _
       ByRef adbN() As Double, ByVal lngMETHOD As Long, _
       ByVal lngHypo As Long, ByVal lngFirst As Long) As Double

    2008年7月14日 9:01
  •  ライト さんからの引用

    必ずエラーとなる引数はこちらです。

    PTuDuC(0.697050003509544, 17, 2, 配列 ,1 ,0 ,0 )

    その引数でC言語だけで呼び出した場合の戻り値となるdouble型の値は何になっているんですか?

    2008年7月14日 9:10
    モデレータ
  • 試してみたところ、……

    4 の場合、AREI 関数の log(dbSub) の部分で、dbSub が 0 未満になるようです。

    それで無効操作となりますが、なぜか VBA(Excel) ではオーバーフローと報告されます。

    PTuDuC から戻る前に例外をクリアすると、エラーになりません。

     

    #ちょっと複雑なプログラムなので、私のほうで何か勘違いしている可能性もあります。

    2008年7月14日 11:36
  • VB6での話しになりますが、VB6で発生する例外は0xC000008F: Float Inexact Resultを使って実装されていたと思います。

    そのためVB側へこの例外を投げるとまったく関係ないVB例外に変換されてしまうことがありました。

    今回のVBAでのオーバーフローの報告も同じ現象ではないでしょうか。

    2008年7月14日 12:08
  • Abstractさん

    なんとすばらしい!解決しました!本当にありがとうございました。

    僕ひとりではきっと解決できなかったと思います。

     

    C.Johnさん

    なるほどー。参考になります。エラーが起きたことは確かでもその内容は疑問符ってことですね。

     

     

    2008年7月15日 1:55