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

 
 
 
Reply to this topicStart new topic
> Передача структуры в функцию.
Jenya7
сообщение Apr 27 2016, 10:00
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть глобальная структура.
Код
typedef struct sLoggerData
{
    uint32_t timestamp;
    uint32_t data;
    uint16_t type;
    uint16_t crc;
}sLoggerData;

sLoggerData loggerData;

Ставлю точку останова в дебагере на строчке
Код
LOGGER_Read(0,  &loggerData);

Вижу адрес структуры - 0x20000548

Перехожу в саму функцию - аргумент передается правильно.
Код
uint32_t LOGGER_Read(uint32_t log_to_read, sLoggerData * logData)  //тут адрес 0x20000548
{
    uint32_t log_addr = LOGGER_GetLogAddress(log_to_read);

    I2C_ChooseDevice(EEPROM_CHIP);

    I2C_ReadEeprom(log_addr, (uint8_t *)&logData, sizeof(sLoggerData));  //тут адрес 0x20009fd8
    uint32_t crc = crc16 (0, (uint8_t *)&logData, (sizeof(sLoggerData)-2));
    if (crc == logData->crc)
        return 1;
    else
        return 0;
}

А когда доходит до (uint8_t *)&logData тут при кастинге адрес меняется на 0x20009fd8. Наверно поэтому данные не считываются?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 27 2016, 10:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Jenya7 @ Apr 27 2016, 13:00) *
А когда доходит до (uint8_t *)&logData тут при кастинге адрес меняется на 0x20009fd8. Наверно поэтому данные не считываются?

Вы передаете указатель на указатель. Чтобы передать исходный указатель, аргумент должен быть (uint8_t *)logData.

И в исходную функцию передается не структура, как ошибочно указано в названии темы, а указатель на нее.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 27 2016, 10:23
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(aaarrr @ Apr 27 2016, 16:13) *
Вы передаете указатель на указатель. Чтобы передать исходный указатель, аргумент должен быть (uint8_t *)logData.

И в исходную функцию передается не структура, как ошибочно указано в названии темы, а указатель на нее.

большое спасибо.
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Apr 27 2016, 11:17
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Моё мнение ошибка немного в другом:
Указав имя при определении структуры в конце (после фигурной скобки) вы создаёте объект sLoggerData на основе этой структуры, а потом ещё создаете один объект loggerData.
В теле функции у вас используется имя sLoggerData какой объект подсунет компилятор остаётся загадкой (по правилам должен локальный)

PS смысл так кодировать нельзя
Go to the top of the page
 
+Quote Post
AleksBak
сообщение Apr 27 2016, 11:50
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 132
Регистрация: 6-02-16
Из: г. Баку
Пользователь №: 90 364



Цитата(SlavaV @ Apr 27 2016, 15:17) *
Моё мнение ошибка немного в другом:
Указав имя при определении структуры в конце (после фигурной скобки) вы создаёте объект sLoggerData на основе этой структуры...

Там вначале (т.е. уже перед фигурными скобками):
Код
typedef struct sLoggerData

т.е. просто тип такой структуры объявляется.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2016, 11:53
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (SlavaV @ Apr 27 2016, 14:17) *
Указав имя при определении структуры в конце (после фигурной скобки) вы создаёте объект sLoggerData
Нет. Там в начале было typedef.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Apr 27 2016, 12:08
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



таки надо передавать адрес без амперсанда. просто рядом была другая функция где я работаю с глобальной структурой - передаю адрес с амперсандом - работает как надо. по привычке скопировал не подумав.
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 27 2016, 12:13
Сообщение #8


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Jenya7 @ Apr 27 2016, 15:08) *
по привычке скопировал не подумав.

Часто встречающаяся ошибка sad.gif
Советую делать разные имена для собственно объекта (LoggerData) и указателя на этот объект (pLoggerData), тогда сложно ошибиться.
Go to the top of the page
 
+Quote Post
SlavaV
сообщение Apr 27 2016, 12:23
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 100
Регистрация: 13-06-06
Из: г.Улан-Удэ
Пользователь №: 18 024



Извиняюсь не обратил внимание на typedef
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 27 2016, 13:26
Сообщение #10


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



А если бы не было typedef то что?

Все равно структура один раз объявлена


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Baser
сообщение Apr 27 2016, 13:57
Сообщение #11


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(MrYuran @ Apr 27 2016, 16:26) *
А если бы не было typedef то что?
Все равно структура один раз объявлена

Не было бы typedef , была бы ошибка. Для двух структур пришлось бы писать:
Код
struct sLoggerData
{
    uint32_t timestamp;
    uint32_t data;
    uint16_t type;
    uint16_t crc;
}sLoggerData;

struct sLoggerData loggerData;
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 14:30
Рейтинг@Mail.ru


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