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

 
 
6 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> структуры в С, копирование в байтовый массив
tolik_zp
сообщение Apr 26 2007, 16:05
Сообщение #1


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

Группа: Участник
Сообщений: 127
Регистрация: 2-08-06
Пользователь №: 19 265



Имеется структура с элементами различных типов и массив типа char
вопрос: как все содержимое структуры скопировать в массив?

попробовал инициализировать указатель типа char на структуру и в цикле переписать - не проходит
Go to the top of the page
 
+Quote Post
o-henry
сообщение Apr 26 2007, 16:10
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



код в студию
Go to the top of the page
 
+Quote Post
v_shamaev
сообщение Apr 26 2007, 16:10
Сообщение #3


Местный
***

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



Цитата(tolik_zp @ Apr 26 2007, 17:05) *
Имеется структура с элементами различных типов и массив типа char
вопрос: как все содержимое структуры скопировать в массив?

попробовал инициализировать указатель типа char на структуру и в цикле переписать - не проходит

Поподробнее чуть - что не проходит?
И может union использовать?


--------------------
Водку пьянствовать и безобразия нарушать!!!
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 26 2007, 16:16
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
tolik_zp
сообщение Apr 26 2007, 16:16
Сообщение #5


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

Группа: Участник
Сообщений: 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++;
}

ИАР ругается на присваивании указателю адреса структуры
Go to the top of the page
 
+Quote Post
o-henry
сообщение Apr 26 2007, 16:30
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



а приведение типов кто делать будет?

ptr = (char*) &BootSector;
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 26 2007, 16:32
Сообщение #7


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.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 26 2007, 20:30
Сообщение #8


Местный
***

Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143



Попробуйте указать на переменную JmpCmd - т.е. амперсанд от этой переменной присвоить указателю ptr.
Я давно с ИАРом не работал, но думаю что когда будете указывать не на структуру, а на первую переменную в структуре - проблемы снимуться.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 26 2007, 22:25
Сообщение #9


Гуру
******

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



Цитата(lks @ Apr 26 2007, 19:30) *
Попробуйте указать на переменную JmpCmd - т.е. амперсанд от этой переменной присвоить указателю ptr.
Замечательный совет! А если первый элемент структуры будет не unsigned char? Опять бежать на форум с криком "раньше работало а теперь компилятор виноват"?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 26 2007, 23:10
Сообщение #10


Местный
***

Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143



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


Вопрос глубже может оказаться чем вы подумали.
То что я предлагаю работает - а что вы предложили - я не понял.
Присваете тип указателю такой же как первая переменная структуры - и все дела.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 26 2007, 23:19
Сообщение #11


Гуру
******

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



Цитата(lks @ Apr 26 2007, 20:30) *
а на первую переменную в структуре - проблемы снимуться.

Ничем не обоснованный поступок ни к чему, кроме как к возникновению потенциальных ошибок при изменении структуры и дополнительных неясностей при разнообразных паковках структуры не приводящий. Никаких проблем при работе с именем структуры нет и "сняться" они не могут.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 27 2007, 00:52
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 27 2007, 01:40
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Об чем сыр-бор? Явное приведение типов всяко лучше, чем неявное упование на особенности конкретной структуры, конкретного компилятора и разрядности конкретного МК.
Go to the top of the page
 
+Quote Post
tolik_zp
сообщение Apr 27 2007, 12:23
Сообщение #14


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

Группа: Участник
Сообщений: 127
Регистрация: 2-08-06
Пользователь №: 19 265



всем спасибо, работает. век живи - век rtfm
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 27 2007, 18:45
Сообщение #15


Местный
***

Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143



Цитата(tolik_zp @ Apr 27 2007, 13:23) *
всем спасибо, работает. век живи - век rtfm


Приведите пожалуйста фрагмент кода который заработал в ИАР.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 05:49
Рейтинг@Mail.ru


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