AnsweredAssumed Answered

Warning : C12056 SP debug info incorrect because of optimization or inline assembler

Question asked by Ray Hall on Dec 6, 2016
Latest reply on Dec 7, 2016 by ZhangJennie

I am getting the C12056 warning for the following function.The fuction works perfectly. Can someone explain what is wrong ?

 

int16_t Interpolate3D(uint16_t *table, uint8_t axisXCnt, uint8_t axisYCnt, uint16_t xAxis, uint16_t yAxis)
{
    uint8_t x, y;
    int16_t Q11, Q12, Q21, Q22;
    int32_t val1, val2;
    int32_t interpVal;
    float ratioX, ratioY;

 

    x = 0;
    y = 0;
    Q11 = 0;    // x-axis minimum interpolation value
    Q12 = 0;    // x-axis maximum interpolation value
    Q21 = 0;
    Q22 = 0;


    if (xAxis <= table[0] || xAxis >= table[axisXCnt - 1])
    {
        if (xAxis <= table[0])    // less than minimum x value in table?
        {
            Q11 = table[0];
            Q12 = table[1];
            xAxis = Q11;    // adjust to minimum value
            x = 0;            // AG just to make sure
        }
        if (xAxis >= table[axisXCnt - 1])    // greater than maximum x value in table?
        {
            Q11 = table[axisXCnt - 2];
            Q12 = table[axisXCnt - 1];
            xAxis = Q12;        // adjust to maximum value
            x = axisXCnt - 2;    // AG addition, index to last but one element of x axis
        }
    }
    else    // locate table entries that surround xAxis value
    {
        for (x = 0; x < axisXCnt; x++)
        {
            if (table[x] <= xAxis && xAxis < table[x + 1])
            {
                Q11 = table[x];
                Q12 = table[x + 1];
                break;
            }
        }
    }
    ratioX = (float)(xAxis - Q11) / (float)(Q12 - Q11);


    if ((yAxis <= table[axisXCnt]) || (yAxis >= table[(axisXCnt << 1) - 1]))
    {
        if (yAxis <= table[axisXCnt])
        {
            Q11 = table[axisXCnt];
            Q12 = table[axisXCnt + 1];
            yAxis = Q11;
            y = 0;        // AG just to make sure
        }
        else
        {
            Q11 = table[(axisXCnt << 1) - 2];
            Q12 = table[(axisXCnt << 1) - 1];
            yAxis = Q12;
            y = axisYCnt - 2;
        }
    }
    else
    {
        for (y = 0; y < axisYCnt; y++)    // AG comment - should be axisYCnt-1 but probably works as-is
        {
            if ((table[y + axisXCnt] <= yAxis) && (yAxis <= table[y + axisXCnt + 1]))
            {
                Q11 = table[y + axisXCnt];
                Q12 = table[y + axisXCnt + 1];
                break;
            }
        }
    }
    y += 2;        // offset so that index points to correct real data row

 

    ratioY = (float)(yAxis - Q11) / (float)(Q12 - Q11);
    Q11 = table[x + (axisXCnt * y)];
    Q12 = table[x + (axisXCnt * y) + 1];

 

    Q21 = table[x + (axisXCnt * (y + 1))];
    Q22 = table[x + (axisXCnt * (y + 1)) + 1];

 

    val1 = Q11 + (ratioX * (Q12 - Q11));
    val2 = Q21 + (ratioX * (Q22 - Q21));

 

    interpVal = val1 + (ratioY * (val2 - val1));


    return (int16_t)interpVal;
}

 

Ray.

Outcomes