|
Помогите разобраться со структурами, Одна структура объявлена в другой |
|
|
|
Dec 5 2016, 17:37
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Компилятор С-Free ошибок не выдает, но виснет при выполнении. Тот же софт в ARM не виснет, но данные через структуру не передает - там мусор. Вот эти структуры: Код struct bme280_calibration_param_t { u16 dig_T1;/**<calibration T1 data*/ s16 dig_T2;/**<calibration T2 data*/ s16 dig_T3;/**<calibration T3 data*/ u16 dig_P1;/**<calibration P1 data*/ s16 dig_P2;/**<calibration P2 data*/ s16 dig_P3;/**<calibration P3 data*/ s16 dig_P4;/**<calibration P4 data*/ s16 dig_P5;/**<calibration P5 data*/ s16 dig_P6;/**<calibration P6 data*/ s16 dig_P7;/**<calibration P7 data*/ s16 dig_P8;/**<calibration P8 data*/ s16 dig_P9;/**<calibration P9 data*/ u8 dig_H1;/**<calibration H1 data*/ s16 dig_H2;/**<calibration H2 data*/ u8 dig_H3;/**<calibration H3 data*/ s16 dig_H4;/**<calibration H4 data*/ s16 dig_H5;/**<calibration H5 data*/ s8 dig_H6;/**<calibration H6 data*/ s32 t_fine;/**<calibration T_FINE data*/ }; struct bme280_t { struct bme280_calibration_param_t cal_param; /**< calibration parameters*/ u8 chip_id;/**< chip id of the sensor*/ u8 dev_addr;/**< device address of the sensor*/ u8 oversamp_temperature;/**< temperature over sampling*/ u8 oversamp_pressure;/**< pressure over sampling*/ u8 oversamp_humidity;/**< humidity over sampling*/ u8 ctrl_hum_reg;/**< status of control humidity register*/ u8 ctrl_meas_reg;/**< status of control measurement register*/ u8 config_reg;/**< status of configuration register*/ }; Далее определяю ссылку: Код static struct bme280_t *p_bme280; /**< pointer to BME280 */ В Main обращаюсь к структуре, заполняя ее поля: Код p_bme280->cal_param.dig_T1 = (u16)1; p_bme280->cal_param.dig_T2 = (s16)2; p_bme280->cal_param.dig_T3 = (s16)3; p_bme280->cal_param.dig_P1 = (u16)4; p_bme280->cal_param.dig_P2 = (s16)5; p_bme280->cal_param.dig_P3 = (s16)6; p_bme280->cal_param.dig_P4 = (s16)7; p_bme280->cal_param.dig_P5 = (s16)8; p_bme280->cal_param.dig_P6 = (s16)9; p_bme280->cal_param.dig_P7 = (s16)10; p_bme280->cal_param.dig_P8 = (s16)11; p_bme280->cal_param.dig_P9 = (s16)12; p_bme280->cal_param.dig_H1 = (s16)13; p_bme280->cal_param.dig_H2 = (s16)14; p_bme280->cal_param.dig_H3 = (s16)15; В том же Main пытаюсь вывести значения: Код printf("\nT1:%x ",p_bme280->cal_param.dig_T1); //0x89 = 0x6C, 0x88 = 0x9E printf("T2:%x ", p_bme280->cal_param.dig_T2); //0x8B = 0x64, 0x8A = 0xFD printf("T3:%x ", p_bme280->cal_param.dig_T3); //0x8D = 0x00, 0x8C = 0x32 printf("P1:%x ", p_bme280->cal_param.dig_P1); //0x8F = 0x93, 0x8E = 0x43 printf("P2:%x ", p_bme280->cal_param.dig_P2); //0x91 = 0xD4, 0x90 = 0xED printf("P3:%x ", p_bme280->cal_param.dig_P3); //0x93 = 0x0B, 0x92 = 0xD0 printf("P4:%x ", p_bme280->cal_param.dig_P4); //0x95 = 0x1D, 0x94 = 0x10 printf("P5:%x ", p_bme280->cal_param.dig_P5); //0x97 = 0xFF, 0x96 = 0xFC printf("P6:%x ", p_bme280->cal_param.dig_P6); //0x99 = 0xFF, 0x98 = 0xF9 printf("P7:%x ", p_bme280->cal_param.dig_P7); //0x9B = 0x26, 0x9A = 0xAC printf("P8:%x ", p_bme280->cal_param.dig_P8); //0x9D = 0xD8, 0x9C = 0x0A printf("P9:%x ", p_bme280->cal_param.dig_P9); //0x9F = 0x10, 0x9E = 0xBD printf("H1:%x ", p_bme280->cal_param.dig_H1); //0xA1 = 0x4B printf("H2:%x ", p_bme280->cal_param.dig_H2); //0xE2 = 0x01, 0xE1 = 0x69 printf("H3:%x ", p_bme280->cal_param.dig_H3); //0xE3 = 0x00 printf("H4:%x ", p_bme280->cal_param.dig_H4); //0xE4 = 0x14, 0xE5[3..0] = 0x00 printf("H5:%x ", p_bme280->cal_param.dig_H5); //0xE6 = 0x00, 0xE5[7..4] = 0x00 printf("H6:%x\r", p_bme280->cal_param.dig_H6); //0xE7 = 0x1E 33 ????? Что здесь не так?
|
|
|
|
|
 |
Ответов
|
Dec 8 2016, 05:40
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Спасибо за развернутый ответ, но речь шла об одном файле. Пост 7 описывает проблему в одном файле. Исходный код (ссылка там же) не использует присваивания p_bme280 = bme280; в каждой функции одного файла. А у меня без этого присваивания (в каждой функции) не работает. Читается мусор. Тестовый вариант (в компиляторе C-Free, функция Main, строка p_bme280 = &bme280_cfg;) просто завершается аварийно без этого присвоения: Код typedef signed char s8;/**< used for signed 8bit */ typedef signed short int s16;/**< used for signed 16bit */ typedef signed int s32;/**< used for signed 32bit */ typedef signed long long int s64;/**< used for signed 64bit */ typedef unsigned char u8;/**< used for unsigned 8bit */ typedef unsigned short int u16;/**< used for unsigned 16bit */ typedef unsigned int u32;/**< used for unsigned 32bit */ typedef unsigned long long int u64;/**< used for unsigned 64bit */
struct bme280_calibration_param_t { u16 dig_T1;/**<calibration T1 data*/ s16 dig_T2;/**<calibration T2 data*/ s16 dig_T3;/**<calibration T3 data*/ u16 dig_P1;/**<calibration P1 data*/ s16 dig_P2;/**<calibration P2 data*/ s16 dig_P3;/**<calibration P3 data*/ s16 dig_P4;/**<calibration P4 data*/ s16 dig_P5;/**<calibration P5 data*/ s16 dig_P6;/**<calibration P6 data*/ s16 dig_P7;/**<calibration P7 data*/ s16 dig_P8;/**<calibration P8 data*/ s16 dig_P9;/**<calibration P9 data*/ u8 dig_H1;/**<calibration H1 data*/ s16 dig_H2;/**<calibration H2 data*/ u8 dig_H3;/**<calibration H3 data*/ s16 dig_H4;/**<calibration H4 data*/ s16 dig_H5;/**<calibration H5 data*/ s8 dig_H6;/**<calibration H6 data*/ s32 t_fine;/**<calibration T_FINE data*/ }; struct bme280_t { struct bme280_calibration_param_t cal_param; /**< calibration parameters*/ u8 chip_id;/**< chip id of the sensor*/ u8 dev_addr;/**< device address of the sensor*/ u8 oversamp_temperature;/**< temperature over sampling*/ u8 oversamp_pressure;/**< pressure over sampling*/ u8 oversamp_humidity;/**< humidity over sampling*/ u8 ctrl_hum_reg;/**< status of control humidity register*/ u8 ctrl_meas_reg;/**< status of control measurement register*/ u8 config_reg;/**< status of configuration register*/ }; static struct bme280_t bme280_cfg; static struct bme280_t *p_bme280; /**< pointer to BME280 */
int main() { p_bme280 = &bme280_cfg; p_bme280->cal_param.dig_T1 = 1; p_bme280->cal_param.dig_T2 = 2; p_bme280->cal_param.dig_T3 = 3; p_bme280->cal_param.dig_P1 = 4; p_bme280->cal_param.dig_P2 = 5; p_bme280->cal_param.dig_P3 = 6; p_bme280->cal_param.dig_P4 = 7; p_bme280->cal_param.dig_P5 = 8; p_bme280->cal_param.dig_P6 = 9; p_bme280->cal_param.dig_P7 = 10; p_bme280->cal_param.dig_P8 = 11; p_bme280->cal_param.dig_P9 = 12; p_bme280->cal_param.dig_H1 = 13; p_bme280->cal_param.dig_H2 = 14; p_bme280->cal_param.dig_H3 = 15; printf("\nT1:%x ",p_bme280->cal_param.dig_T1); //0x89 = 0x6C, 0x88 = 0x9E printf("T2:%x ", p_bme280->cal_param.dig_T2); //0x8B = 0x64, 0x8A = 0xFD printf("T3:%x ", p_bme280->cal_param.dig_T3); //0x8D = 0x00, 0x8C = 0x32 printf("P1:%x ", p_bme280->cal_param.dig_P1); //0x8F = 0x93, 0x8E = 0x43 printf("P2:%x ", p_bme280->cal_param.dig_P2); //0x91 = 0xD4, 0x90 = 0xED printf("P3:%x ", p_bme280->cal_param.dig_P3); //0x93 = 0x0B, 0x92 = 0xD0 printf("P4:%x ", p_bme280->cal_param.dig_P4); //0x95 = 0x1D, 0x94 = 0x10 printf("P5:%x ", p_bme280->cal_param.dig_P5); //0x97 = 0xFF, 0x96 = 0xFC printf("P6:%x ", p_bme280->cal_param.dig_P6); //0x99 = 0xFF, 0x98 = 0xF9 printf("P7:%x ", p_bme280->cal_param.dig_P7); //0x9B = 0x26, 0x9A = 0xAC printf("P8:%x ", p_bme280->cal_param.dig_P8); //0x9D = 0xD8, 0x9C = 0x0A printf("P9:%x ", p_bme280->cal_param.dig_P9); //0x9F = 0x10, 0x9E = 0xBD printf("H1:%x ", p_bme280->cal_param.dig_H1); //0xA1 = 0x4B printf("H2:%x ", p_bme280->cal_param.dig_H2); //0xE2 = 0x01, 0xE1 = 0x69 printf("H3:%x \n", p_bme280->cal_param.dig_H3);//0xE3 = 0x00 return 0; } Вопрос был в том, почему в исходнике нет необходимости писать в каждой функции присвоение p_bme280 = &bme280_cfg;? Повторюсь, все происходит в одном файле.
Сообщение отредактировал Димон Безпарольный - Dec 8 2016, 05:41
|
|
|
|
|
Dec 8 2016, 09:29
|
Участник

Группа: Участник
Сообщений: 56
Регистрация: 3-11-11
Пользователь №: 68 126

|
Цитата(Димон Безпарольный @ Dec 8 2016, 08:40)  Спасибо за развернутый ответ, но речь шла об одном файле. Пост 7 описывает проблему в одном файле. Исходный код (ссылка там же) не использует присваивания p_bme280 = bme280; в каждой функции одного файла. А у меня без этого присваивания (в каждой функции) не работает. Читается мусор. Тестовый вариант (в компиляторе C-Free, функция Main, строка p_bme280 = &bme280_cfg;) просто завершается аварийно без этого присвоения ... Вопрос был в том, почему в исходнике нет необходимости писать в каждой функции присвоение p_bme280 = &bme280_cfg;? Повторюсь, все происходит в одном файле. Что значит присвоение В КАЖДОЙ функции, у вас ведь только одна функция, и эта функция main. Любой указатель перед использованием должен быть инициализирован. Вот вы его в самом начале функции main и инициализируете: Код int main() { p_bme280 = &bme280_cfg; ... Всё правильно А вообще в вашем случае указатель p_bme280 излишен. Вы можете сразу работать с самим объектом: Код static struct bme280_t bme280_cfg;
int main() { bme280_cfg.cal_param.dig_T1 = 1; bme280_cfg.cal_param.dig_T2 = 2; bme280_cfg.cal_param.dig_T3 = 3; ... printf("\nT1:%x ",bme280_cfg.cal_param.dig_T1); //0x89 = 0x6C, 0x88 = 0x9E printf("T2:%x ", bme280_cfg.cal_param.dig_T2); //0x8B = 0x64, 0x8A = 0xFD printf("T3:%x ", bme280_cfg.cal_param.dig_T3); //0x8D = 0x00, 0x8C = 0x32 ...
return 0; }
|
|
|
|
Сообщений в этой теме
Димон Безпарольный Помогите разобраться со структурами Dec 5 2016, 17:37 megajohn Цитата(Димон Безпарольный @ Dec 5 2016, 20... Dec 5 2016, 17:44 Димон Безпарольный И правда. Спасибо. Заработало. Dec 5 2016, 18:01 k155la3 Цитата(Димон Безпарольный @ Dec 5 2016, 21... Dec 6 2016, 06:52 Сергей Борщ QUOTE (k155la3 @ Dec 6 2016, 09:52) ссылк... Dec 6 2016, 07:51  k155la3 Цитата(Сергей Борщ @ Dec 6 2016, 10:51) С... Dec 6 2016, 10:04 Димон Безпарольный Пытаюсь доконца разобраться. Для того, чтобы элеме... Dec 6 2016, 10:10 Lagman Цитата(Димон Безпарольный @ Dec 6 2016, 13... Dec 6 2016, 11:16  Димон Безпарольный Цитата(Lagman @ Dec 6 2016, 14:16) bme280... Dec 6 2016, 13:22   Lagman А как и где у вас объявляются p_BME280 и BME280_cf... Dec 6 2016, 13:55    Димон Безпарольный Цитата(Lagman @ Dec 6 2016, 16:55) А как ... Dec 6 2016, 14:51     conan Цитата(Димон Безпарольный @ Dec 6 2016, 17... Dec 7 2016, 22:49 XVR Цитата(Димон Безпарольный @ Dec 6 2016, 13... Dec 8 2016, 10:28 esaulenka Если эта структура bme280 одна, и размножать их не... Dec 6 2016, 11:02 Lagman А заголовочный файл у вас подключается к двум исхо... Dec 6 2016, 15:59  Димон Безпарольный Цитата(conan @ Dec 8 2016, 12:29) Что зна... Dec 8 2016, 09:41 gerber Значит, ваш код каким-то образом "сносит... Dec 8 2016, 08:55 Lagman Автор топика не может посмотреть соседние файлы в ... Dec 8 2016, 11:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|