printf导致代码崩溃

时间:2013-12-10 13:27:24

标签: c visual-studio-2008 windows-ce

我正在开发MODBUS创建库。库正常用于测试目的我正在使用基于Modbus的功率计。我面临一个非常奇怪的问题。 尝试使用printf在控制台上打印值。通过并排获取第一个值我打印它,第二个获取值正确地进入数组,但使用pritnf代码时会崩溃。 :( 我也尝试调试代码,并开始知道使用printf作为第二次代码崩溃的值。

以下是代码的一部分:

int wmain(void)
{
    FLOAT dataFloat[5] = {0};
    CHAR dataBuffer[200] = {0};
    // Initializing Structure declared in library header
    psModbusRTU pModbus =(psModbusRTU)malloc(sizeof(psModbusRTU)); 

    // Array pointer to store data
    BYTE *readData = (BYTE *) malloc(NUMBER_OF_READ_REGISTERS * sizeof(BYTE));
    memset(readData, 0, NUMBER_OF_READ_REGISTERS * sizeof(BYTE));   

    // Function to read the voltage
    if (!ModbusRTUReadRegister(pModbus, FC_READ_HOLDING_REGISTERS, VOLTAGE_REGISTER_ADDRESS, NUMBER_OF_READ_REGISTERS, readData))
    {
        printf("\nERROR Read register error %d", GetLastError());
        getchar();
        return 0;
    }
    dataFloat[0] = hexToFloatPointConversion(readData);
    printf("\nvoltage : %f", dataFloat[0]);  //(THIS IS FIRST PRINTF TILL HERE CODE IS FINE)

    /// Function reads the frequnecy
    if (!ModbusRTUReadRegister(pModbus, FC_READ_HOLDING_REGISTERS, FREQUENCY_REGISTER_ADDRESS, NUMBER_OF_READ_REGISTERS, readData))
    {
        printf("\nERROR Read register error %d", GetLastError());
        getchar();
        return 0;
    }
    dataFloat[1] = hexToFloatPointConversion(readData); // Saving frequency value in array
    printf("\nFrequency : %f", dataFloat[1]); // (THIS IS WHERE PROBLEM ARISES CODE CRASH WITH NO REASON)

hexToFloatPointConversion功能:

FLOAT hexToFloatPointConversion(BYTE *readData)
{
    DWORD dataHex = 0;
    DWORD exponent = 0;
    DWORD fraction = 0;
    DWORD signBit = 0;
    FLOAT dataFloat = 0;

    /// Saving BYTE array data into one DWORD
    dataHex = readData[0];
    dataHex = dataHex << 8;
    dataHex = dataHex + readData[1];
    dataHex = dataHex << 8;
    dataHex = dataHex + readData[2];
    dataHex = dataHex << 8;
    dataHex = dataHex + readData[3];    

    /// Getting sign bit, exponent and fraction
    signBit = dataHex >> 31;
    exponent = (dataHex >> 23 & 0xFF);
    fraction = dataHex & 0x7FFFFF;

    /// Calculation for converting data into float.
    dataFloat = (pow(2, (exponent - SINGLE_PRECISION_CONSTANT)) * ( 1 + (fraction * pow(2, -23))));

    return dataFloat;
}

psModbusRTU结构:

typedef struct sModbusRTU
{   
    HANDLE  hModbus; 
    BYTE    slaveNumber;
    BYTE    functionCode;           
    BOOL    fModbusInitialize;
    BOOL    fSlaveAddress;   
    BOOL    fModbusOpen;
    BOOL    fException; 
    WCHAR   portName[16];
    DWORD   exceptionData;
    DCB     dcb;
}sModbusRTU, *psModbusRTU;

试图在运行时调试并查看拆卸断点,但没有确切地知道它为什么会发生。 这是拆卸:

40050658  str         r3, [sp, #0x14] 
4005065C  str         r5, [sp, #8] 
40050660  str         r2, [sp] 
40050664  str         r4, [sp, #4] 
40050668  bl          40031078 
4005066C  __debugbreak_ce         //Break point
40050670  mvn         r3, #0x37, 24 
40050674  eor         r3, r3, #0xAB 
40050678  ldr         r2, [r3] 
4005067C  movw        r3, #0xF7F8 
40050680  movt        r3, #0xF101 

请帮帮我,因为这个小问题,我的项目被困在中间。 请尽快回复

2 个答案:

答案 0 :(得分:1)

错误的尺寸传递给malloc()

// was psModbusRTU pModbus =(psModbusRTU)malloc(sizeof(psModbusRTU));
// -----------------------------------------------v--------------
psModbusRTU pModbus = (psModbusRTU) malloc(sizeof(*psModbusRTU));  

建议替代malloc()成语。使用sizeof(*target)
此外,除非编译器需要它(它不应该),否则建议删除强制转换

// example
psModbusRTU *pModbus = malloc(sizeof(*pModbus));

答案 1 :(得分:0)

%f说明符期望格式化double(8个字节)而不是float(4个字节)(请参阅this MSDN page for details。尝试将值转换为doubleprintf语句中,例如printf("\nvoltage : %f", (double) dataFloat[0]);