|
структуры в С, копирование в байтовый массив |
|
|
|
 |
Ответов
(1 - 14)
|
Apr 26 2007, 16:10
|

Местный
  
Группа: Свой
Сообщений: 304
Регистрация: 5-07-04
Из: г. Москва
Пользователь №: 259

|
Цитата(tolik_zp @ Apr 26 2007, 17:05)  Имеется структура с элементами различных типов и массив типа char вопрос: как все содержимое структуры скопировать в массив?
попробовал инициализировать указатель типа char на структуру и в цикле переписать - не проходит Поподробнее чуть - что не проходит? И может union использовать?
--------------------
Водку пьянствовать и безобразия нарушать!!!
|
|
|
|
|
Apr 26 2007, 16:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(tolik_zp @ Apr 26 2007, 16:05)  попробовал инициализировать указатель типа char на структуру и в цикле переписать - не проходит Если-бы пробовали, то получилось-бы. Дополнительно: Побайтно копировать никчему - memcpy() есть. Структуру, предполагаю, придется паковать, если конечно контроллер не 8-битовый.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 26 2007, 16:16
|
Частый гость
 
Группа: Участник
Сообщений: 127
Регистрация: 2-08-06
Пользователь №: 19 265

|
Цитата(o-henry @ Apr 26 2007, 16:10)  код в студию вот кусочек, прошу: unsigned char *ptr; struct BootSectorStruct { unsigned char JmpCmd[3]; unsigned char OEMName[8]; }; struct BootSectorStruct BootSector = {0xEB, 0x00, 0x90, "HaloWrld"}; ptr = &BootSector; for (i=0;i<11;i++) { MMCWRData[i] = *ptr; ptr++; } ИАР ругается на присваивании указателю адреса структуры
|
|
|
|
|
Apr 26 2007, 16:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(tolik_zp @ Apr 26 2007, 20:16)  вот кусочек, прошу:
unsigned char *ptr; struct BootSectorStruct { unsigned char JmpCmd[3]; unsigned char OEMName[8]; }; struct BootSectorStruct BootSector = {0xEB, 0x00, 0x90, "HaloWrld"};
ptr = &BootSector; for (i=0;i<11;i++) { MMCWRData[i] = *ptr; ptr++; }
ИАР ругается на присваивании указателю адреса структуры Естественно, указатель на тип char, а Вы ему пихаете адрес объекта совершенно другого типа. Если так делать, то нужно применять явные преобразования типа: ptr = (char*)&BootSector; или, если включен С++, то лучче использовать ptr = reinterpret_cast<char*>(&BootSector); А вообще, как посоветовал уважаемый zltigo, тут правильнее использовать стандартную memcpy.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 26 2007, 23:10
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(Сергей Борщ @ Apr 26 2007, 23:25)  Замечательный совет! А если первый элемент структуры будет не unsigned char? Опять бежать на форум с криком "раньше работало а теперь компилятор виноват"? Вопрос глубже может оказаться чем вы подумали. То что я предлагаю работает - а что вы предложили - я не понял. Присваете тип указателю такой же как первая переменная структуры - и все дела.
|
|
|
|
|
Apr 27 2007, 00:52
|

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

|
Цитата(lks @ Apr 26 2007, 22:10)  Вопрос глубже может оказаться чем вы подумали. Вопрос простой как трехлинейная винтовка. И ответ на него рассматривается в любой книжке по С в разделе "приведение типов". Цитата(lks @ Apr 26 2007, 22:10)  То что я предлагаю работает - а что вы предложили - я не понял. То, что вы предложили работает только в одном конкретном случае - когда тип первого элемента структуры совпадает с типом желаемого указателя (в данном случае - unsigned char). Предложить я ничего не мог - выше было дано три (два про приведение и один про memcpy) совершенно правильных ответа. Я лишь указал на опасность следования вашему неправильному совету. Цитата(lks @ Apr 26 2007, 22:10)  Присваете тип указателю такой же как первая переменная структуры - и все дела. А если первый элемент массива - unsigned long long а структура кроме него содердит еще всего один unsigned char? И как при этом объявлять массив, в который надо скопировать?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 27 2007, 18:45
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(tolik_zp @ Apr 27 2007, 13:23)  всем спасибо, работает. век живи - век rtfm Приведите пожалуйста фрагмент кода который заработал в ИАР.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|