- 已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
4天前关闭。
Improve this question
我有一个使用以下C编译器的"遗留"应用程序:
c:\Development\Source\HighSpeedQuote2022\bin>cl /?
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
我使用上面的批处理代码行来编译它。
这个MAKE.BAT文件创建了应用程序的一部分,并产生了一个C DLL,最终由VB6前端调用。我的问题集中在C DLL内部调用的一些初始化代码,这些代码将一个索引变量(通过值传递)发送到一个外部函数调用,而外部函数调用无法传递参数的值。我也在Win7机器上开发。
下面是代码摘录:
- HsCalc6.c函数原型:**
void InitCommonGrData();
- Rating6.c函数原型:**
extern void SaveGearAPI613Data(double n1 , double b , double dw1, int ZE , double ZI , double ZN, double Kv , double KH , double kHP,
double CSF, double SigmaHP, double Pd , double YJ , double SigmaFP, double YN, double KSF, double kFP, int YL ,
double bod, double KHpf , double Paz, double Pay, int ix , int dummy);
调用代码位于HsCalc6.InitCommonGrData中:
for(ix=ix_PINION;ix<=ix_GEAR;ix++)
{
ConvertMsg(ix,"ix = ");
AddLogEntry(moduleName,"InitCommonGrData",msg);
if(ix==ix_PINION) ConvertMsgC("PINION","SaveGearAPI613Data for ");
if(ix==ix_GEAR) ConvertMsgC("GEAR","SaveGearAPI613Data for ");
AddLogEntry(moduleName,"InitCommonGrData",msg);
AddLogEntry(moduleName,"InitCommonGrData","Dummy=58");
// 0 1 2 3 4 5 6 7 8 9
SaveGearAPI613Data(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
// 0 1 2 3 4 5 6 7 8
0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,
// 9 0 1 2 3
0.0,0.0,0.0,0.0,**ix**, 58);
// See RATING6.C for above call
}
AddLogEntry(moduleName,"InitCommonGrData","Exit");
}
外部函数位于Rating6.SaveGearAPI613Data中,如下所示:
extern void SaveGearAPI613Data( double n1 , double b , double dw1, int ZE , double ZI , double ZN, double Kv , double KH , double kHP,
// 0 1 2 3 4 5 6 7 8
double CSF, double SigmaHP, double Pd , double YJ , double SigmaFP, double YN, double KSF, double kFP, int YL ,
// 9 0 1 2 3
double bod, double KHpf , double Paz, double Pay, int ix, int dummy)
{
AddLogEntry(moduleName,"SaveGearAPI613Data","Entry");
ConvertMsg(ix,"ix = ");
AddLogEntry(moduleName,"SaveGearAPI613Data",msg);
if (ix == ix_PINION) {
AddLogEntry(moduleName,"SaveGearAPI613Data","Saving PINION data...");
GrA->A613[ix].HT = Gr->HeatTreat[ix_PINION].i; }
else if(ix == ix_GEAR) {
AddLogEntry(moduleName,"SaveGearAPI613Data","Saving GEAR data...");
GrA->A613[ix].HT = Gr->HeatTreat[ix_GEAR].i; }
GrA->A613[ix].n1 = n1;
GrA->A613[ix].b = b;
GrA->A613[ix].dw1 = dw1;
GrA->A613[ix].ZE = ZE;
GrA->A613[ix].ZI = ZI;
GrA->A613[ix].ZN = ZN;
GrA->A613[ix].Kv = Kv;
GrA->A613[ix].KH = KH;
GrA->A613[ix].kHP = kHP;
GrA->A613[ix].CSF = CSF;
GrA->A613[ix].SigmaHP = SigmaHP;
GrA->A613[ix].Pd = Pd;
GrA->A613[ix].YJ = YJ;
GrA->A613[ix].SigmaFP = SigmaFP;
GrA->A613[ix].YN = YN;
GrA->A613[ix].KSF = KSF;
GrA->A613[ix].kFP = kFP;
GrA->A613[ix].YL = YL;
GrA->A613[ix].bod = bod;
GrA->A613[ix].KHpf = KHpf;
GrA->A613[ix].Paz = Paz;
GrA->A613[ix].Pay = Pay;
ConvertMsg(ix,"ix = ");
AddLogEntry(moduleName,"SaveGearAPI613Data",msg);
AddLogEntry(moduleName,"SaveGearAPI613Data","Exit");
}
以下是DLL日志文件条目:
2023.02.16 11:40:30.40 HsCalc6.54.25.HsCalc6.InitCommonGrData Entry
2023.02.16 11:40:30.40 HsCalc6.54.25.HsCalc6.InitCommonGrData ix = 0
2023.02.16 11:40:30.40 HsCalc6.54.25.HsCalc6.InitCommonGrData SaveGearAPI613Data for PINION
2023.02.16 11:40:30.40 HsCalc6.54.25.HsCalc6.InitCommonGrData Dummy=58
2023.02.16 11:40:30.40 HsCalc6.54.25.Rating6.SaveGearAPI613Data Entry
2023.02.16 11:40:30.40 HsCalc6.54.25.Rating6.SaveGearAPI613Data ix = 0
2023.02.16 11:40:30.42 HsCalc6.54.25.Rating6.SaveGearAPI613Data Saving PINION data...
2023.02.16 11:40:30.42 HsCalc6.54.25.Rating6.SaveGearAPI613Data ix = 0
2023.02.16 11:40:30.42 HsCalc6.54.25.Rating6.SaveGearAPI613Data Exit
2023.02.16 11:40:30.42 HsCalc6.54.25.HsCalc6.InitCommonGrData ix = 1
2023.02.16 11:40:30.42 HsCalc6.54.25.HsCalc6.InitCommonGrData SaveGearAPI613Data for GEAR
2023.02.16 11:40:30.42 HsCalc6.54.25.HsCalc6.InitCommonGrData Dummy=58
2023.02.16 11:40:30.42 HsCalc6.54.25.Rating6.SaveGearAPI613Data Entry
2023.02.16 11:40:30.42 HsCalc6.54.25.Rating6.SaveGearAPI613Data ix = 0
2023.02.16 11:40:30.43 HsCalc6.54.25.Rating6.SaveGearAPI613Data Saving PINION data...
2023.02.16 11:40:30.43 HsCalc6.54.25.Rating6.SaveGearAPI613Data ix = 0
如日志所示,ix var是从InitCommonGrData传递过来的,值为(ix = 1),但是,当SaveGearAPI613Data接收到该参数时,值返回到(ix = 0)。也许我盯着这段代码看得太久了,在这个过程中失明了,但如果有人能提供一些关于为什么会发生这种情况的见解,我将非常感激。
我从重构到上述过程中的内联代码开始,我最后一次尝试修改重构代码是添加一个伪int参数,看看调用时是否会有什么不同。
文档似乎同意参数传递的一般限制设置为127个参数,所以我不认为这是传递大量参数的原因。我怀疑这是stackoverflow中常见的参数传递问题-所以请不要回答基本问题-除非我在做一些愚蠢的事情。
我的期望是应用程序和编译器能像广告中说的那样工作。本质上,按值传递是可行的。也许我需要一个不同的编译器设置,或者需要重新安排代码到同一个模块中,因为调用外部函数的一些缺陷。
1条答案
按热度按时间nqwrtyyt1#
感谢John Bollinger等人。答案在于需要让编译器看到两个C源文件之间的共同点。在本例中,我添加了一个新的Common. h,其中包含两个函数:声明和原型: