Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从VBA传递参数的开关盒-参数不兼容_C++_Vba_If Statement_Dll_Switch Statement - Fatal编程技术网

C++ 从VBA传递参数的开关盒-参数不兼容

C++ 从VBA传递参数的开关盒-参数不兼容,c++,vba,if-statement,dll,switch-statement,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) 用户通过泵的整数类型指定泵。我将这个参数作为ByVal

这是我遇到的一种奇怪的行为。 我为用户提供了一个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)
用户通过泵的整数类型指定泵。我将这个参数作为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:
        //...
   }
尽管事实上typeOfPump被分配给NINE,这显然比一大,但我的函数getPEC此时不会返回。另一方面,如果我写

if (typeOfPump < 1)
        {
            RV = -1;
            return;
        }
并获得正确的值。然而,pec的价值仍有一些变化

SCD编辑:我有64位,Excel是32位,我用x86编译。 我在另一台64位的计算机上写了一个类似的程序,Excel 64位,用x64编译。成功了


在C++环境中,VC++中的< <强> >值> <强>>9 < /强>导致C++中的<强> -65526</>强,在C++环境中给定整数为第三字节。假设整数的16位变量范围为−32768到32767。将32767加倍并减去9通常会导致65525

如果您不确定代码为什么不起作用,请打印出您确定的值,并查看它们是否与您认为的值相同。特别是当混合使用32位和64位代码时。有各种各样的编译器选项,它们在使用时会影响数据格式


将代码编写为独立的exe,确保其正常工作;尽可能简单地使用握手编写dll,确保其正常工作,然后将exe设置为dll。您试图在一个步骤中完成太多的工作。

一般来说,如果您不确定代码为什么不工作,请打印出您确定的值,并查看它们是否与您认为的值相同。特别是当混合使用32位和64位代码时。有各种各样的编译器选项,它们在使用时会影响数据格式


将代码编写为独立的exe,确保其正常工作;尽可能简单地使用握手编写dll,确保其正常工作,然后将exe设置为dll。您试图在一步中完成太多的工作。

我认为这是一个VBA问题,而不是VB.net:
PtrSafe
是一个VBA关键字,用于标记可以从64位Excel安全调用的函数。查看32/64位兼容性。正确,OP还进行了一次编辑,删除了我的注释。VBA
Integer
为16位。您是否已在dll中打印出泵的类型并查看了其值?很抱歉,回复太晚。如果输入值为9,则我的MessageBox打印:-65526。在我的示例中,DLL中的整数变量包含4个字节(使用sizeof运算符)。我还读取了VBA的整数有32位,所以分别有4个字节(比较:),或者我在某个点上被误导了。无论如何,我如何防止这个错误?我认为这是一个VBA问题,而不是VB.net:
PtrSafe
是一个VBA关键字,用于标记可以从64位Excel安全调用的函数。查看32/64位兼容性。正确,OP还进行了一次编辑,删除了我的注释。VBA
Integer
为16位。您是否已在dll中打印出泵的类型并查看了其值?很抱歉,回复太晚。如果输入值为9,则我的MessageBox打印:-65526。在我的示例中,DLL中的整数变量包含4个字节(使用sizeof运算符)。我还读取了VBA的整数有32位,所以分别有4个字节(比较:),或者我在某个点上被误导了。无论如何,我如何防止此错误?这并没有提供问题的答案,您应该将其发布在评论部分。这并没有提供问题的答案,您应该将其发布在评论部分。
if (typeOfPump < 1)
        {
            RV = -1;
            return;
        }
RV = typeOfPump * (int)outflow;