Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: [РЕШЕНО] Прочитать структуру по байтам (Си)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Alt.F4
Здравствуйте.
Подскажите, пожалуйста, возможно ли как-то прочитать структуру по байтам на языке Си?
Т.е. как обычный массив: for(i=0;i!=size;i++) temp=array[i];
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.
Спасибо.
Methane
Цитата(Alt.F4 @ Jul 14 2013, 15:14) *
Здравствуйте.
Подскажите, пожалуйста, возможно ли как-то прочитать структуру по байтам на языке Си?
Т.е. как обычный массив: for(i=0;i!=size;i++) temp=array[i];
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.
Спасибо.

http://ru.wikipedia.org/wiki/%D0%9E%D0%B1%...%D1%8B%D1%85%29
Но можно и указатель на структуру переделать в указатель на char и так передать.
Alt.F4
Methane, не понятно... А можно пример?
Спасибо.
Код
volatile struct
{
     char    date[size_date];
     char    time[size_time];
}
Buffer[size_buffer];
_Артём_
Цитата(Alt.F4 @ Jul 14 2013, 15:33) *
А можно пример?
Спасибо.
Код
volatile struct
{
     char    date[size_date];
     char    time[size_time];
}
Buffer[size_buffer];



Код
struct STR
{
     char    date[size_date];
     char    time[size_time];
} S;
uint8_t Buffer[sizeof(STR)];

void StructCopy()
{
    uint8_t * src=(uint8_t *)&S;
    uint8_t * dest=Buffer;
    for (uint32_t i=0; i<sizeof(STR); i++)
        *dest++=*src++;

}

adnega
Цитата(_Артём_ @ Jul 14 2013, 16:39) *
Код
struct STR
{
     char    date[size_date];
     char    time[size_time];
} S;
uint8_t Buffer[sizeof(STR)];

Или так?
Код
void StructCopy()
{
  *(STR *)&Buffer[0] = S; // запись
  S = *(STR *)&Buffer[0]; // чтение
}

Alt.F4
_Артём_, супер!!!

Подскажите, пожалуйста:
1. Как объявить указатель двухбайтовым, т.к. длина структуры больше 255?
На uint16_t * src=(uint8_t *)&S; компилятор ставит варнинг.
2. Как объявить структуру как внешнюю, типа extern struct?
Спасибо.
_Артём_
Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
Подскажите, пожалуйста:
1. Как объявить указатель двухбайтовым, т.к. длина структуры больше 255?

Размер указателя зависит от архитектуры и компилятора. Если длина данных у вас не вмещается в байт, то используйте такой цикл:

Код
uint8_t * src=(uint8_t *)&S;
    uint8_t * dest=Buffer;
    for (uint16_t i=0; i<sizeof(STR); i++) //  uint16_t - можно копировать до 65535 байт,  uint32_t  - больше 4 млрд. байт
        *dest++=*src++;


Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
На uint16_t * src=(uint8_t *)&S; компилятор ставит варнинг.


И правильно что ругается - приводите не к тому типу, надо к int16_t *.

Код
uint16_t * src=(uint16_t *)&S;


Цитата(Alt.F4 @ Jul 14 2013, 17:10) *
2. Как объявить структуру как внешнюю, типа extern struct?


Поместите в какой-нибудь инклуд:

Код
struct Data_t {

unsigned char A;

unsigned char B;

};

extern struct Data_t D;

А в ц-файл так:

Код
  
struct Data_t D;





Alt.F4
_Артём_, спасибо огромное за помощь!!! cheers.gif
igorle
рекомендую использовать функцию memcpy()
Она обычно оптимизирована для каждой платформы. В крайнем случае она сделает то же самое копирование байт за байтом, но в большинстве случаев она работает быстрее.
Функция принимает два указателя на void. Так что любой другой указатель приведется к типу (void *) без ворнинга.
ukpyr
Цитата
Хочу ничего не нарушая засунуть ее по байтам во внешнюю память и таким же образом потом считывать.


можно и без union:
Код
struct {
.....................
} s;

int main() {
    uint8_t *src = (void *)&s;
    uint8_t *dest = ....;

    for (size_t c=sizeof(s); c; c-- ) {
        //копирование или что-нибудь другое
        *dest++ = *src++;
    };
DASM
Целый набор граьель. Первое на что попадете — выравнивание. pragma pack (1) хоть пишите. Насчет реализации мемсру — чаще всего плохая, но дело не в этом. Когда я вижу код с мемсру , сразу подозреваю плохой дизайн. Она нужна намного реже, чем ее пользуют.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.