Я искал и нашел много похожих вопросов (с несомненно хорошими ответами), но я не нашел тот, который полностью понимаю. Я нашел решение, которое работает, и я действительно просто пытаюсь понять, что я делаю неправильно в первом примере ...
Я написал функцию, которая вычисляет шаг / крен из raw значения акселерометра с объявлением:
uint8_t calcPitchRoll (imu_t * imu, float * pitch, float * roll);
Вызывающая функция выглядит следующим образом (номера строк для справки):
518 float * pRollValue, * pPitchValue; // prepare pointers to floats to store results
519 *pRollValue = 0; // initialize variables
520 *pPitchValue = 0; // initialize variables
521 calcPitchRoll (imu, pPitchValue, pRollValue);
Однако это приводит к предупреждениям компилятора:
main.c:519:25: warning: 'pRollValue' may be used uninitialized in this function
main.c:521:26: warning: 'pPitchValue' may be used uninitialized in this function
Однако работает следующее:
float PitchValue, RollValue = 0;
float * pRollValue = &RollValue;
float * pPitchValue = &PitchValue;
calcPitchRoll (imu, pPitchValue, pRollValue);
Мне кажется, что оба примера имеют одинаковое «состояние» при вызове функции calcPitchRoll, но компилятор не согласен.
То, что я (думаю, я) понял, это то, что *pRollValue = 0
записывает это значение в переменную, так что я бы подумал, что в этой точке переменной выделено место и значение. Это неправильное понимание?