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

 
 
> структуры в С, копирование в байтовый массив
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
6 страниц V  < 1 2 3 4 > »   
Start new topic
Ответов (15 - 29)
zltigo
сообщение Apr 27 2007, 18:57
Сообщение #16


Гуру
******

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



Цитата(lks @ Apr 27 2007, 18:45) *
Приведите пожалуйста фрагмент кода который заработал в ИАР.

Для справок: От IAR/ не IAR это совершенно не зависит.
Код
BYTE dummy_buff[100];
ENC_Header   xxx_header;
memcpy( dummy_buff, &xxx_header, sizeof(xxx_header) );


Сообщение отредактировал zltigo - Apr 27 2007, 19:33


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 27 2007, 19:53
Сообщение #17


Местный
***

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



Цитата(zltigo @ Apr 27 2007, 19:57) *
Для справок: От IAR/ не IAR это совершенно не зависит.
Код
BYTE dummy_buff[100];
ENC_Header   xxx_header;
memcpy( dummy_buff, &xxx_header, sizeof(xxx_header) );


Ну может быть амперсанд структуры и покажет на структуру - а может и выдаст ошибку не совпадения типов данных.
То что товарищ приводил в качестве кода - действительно описано в учебнике, но не работает в некоторых компиляторах.
Про это и речь шла.
Мне в этой теме интересен вопрос как совместить адрес начала структуры с адресом начала массива.
Допустим чтобы работало как union - внутри: массив + структура.
Тогда реально memcpy - как телеге пятое колесо (или очень неэффективный прием).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 27 2007, 20:06
Сообщение #18


Гуру
******

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



Цитата(lks @ Apr 27 2007, 19:53) *
Ну может быть..

Не может быть. Учите матчасть.
Цитата
Допустим чтобы работало как union - внутри: массив + структура.

union двух структур и используйте - одна стркутура с массивом, вторая со всякой всячиной.
Обычно это не делается, поскольку нагляднее банальное преобразование типов.
Цитата
Тогда реально memcpy - как телеге пятое колесо (или очень неэффективный прием).

Это две совсем разные вещи никак не заменяющие друг друга. Заговариваетесь?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 27 2007, 21:01
Сообщение #19


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



К сведению: union - платформозависимая штука и в плане переносимости - большой вопрос.

Второе наблюдение по жизни: простое приведение одного типа указателя к другому это хорошо, если при этом не рарушается требования по выравниванию адресов (что имеет место в случае ARM'ов, например).

Так что в каждом конкретном случае надо сначала подумать, что ты хочешь, чтобы процессор сделал, а потом уже это реализовать с учетом его архитектурных особенностей (мой приятель в институте говорил в таких случаях: поиграем в компьютер, т.е. посмотрим на программу "глазами" компьютера - очень полезно).
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 27 2007, 21:14
Сообщение #20


Гуру
******

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



Цитата(sergeeff @ Apr 27 2007, 21:01) *
К сведению:

К чьему сведению? Это я спрашиваю по причине того, что Ваш пост несколько выбивается из темы и не совсем понятен.
Цитата
union - платформозависимая штука и в плане переносимости - большой вопрос.

Прошу огласить проблемы с зависимостью и непереносимостью.
Цитата
если при этом не рарушается требования по выравниванию адресов (что имеет место в случае ARM'ов, например).

В плане обсуждаемой "проблемы" это не существенно, поскольку начальные адреса структур и массивов всегда выравнены. Про изощренные способы доступа к элементам речь пока не идет.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 27 2007, 22:27
Сообщение #21


Местный
***

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



Цитата(zltigo @ Apr 27 2007, 22:14) *
В плане обсуждаемой "проблемы" это не существенно, поскольку начальные адреса структур и массивов всегда выравнены. Про изощренные способы доступа к элементам речь пока не идет.


1. Проблемы когда не фсе функции стандарта языка поддерживаются в компиляторах - бывают.
2. Простое совмещение адресного пространства в памяти - массивов и структур - гораздо красивее и правильнее чем примитивное копирование - хотябы с точки зрения экономии ресурсов и памяти программ (процедура memcpy библиотечная и занимает эн-ое количество байт).
Что мы тут из пустого в порожнее-то, а?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 27 2007, 23:05
Сообщение #22


Гуру
******

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



Цитата(lks @ Apr 27 2007, 22:27) *
Проблемы когда не фсе функции стандарта языка поддерживаются в компиляторах - бывают.

Всему есть предел, те кто не поддерживают чего-то уже не существуют на рынке.
Если есть пример живого компилятора - в студию. Искать его очень просто - у него в прототипе функции memcpy() второй аргумент должен отличаться от (const void *). Я за двадцать с лишним лет таких не встречал.
Цитата
Простое совмещение адресного пространства в памяти - массивов и структур - гораздо красивее и правильнее чем примитивное копирование

Причем здесь красивее/не красивее? Повторяюсь - это две совершенно разные вещи не заменяющие друг друга. Как передача аргумента по значению не лучше/хуже и не красивее/уродливее передачи аргумента по ссылке. Используется то, что нужно в данный момент.
Цитата
Что мы тут из пустого в порожнее-то, а?

Лично я на этом закончил, а разговоры разговаривал исключительно по причине того, что раздел с этой темой называется "В помощь начинающему". И в этом месте мне кажутся особо неуместными мутные повествования о каких-то "некоторых компиляторах" и извращениях.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
lks
сообщение Apr 28 2007, 08:12
Сообщение #23


Местный
***

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



Цитата(zltigo @ Apr 28 2007, 00:05) *
Лично я на этом закончил,


Могли бы и не начинать.

to all:

А всеже интересно, когда указываете на структуру через амперсанд, какой тип данных должен иметь указатель? (пусть даже на для компилятора ИАР).
Я пробовал сделать это на другом компиляторе у меня тоже не получилось.
Умные люди подсказывают что тип указателя должен быть void.
По идее в момент инициализации данных можно описать массив указателей типа void и потом амперсанд структуры присвоить первому элементу этого массива.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 28 2007, 09:56
Сообщение #24


Adept
******

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



Цитата(lks @ Apr 28 2007, 12:12) *
А всеже интересно, когда указываете на структуру через амперсанд, какой тип данных должен иметь указатель?

Поясните пожалуйста, что Вы подразумеваете под "указанием на структуру через амперсанд"?

Цитата(lks @ Apr 28 2007, 12:12) *
(пусть даже на для компилятора ИАР).

От компилятора тут ничего зависеть не должно - это правила языка, компилятор, если он соответсвует Стандарту, должен выполнять предсказуемые действия. Иначе такой компилятор фтопку.

Цитата(lks @ Apr 28 2007, 12:12) *
Умные люди подсказывают что тип указателя должен быть void.

Как это? Приведите пожалуйста пример?

Цитата(lks @ Apr 28 2007, 12:12) *
По идее в момент инициализации данных можно описать массив указателей типа void и потом амперсанд структуры присвоить первому элементу этого массива.

Что такое "амперсанд структуры"? Это новый термин в языке? Покажите лучше, код, который имеете в виду, возможно, так будет понятнее и однозначее.


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


Местный
***

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



Цитата(dxp @ Apr 28 2007, 10:56) *
Поясните пожалуйста, что Вы подразумеваете под "указанием на структуру через амперсанд"?
От компилятора тут ничего зависеть не должно - это правила языка, компилятор, если он соответсвует Стандарту, должен выполнять предсказуемые действия. Иначе такой компилятор фтопку.
Как это? Приведите пожалуйста пример?
Что такое "амперсанд структуры"? Это новый термин в языке? Покажите лучше, код, который имеете в виду, возможно, так будет понятнее и однозначее.




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++;
}

Хорошо, поясняю.

Значок & - называется амперсанд, или оператор указания.
Когда пишу "амперсанд структуры" - подразумеваю - &BootSector, т.е. получение адреса по которому располагается данные описанные в структуре.
Этот пример кода взят (судя по всему) из учебника - автором темы.
Никто не сомневается что он должен работать.
Автор темы попытался применить его в ИАР компиляторе - результат: не работатет.
Вопрос в том: почему он не работатет и развивая мысль дальше - неплохо бы сделать совмещение начала адресов массива и структуры в памяти - тогда необходимость копирования данных из одного места в другое автоматически отпадает.

Так лучше?
Go to the top of the page
 
+Quote Post
o-henry
сообщение Apr 28 2007, 11:53
Сообщение #26


Местный
***

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



Цитата(lks @ Apr 28 2007, 10:11) *
Этот пример кода взят (судя по всему) из учебника - автором темы.
Никто не сомневается что он должен работать.


А чего тут сомневаться blink.gif? Разумеется он не должен работать.
В приведенном коде указателю на unsigned char
присваивается адрес структуры BootSectorStruct, т.е адрес объекта совершенно другого типа.
И любой компилятор просто обязан сообщить об ошибке.
А тот факт, что в данном случае структура состоит исключительно из массивов типа unsigned char совершенно никакой роли не играет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Apr 28 2007, 12:09
Сообщение #27


Гуру
******

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



Цитата(lks @ Apr 28 2007, 11:11) *
Никто не сомневается что он должен работать.

Я рыдал sad.gif. Прошу вычеркнуть меня из списка "никто не сомневающихся", по причине знания того факта, что "работать" ( молча приводить указатель на структуру к указателю на unsigned char) это не должно. И того, что всегда должно "работать" явное приведение типов указателей и любые неявные преобразования типов указателей с участием указателя на void.


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


Гуру
******

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



Цитата(lks @ Apr 28 2007, 10:11) *
Вопрос в том: почему он не работатет и развивая мысль дальше - неплохо бы сделать совмещение начала адресов массива и структуры в памяти - тогда необходимость копирования данных из одного места в другое автоматически отпадает.
Выделите наконец полчаса и прочитайте у Кернигана и Ритчи главу про указатели. Тогда вы поймете, что компилятор ругается правильно, узнаете какой тип имеет &BootSector, узнаете почему компилятор проглотит ptr = &BootSector; если ptr объявлен как void*, и узнаете почему в этом случае компилятор выругается на MMCWRData[ i ] = *ptr. Вы поймете что общего у массивов и указателей и как правильно объявив указатель можно получить совмещение начала адресов массива и структуры в памяти. Ведь, судя по вашим сообщениям в этой ветке, вы совершенно не имеете понятия об указателях. Но почему вы хотите, чтобы кто-то потратил гораздо больше времени, пересказывая тут эту главу для вас тут??? Если вам что-то будет непонятно у Кернигана и Ритчи - спрашивайте, с удовольствием объясним. Но сделайте сначала сами элементарное усилие.

P.S. Какой, нафиг, пример из учебника, если судя по названию массива идет работа с MultiMedia Card?


--------------------
На любой вопрос даю любой ответ
"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 28 2007, 12:58
Сообщение #29


Местный
***

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



Цитата(o-henry @ Apr 28 2007, 12:53) *
А чего тут сомневаться blink.gif? Разумеется он не должен работать.


Может нужно вместо unsigned char *ptr - написать void *ptr?
Мне кажется это ничего не изменит.
Ошибка будет в момент выполнения операции & от структуры.
Вы серъезно считаете что энциклопедию языка Си писали идиоты?


Цитата(Сергей Борщ @ Apr 28 2007, 13:46) *
Если вам что-то будет непонятно у Кернигана и Ритчи - спрашивайте, с удовольствием объясним. Но сделайте сначала сами элементарное усилие.

P.S. Какой, нафиг, пример из учебника, если судя по названию массива идет работа с MultiMedia Card?


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

А что разве Си нельзя применять для MMC - это такое системное ограничение - типа чернила только для 8 класса?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 28 2007, 13:28
Сообщение #30


Гуру
******

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



Цитата(lks @ Apr 28 2007, 11:58) *
Может нужно вместо unsigned char *ptr - написать void *ptr?
Мне кажется это ничего не изменит.
Ваше "кажется" - не указание для компилятора. Еще раз: если вы объявите ptr как void* компилятор скушает ptr = &BootSector. Но прочитайте в учебнике, почему в этом случае нельзя делать *ptr.
Цитата(lks @ Apr 28 2007, 11:58) *
Ошибка будет в момент выполнения операции & от структуры.
Еще раз: если void*, то в другом месте.
Цитата(lks @ Apr 28 2007, 11:58) *
Вы серъезно считаете что энциклопедию языка Си писали идиоты?
Вы серьезно считаете, что вы ее прочитали и поняли?

Цитата(lks @ Apr 28 2007, 11:58) *
А что разве Си нельзя применять для MMC - это такое системное ограничение - типа чернила только для 8 класса?
При чем тут Си? Речь шла про учебник. В учебниках приводятся простые абстрактные примеры.


--------------------
На любой вопрос даю любой ответ
"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

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

 


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


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