# 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.