Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с массивами.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Что то запутался я.
Код
uint32_t LOGGER_GetDelta(uint32_t address, unsigned char *delta_h_l)
{
    uint32_t low_byte, high_byte;
    
    // start read
     SPI_CSlow();
    // send command
    SPI_SendByte(SPIEEPROM_CMD_READ);
    // send address
    SPI_SendByte(address>>8);
    SPI_SendByte(address&0x00FF);
    // read contents of memory address
    SPI_TransferByte(0x00);
    low_byte = majority32const(&USART1->RXDATA);
    SPI_TransferByte(0x00);
    high_byte = majority32const(&USART1->RXDATA);
    // stop read
    SPI_CShigh();

    *delta_h_l = low_byte;
    *(delta_h_l+1) = high_byte;

    return ((high_byte << 8) | low_byte);
}

Смотрю в дебаггере low_byte, high_byte получают правильные данные а *delta_h_l, *(delta_h_l+1) не получает ничего.
Opex
Нужно low_byte и high_byte привести к типу unsigned char перед записью в массив.
Jenya7
Цитата(Opex @ Feb 8 2015, 14:39) *
Нужно low_byte и high_byte привести к типу unsigned char перед записью в массив.

пробовал
Код
*delta_h_l = (unsigned char)low_byte;
*(delta_h_l+1) = (unsigned char)high_byte;

не помогает
SM
Цитата(Opex @ Feb 8 2015, 12:39) *
Нужно low_byte и high_byte привести к типу unsigned char перед записью в массив.

Компилятор сам это сделает, согласно стандарту С, обрезав старшие разряды.
Я подозреваю, что указатель указывает куда-то не туда, куда записать ничего физически нельзя.
Jenya7
Цитата(SM @ Feb 8 2015, 14:43) *
Компилятор сам это сделает, согласно стандарту С, обрезав старшие разряды.
Я подозреваю, что указатель указывает куда-то не туда, куда записать ничего физически нельзя.

я вот думаю может инициализировать надо массив? я создал глобально
Код
unsigned char *deltas;

и передаю
Код
LOGGER_GetDelta(addr,deltas);


SM
Так естественно! Объявлять то надо массив конкретного размера, а не указатель!

unsigned char deltas[10];

или его инициализировать, выделяя память под массив:

unsigned char *deltas;

....

deltas = (unsigned char*) malloc(10);
Jenya7
Цитата(SM @ Feb 8 2015, 14:54) *
Так естественно! Объявлять то надо массив конкретного размера, а не указатель!

unsigned char deltas[10];

или его инициализировать, выделяя память под массив:

unsigned char *deltas;

....

deltas = (unsigned char*) malloc(10);

проблема в том что я не знаю конечный размер массива. пользователь может запросить энное количество записей.
можно конечно считывать записи порциями из памяти а не весь паровоз сразу. к тому же избегу malloc который я не люблю.
SM
Цитата(Jenya7 @ Feb 8 2015, 13:00) *
проблема в том что я не знаю конечный размер массива. пользователь может запросить энное количество записей.

тогда у Вас три варианта:
1) использовать не массив, а связанный список, добавляя в него записи по мере их поступления.
2) выделить сразу много памяти, чтобы хватило на самое большое допустимое N
3) использовать realloc по мере нехватки размера.

Без malloc - только один вариант - №2, других нет.
Jenya7
Цитата(SM @ Feb 8 2015, 15:03) *
тогда у Вас три варианта:
1) использовать не массив, а связанный список, добавляя в него записи по мере их поступления.
2) выделить сразу много памяти, чтобы хватило на самое большое допустимое N
3) использовать realloc по мере нехватки размера.

Без malloc - только один вариант - №2, других нет.

пойду по варианту 2 . выделю буфер и буду читать/посылать пакетами. спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.