从VBA传递参数的Switch Case - 参数不兼容

时间:2015-09-04 07:55:30

标签: c++ vba if-statement dll switch-statement

这是一种奇怪的行为,我叮叮当当。 我有一个用户的Visual Basic界面。

Declare PtrSafe Sub getPEC _
Lib "C:\Users\...somePath...\OPunit0011PUMP.dll" _
(ByVal typeOfPump As Integer, _
ByVal outflow As Double, _
ByRef pec As Double, _
ByRef RV As Integer)

用户通过整数typeOfPump指定泵。我将此参数作为ByVal typeOfPump传递给我的C ++ DLL。 根据哪个泵,它是一些预先声明的参数a,... g使用开关盒

进行初始化
extern "C"

{

double PEC_backUp;

void __stdcall getPEC(int typeOfPump, double outflow, double &PEC, int &RV)
{
    //polynomal trendline for different pumps
    //y = a x^6 + b x^5 + c x^4 + d x^3 + e x^2 + f x^1 + g x^0
    if (typeOfPump < 1)
    {
        RV = -1;
        return;
    }

    double a, b, c, d, e, f, g;
#pragma region switch case
    switch (typeOfPump)
    {

        //150 bar
    case 1:
        a = 1.1186E-08;
        b = -1.49172E-05;
        //...
        break;
   case 2:
        //...
   }

我的问题是开关盒不起作用。我的默认值设置为9,但每个其他情况都不起作用。它只是忽略了开关案例代码。 另请注意:在If条件中可以看到相同的奇怪行为:

if (typeOfPump > 1)
    {
        RV = -1;
        return;
    }

尽管typeOfPump被分配给 NINE ,这明显大于我的函数getPEC此时没有返回。另一方面,如果我写

if (typeOfPump < 1)
        {
            RV = -1;
            return;
        }

我的功能将返回此处。然后我将typeOfPump的值分配给RV以在VBA中监视它,并将RV设置为9。

此外,为了使事情更奇怪,当它返回RV = -1时,它会自动将pec的值更改为7.00000000005821(使用VBA的监视功能)。

我猜我的参数在某种程度上与我的DLL中的操作不兼容。之前有没有人看到这个,我该如何解决? 提前谢谢!

编辑:我可以执行

等操作
RV = typeOfPump * (int)outflow;

并获得正确的值。但是,pec仍然显示出其价值的一些变化。

SCD编辑:我有64位,Excel是32位,我正在使用x86进行编译。 我在另一台64位计算机上写了一个类似的程序,Excel 64bit,用x64编译。它有效!

第3次编辑: VBA中值 9 的整数在C ++环境中导致 -65526 ,给定C ++环境中的整数大小为4个字节。假设整数的16位变量范围是 -32,768到32,767 。加倍32,767并减去 9 会导致 65525

1 个答案:

答案 0 :(得分:0)

通常,如果您不确定代码为何无法正常工作,请打印出您确定的值,然后查看它们是否确实如您所想。特别是如果混合使用32位和64位代码。各种各样的编译器选项都会在使用时影响数据格式。

将您的代码编写为独立的exe,请确保其可以运行;尽可能简单地用握手方式编写dll,确保其有效,然后使您的exe成为dll。您试图一步一步做太多事情。