реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
gerber
сообщение Dec 8 2016, 08:55
Сообщение #16


Знающий
****

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



Значит, ваш код каким-то образом "сносит" значение указателя на структуру, модифицирует его, т.е. где-то есть memcpy() или что-то подобное, которое выходит за пределы выделенной под приемный буфер памяти, и залезает на указатель. Смотрите map-файл в части размещения указателя и самой структуры.
Возможно, ваши функции вызываются ДО функции, в которой инициализируется указатель. В этом случае он должен быть нулевым.
Нужно поставить отладочный вывод значения указателя перед присвоением в каждой функции и посмотреть глазами его значение, туда ли он указывает, на адрес ли структуры (из map-файла)
Ещё я сталкивался с похожим поведением, когда указатель передавался в функцию с приведением его типа, при этом он "округлялся" из-за выравнивания доступа, и вся структура "съезжала" на 1 байт. Всё это можно увидеть, если поставить отладочный вывод значения указателя.


--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
Go to the top of the page
 
+Quote Post
conan
сообщение Dec 8 2016, 09:29
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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;
}
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Dec 8 2016, 09:41
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(conan @ Dec 8 2016, 12:29) *
Что значит присвоение В КАЖДОЙ функции, у вас ведь только одна функция, и эта функция main.

Это пример, может быть не очень удачный. В реальном коде подобных функций десяток и в каждой приходится прописывать.

Цитата(conan @ Dec 8 2016, 12:29) *
А вообще в вашем случае указатель p_bme280 излишен.

Лучшее решение. Спасибо. Но оно уводит в сторону от проблемы, которую я пока не могу решить. В дальнейшем эти грабли меня еще достанут...

Я пытался вне функции Main глобально присвоить:

Код
static struct bme280_t bme280_cfg;
static struct bme280_t *p_bme280; /**< pointer to BME280 */
p_bme280 = &bme280_cfg;


Но на последнюю строчку копилятор ругается:

--------------------Configuration: mingw5 - CUI Debug, Builder Type: MinGW--------------------

Цитата
Checking file dependency...
Compiling D:\8051\CFree\Test\Struct_CFREE.c...
[Error] D:\8051\CFree\Test\Struct_CFREE.c:46: error: conflicting types for 'p_bme280'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:45: error: previous declaration of 'p_bme280' was here
[Warning] D:\8051\CFree\Test\Struct_CFREE.c:46: warning: initialization makes integer from pointer without a cast
[Warning] D:\8051\CFree\Test\Struct_CFREE.c:46: warning: data definition has no type or storage class
[Warning] D:\8051\CFree\Test\Struct_CFREE.c:51: warning: assignment makes integer from pointer without a cast
[Error] D:\8051\CFree\Test\Struct_CFREE.c:52: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:53: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:54: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:55: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:56: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:57: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:58: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:59: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:60: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:61: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:62: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:63: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:64: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:65: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:66: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:68: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:69: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:70: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:71: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:72: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:73: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:74: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:75: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:76: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:77: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:78: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:79: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:80: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:81: error: invalid type argument of `->'
[Error] D:\8051\CFree\Test\Struct_CFREE.c:82: error: invalid type argument of `->'
Complete Make Struct_CFREE: 32 error(s), 3 warning(s)






Сообщение отредактировал Димон Безпарольный - Dec 8 2016, 09:48
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 8 2016, 10:28
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Димон Безпарольный @ Dec 6 2016, 13:10) *
Пытаюсь доконца разобраться. Для того, чтобы элементы структуры были доступны в каждой функции, мне приходится в каждую функцию прописывать:

Код
p_BME280 = &BME280_cfg;
Это бред, (даже несмотря на то, что это работает)

Цитата
Как это сделать?

Вы же сами написали, как это сделать -
Цитата
В строке 55 объявляется указатель на структуру:
Код
static struct bme280_t *p_bme280; /**< pointer to BME280 */


в единственном месте - функция bme280_init(struct bme280_t *bme280)(строка 90) этому указателю присваивается адрес :

Код
/* assign BME280 ptr */
p_bme280 = bme280;


И все. Далее в каждой функции идет обращение к структуре(строка 230):
Код
p_bme280->cal_param.t_fine - 122880

Цитата
Но все мои попытки один раз назначить ему адрес структуры приводит к ошибке в компиляции.

Как эти попытки выглядят?
Если так -
Цитата
Код
static struct bme280_t bme280_cfg;
static struct bme280_t *p_bme280; /**< pointer to BME280 */
p_bme280 = &bme280_cfg;
то это неправильно. На уровне файла (т.е. вне каких либо функций) ничего присваивать нельзя (можно только инициализировать при описании)
Вот так можно:
Код
static struct bme280_t bme280_cfg;
static struct bme280_t *p_bme280 =  &bme280_cfg; /**< pointer to BME280 */
Вот только смысла в этом (если обе переменные static) нет никакого - используйте сразу bme280_cfg без промежуточных указателей
Go to the top of the page
 
+Quote Post
Lagman
сообщение Dec 8 2016, 11:49
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



Автор топика не может посмотреть соседние файлы в репозитории, где все понятно написано как использовать правильно функции и структуры, а вы ему про высокие материи начинаете. sm.gif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th July 2025 - 17:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01431 секунд с 7
ELECTRONIX ©2004-2016