这是一种奇怪的行为,我叮叮当当。 我有一个用户的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 。
答案 0 :(得分:0)
通常,如果您不确定代码为何无法正常工作,请打印出您确定的值,然后查看它们是否确实如您所想。特别是如果混合使用32位和64位代码。各种各样的编译器选项都会在使用时影响数据格式。
将您的代码编写为独立的exe,请确保其可以运行;尽可能简单地用握手方式编写dll,确保其有效,然后使您的exe成为dll。您试图一步一步做太多事情。