C/C++外部函数调用无法按值传递参数[已关闭]

nx7onnlm  于 2023-02-21  发布在  C/C++
关注(0)|答案(1)|浏览(218)

编辑问题以包含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中常见的参数传递问题-所以请不要回答基本问题-除非我在做一些愚蠢的事情。
我的期望是应用程序和编译器能像广告中说的那样工作。本质上,按值传递是可行的。也许我需要一个不同的编译器设置,或者需要重新安排代码到同一个模块中,因为调用外部函数的一些缺陷。

nqwrtyyt

nqwrtyyt1#

感谢John Bollinger等人。答案在于需要让编译器看到两个C源文件之间的共同点。在本例中,我添加了一个新的Common. h,其中包含两个函数:声明和原型:

#include "Common.h"

void    InitCommonGrData();

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);

相关问题