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

 
 
 
Reply to this topicStart new topic
> Работа с массивами.
Jenya7
сообщение Feb 8 2015, 09:12
Сообщение #1


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

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



Что то запутался я.
Код
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) не получает ничего.
Go to the top of the page
 
+Quote Post
Opex
сообщение Feb 8 2015, 09:39
Сообщение #2


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

Группа: Свой
Сообщений: 75
Регистрация: 13-03-11
Из: Екатеринбург
Пользователь №: 63 574



Нужно low_byte и high_byte привести к типу unsigned char перед записью в массив.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2015, 09:42
Сообщение #3


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

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



Цитата(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;

не помогает
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 09:43
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

Компилятор сам это сделает, согласно стандарту С, обрезав старшие разряды.
Я подозреваю, что указатель указывает куда-то не туда, куда записать ничего физически нельзя.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2015, 09:47
Сообщение #5


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

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



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

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

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


Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 09:54
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

unsigned char deltas[10];

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

unsigned char *deltas;

....

deltas = (unsigned char*) malloc(10);
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2015, 10:00
Сообщение #7


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

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



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

unsigned char deltas[10];

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

unsigned char *deltas;

....

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

проблема в том что я не знаю конечный размер массива. пользователь может запросить энное количество записей.
можно конечно считывать записи порциями из памяти а не весь паровоз сразу. к тому же избегу malloc который я не люблю.
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 8 2015, 10:03
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

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

Без malloc - только один вариант - №2, других нет.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Feb 8 2015, 10:52
Сообщение #9


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

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



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

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

пойду по варианту 2 . выделю буфер и буду читать/посылать пакетами. спасибо.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th June 2024 - 22:53
Рейтинг@Mail.ru


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