静态Double在传递给方法时会改变值吗?

时间:2012-10-27 04:15:43

标签: c++ double undefined-behavior denormalized

编辑:问题解决了!对不起伙计们,我现在觉得很蠢。

首先,我错误地看到串口上输出的数据不好。我看到了糟糕的数据,但实际上是来自INTEGER,而不是双打。然后,在做了一些测试之后,我注意到整数中的坏数据实际上并不是随机的,但实际上是科学记数法中的正确数据。

回到xAxis的课堂,并意识到我没有一个整数类型的重载方法,所以我试图通过一个圆孔推一个方形钉。


这一天一直让我发疯。基本上,我有一组静态双精度值,它们在传递给特定方法时会发生变化。

有问题的方法

long DriveController::GoToPositionX(
        int pos, double accel, double decel, double velocity)
{
    xAxis.ClearQue();

    xAxis.AppendCmd(xAxisDriveId, "RS");
    xAxis.AppendCmd(xAxisDriveId, "SP");
    xAxis.AppendCmd(xAxisDriveId, "AC", accel);
    xAxis.AppendCmd(xAxisDriveId, "DE", decel);
    xAxis.AppendCmd(xAxisDriveId, "VE", velocity);
    xAxis.AppendCmd(xAxisDriveId, "FP", pos);
    xAxis.AppendCmd(xAxisDriveId, "IP");
    xAxis.AppendCmd(xAxisDriveId, "IP");

    return xAxis.ContinueQue();
}

变量声明:

long lLastError = ERROR_SUCCESS;

static double accel, decel, velocity, jogAccel, jogDecel, jogVelocity;

static int absPosMAHI, absPosSAGNAC, absPosSutter, absPosHICO;

char portNum[16] = {NULL};

static DriveController driveController;
static INIReadWrite configIni;

调用该函数:

case IDB_FP_MAHI:
    driveController.GoToPositionX(absPosMAHI, accel, decel, velocity);
    SetFocus(hwnd); //Return focus to the parent window. Without this, focus will be stuck on the button
    return 0;

所以基本上,我在方法调用中设置断点,在方法的另一个内部,在第二个断点处,值是一些荒谬的数字,通常是非规范化数字。但是,如果我传递一个常量(goToPositionX(var,5.0,3.0等)),一切都很顺利。作为参考传递也没有帮助。

我也可以确认一下,因为代码是与步进电机驱动器通信,如果我看串口,我会看到未定义的值。

我觉得这是微不足道的事情,但我很难过。

编辑:我也应该指出,整数都很好。只有双打才会变得古怪。

编辑:变量定义:

 int InitCfgParams(
    INIReadWrite * configIni,
    double * jogAccel, double * jogDecel, double * jogVelocity,
    double * accel, double * decel, double * velocity,
    char portNum[],
    int * preset1, int * preset2, int * preset3, int * preset4)
{
    char absPos[] = "ABS_POS";
    char moveParam[] = "MOVE_PARAMS";

    //...
    //a bunch of things are defined in here that don't pertain to this question
    //...

    *accel = configIni->LoadDouble(moveParam, "accel");
    if(accel == NULL){
        return 1;
    }

    *decel = configIni->LoadDouble(moveParam, "decel");
    if(decel == NULL){
        return 1;
    }

    *velocity = configIni->LoadDouble(moveParam, "velocity");
    if(velocity == NULL){
        return 1;
    }

    configIni->LoadChar("SETUP", "com", portNum);
    if(portNum == NULL){
        return 1;
    }

    return 0;
}

0 个答案:

没有答案