Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача структуры в функцию.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Есть глобальная структура.
Код
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. Наверно поэтому данные не считываются?
aaarrr
Цитата(Jenya7 @ Apr 27 2016, 13:00) *
А когда доходит до (uint8_t *)&logData тут при кастинге адрес меняется на 0x20009fd8. Наверно поэтому данные не считываются?

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

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

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

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

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

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

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

Часто встречающаяся ошибка sad.gif
Советую делать разные имена для собственно объекта (LoggerData) и указателя на этот объект (pLoggerData), тогда сложно ошибиться.
SlavaV
Извиняюсь не обратил внимание на typedef
MrYuran
А если бы не было typedef то что?

Все равно структура один раз объявлена
Baser
Цитата(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;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.