|
структуры в С, копирование в байтовый массив |
|
|
|
 |
Ответов
|
Apr 27 2007, 21:14
|

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

|
Цитата(sergeeff @ Apr 27 2007, 21:01)  К сведению: К чьему сведению? Это я спрашиваю по причине того, что Ваш пост несколько выбивается из темы и не совсем понятен. Цитата union - платформозависимая штука и в плане переносимости - большой вопрос. Прошу огласить проблемы с зависимостью и непереносимостью. Цитата если при этом не рарушается требования по выравниванию адресов (что имеет место в случае ARM'ов, например). В плане обсуждаемой "проблемы" это не существенно, поскольку начальные адреса структур и массивов всегда выравнены. Про изощренные способы доступа к элементам речь пока не идет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 27 2007, 22:27
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(zltigo @ Apr 27 2007, 22:14)  В плане обсуждаемой "проблемы" это не существенно, поскольку начальные адреса структур и массивов всегда выравнены. Про изощренные способы доступа к элементам речь пока не идет. 1. Проблемы когда не фсе функции стандарта языка поддерживаются в компиляторах - бывают. 2. Простое совмещение адресного пространства в памяти - массивов и структур - гораздо красивее и правильнее чем примитивное копирование - хотябы с точки зрения экономии ресурсов и памяти программ (процедура memcpy библиотечная и занимает эн-ое количество байт). Что мы тут из пустого в порожнее-то, а?
|
|
|
|
|
Apr 27 2007, 23:05
|

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

|
Цитата(lks @ Apr 27 2007, 22:27)  Проблемы когда не фсе функции стандарта языка поддерживаются в компиляторах - бывают. Всему есть предел, те кто не поддерживают чего-то уже не существуют на рынке. Если есть пример живого компилятора - в студию. Искать его очень просто - у него в прототипе функции memcpy() второй аргумент должен отличаться от (const void *). Я за двадцать с лишним лет таких не встречал. Цитата Простое совмещение адресного пространства в памяти - массивов и структур - гораздо красивее и правильнее чем примитивное копирование Причем здесь красивее/не красивее? Повторяюсь - это две совершенно разные вещи не заменяющие друг друга. Как передача аргумента по значению не лучше/хуже и не красивее/уродливее передачи аргумента по ссылке. Используется то, что нужно в данный момент. Цитата Что мы тут из пустого в порожнее-то, а? Лично я на этом закончил, а разговоры разговаривал исключительно по причине того, что раздел с этой темой называется "В помощь начинающему". И в этом месте мне кажутся особо неуместными мутные повествования о каких-то "некоторых компиляторах" и извращениях.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Apr 28 2007, 08:12
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(zltigo @ Apr 28 2007, 00:05)  Лично я на этом закончил, Могли бы и не начинать. to all: А всеже интересно, когда указываете на структуру через амперсанд, какой тип данных должен иметь указатель? (пусть даже на для компилятора ИАР). Я пробовал сделать это на другом компиляторе у меня тоже не получилось. Умные люди подсказывают что тип указателя должен быть void. По идее в момент инициализации данных можно описать массив указателей типа void и потом амперсанд структуры присвоить первому элементу этого массива.
|
|
|
|
|
Apr 28 2007, 09:56
|

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 и потом амперсанд структуры присвоить первому элементу этого массива. Что такое "амперсанд структуры"? Это новый термин в языке? Покажите лучше, код, который имеете в виду, возможно, так будет понятнее и однозначее.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 28 2007, 11:11
|
Местный
  
Группа: Новичок
Сообщений: 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, т.е. получение адреса по которому располагается данные описанные в структуре. Этот пример кода взят (судя по всему) из учебника - автором темы. Никто не сомневается что он должен работать. Автор темы попытался применить его в ИАР компиляторе - результат: не работатет. Вопрос в том: почему он не работатет и развивая мысль дальше - неплохо бы сделать совмещение начала адресов массива и структуры в памяти - тогда необходимость копирования данных из одного места в другое автоматически отпадает. Так лучше?
|
|
|
|
|
Apr 28 2007, 14:01
|

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

|
Цитата(lks @ Apr 28 2007, 15:11)  Значок & - называется амперсанд, или оператор указания. Неверно. & - это оператор взятия адреса, а не оператор указания. Цитата(lks @ Apr 28 2007, 15:11)  Когда пишу "амперсанд структуры" - подразумеваю - &BootSector, т.е. получение адреса по которому располагается данные описанные в структуре. Какие данные? Все, что-ли? "Амперсанд структуры" - это совершенно неверная терминология, отсюда и путаница, и вопросы. &BootSector - это адрес структуры (а не амперсанд). Употребляйте правильную терминологию и Вас правильно поймут. Цитата(lks @ Apr 28 2007, 15:11)  Этот пример кода взят (судя по всему) из учебника - автором темы. Никто не сомневается что он должен работать. unsigned char *ptr = &BootSector (где BootSector - структура), работать не должно и не работает. Цитата(lks @ Apr 28 2007, 15:11)  Автор темы попытался применить его в ИАР компиляторе - результат: не работатет. Потому, что не должен он работать. Ни в каком компиляторе, а не только в IAR. Цитата(lks @ Apr 28 2007, 15:11)  Вопрос в том: почему он не работатет Потому, что в этом выражении возникает элементарная несовместимость типов - нельзя указателю на один тип присваивать адрес объекта другого типа. Потому, что в этом случае работать с указателем будет небезопасно - компилятор, зная тип указателя, будет выполнять действия, пригодные к типу этого указателя, а на самом деле будет работать с объектом совершенно другого типа. Вслепую. Это источник очень гадких и трудноуловимых глюков. Статический контроль типов защищает от этой ситуации. Присваивать указателю void* разрешается потому, что с этим указателем ничего делать нельзя - к объекту не доступиться. Цитата(lks @ Apr 28 2007, 15:11)  и развивая мысль дальше - неплохо бы сделать совмещение начала адресов массива и структуры в памяти - тогда необходимость копирования данных из одного места в другое автоматически отпадает. Глубины этой мысли я асилить не смог. Цитата(lks @ Apr 28 2007, 15:11)  Так лучше? No comments.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 28 2007, 15:22
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(dxp @ Apr 28 2007, 15:01)  Неверно. & - это оператор взятия адреса, а не оператор указания. Вот так, да? Вы меня насмешили. Тогда указатель на что будет указывать? Кстати термин не я придумал : Энциклопедия языка Си. Я. Белецкий. М. Мир. Стр 52. Цитата(dxp @ Apr 28 2007, 15:01)  &BootSector - это адрес структуры (а не амперсанд). Употребляйте правильную терминологию и Вас правильно поймут. Вы там это серъезно об этом? Вот эта хрень "&" - собстно и называется амперсанд. Так как (всеже) присвоить адрес структуры указателю? Цитата(dxp @ Apr 28 2007, 15:01)  нельзя указателю на один тип присваивать адрес объекта другого типа. Потому, что в этом случае работать с указателем будет небезопасно - компилятор, зная тип указателя, будет выполнять действия, пригодные к типу этого указателя, а на самом деле будет работать с объектом совершенно другого типа. Ну тогда обясните почему я всегда могу получить адресс массива через амперсанд не зависимо от типа данных, а от структуры не получается. Я могу привести ссылку где утверждается, что в этом случае возможны ошибки чтения данных (в случае со структурой), и программисту надо быть внимательным. Т.е. не предполагается что эта функция заблокирована. Мы говорим о начальном адресе структуры, а не о типе данных. Вот пример приведен во всех учебниках со структурой - а вы заладили - нельзя, нельзя. Цитата(dxp @ Apr 28 2007, 15:01)  Глубины этой мысли я асилить не смог. No comments.  Чтож тут такого умного? Полистайте какие-нибудь исходники написанные на языке Си - это типовая операция, вааще-то. Вам сказать нечего - вот и придумываете разные предлоги. Нет бы сказали честно - не пишем мы на Си - только на Дэлфи (фортране, или кто на чем). :-)
|
|
|
|
|
Apr 28 2007, 17:48
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(lks @ Apr 28 2007, 18:22)  Ну тогда обясните почему я всегда могу получить адресс массива через амперсанд не зависимо от типа данных, а от структуры не получается. lks, может вам образный пример поможет?  Пускай данные будут гайками, массив данных - ящик с одинаковыми гайками, разложенными по ячеечкам, а структура это автомобиль. Когда вы указываете на массив данных, то даете отмашку в направлении ящика с гайками. Причем все гайки в этом ящике одинаковые и расположение их тоже одинаково. Когда же вы указываете на структуру, то отмашка будет уже на весьма сложное устройство - автомобиль. В этом устройстве тоже есть такие же гайки, как и в ящике, но кроме гаек там еще туева хуча других железок, расположенных и соединенных между собой весьма замысловатым образом. Если вы указали на данные (гайки) и попросили кого-либо принести третью по счету гайку, то он выполнит это без проблем. А вот с автомобилем, так просто не получится. Чтобы достать из автомобиля третью гайку, этому "кому-либо" понадобится как минимум список деталей автомобиля (описание структуры) и инструмент для его разборки/сборки и извлечения этой третьей гайки (механизм доступа к структуре). Надеюсь, такая аналогия отличий указателя на данные и структуру вам будет понятна?
|
|
|
|
Сообщений в этой теме
tolik_zp структуры в С Apr 26 2007, 16:05 o-henry код в студию Apr 26 2007, 16:10 tolik_zp Цитата(o-henry @ Apr 26 2007, 16:10)... Apr 26 2007, 16:16  o-henry а приведение типов кто делать будет?
ptr = (char*... Apr 26 2007, 16:30  dxp Цитата(tolik_zp @ Apr 26 2007, 20:16) вот... Apr 26 2007, 16:32  lks Попробуйте указать на переменную JmpCmd - т.е. ам... Apr 26 2007, 20:30   Сергей Борщ Цитата(lks @ Apr 26 2007, 19:30) Попробуй... Apr 26 2007, 22:25    lks Цитата(Сергей Борщ @ Apr 26 2007, 23:25) ... Apr 26 2007, 23:10     Сергей Борщ Цитата(lks @ Apr 26 2007, 22:10) Вопрос г... Apr 27 2007, 00:52   zltigo Цитата(lks @ Apr 26 2007, 20:30) а на пер... Apr 26 2007, 23:19 v_shamaev Цитата(tolik_zp @ Apr 26 2007, 17:05) Име... Apr 26 2007, 16:10 zltigo Цитата(tolik_zp @ Apr 26 2007, 16:05) поп... Apr 26 2007, 16:16 rezident Об чем сыр-бор? Явное приведение типов всяко лучше... Apr 27 2007, 01:40 tolik_zp всем спасибо, работает. век живи - век rtfm Apr 27 2007, 12:23  lks Цитата(tolik_zp @ Apr 27 2007, 13:23) все... Apr 27 2007, 18:45   zltigo Цитата(lks @ Apr 27 2007, 18:45) Приведит... Apr 27 2007, 18:57    lks Цитата(zltigo @ Apr 27 2007, 19:57) Для с... Apr 27 2007, 19:53     zltigo Цитата(lks @ Apr 27 2007, 19:53) Ну может... Apr 27 2007, 20:06       o-henry Цитата(lks @ Apr 28 2007, 10:11) Этот при... Apr 28 2007, 11:53        lks Цитата(o-henry @ Apr 28 2007, 12:53)... Apr 28 2007, 12:58         Сергей Борщ Цитата(lks @ Apr 28 2007, 11:58) Может ну... Apr 28 2007, 13:28       zltigo Цитата(lks @ Apr 28 2007, 11:11) Никто не... Apr 28 2007, 12:09       Сергей Борщ Цитата(lks @ Apr 28 2007, 10:11) Вопрос в... Apr 28 2007, 12:46         dxp Цитата(lks @ Apr 28 2007, 19:22) Вот так,... Apr 28 2007, 17:21          lks Цитата(dxp @ Apr 28 2007, 18:21) P.P.S. Ч... Apr 28 2007, 21:34           rezident Цитата(lks @ Apr 29 2007, 00:34) typedef ... Apr 28 2007, 22:19          lks Цитата(dxp @ Apr 28 2007, 18:21) Какой пр... Apr 28 2007, 22:26           Legotron Цитата(lks @ Apr 28 2007, 23:26) И все же... Apr 28 2007, 22:58            lks Цитата(Legotron @ Apr 28 2007, 23:58) Я д... Apr 29 2007, 14:26             zltigo Цитата(lks @ Apr 29 2007, 14:26) Возможно... Apr 29 2007, 15:29              lks Цитата(zltigo @ Apr 29 2007, 16:29) Подск... Apr 29 2007, 15:49               Сергей Борщ Ладно, я еще поприкалываюсь
Цитата(lks @ Apr ... Apr 29 2007, 18:02                lks Цитата(Сергей Борщ @ Apr 29 2007, 19:02) ... Apr 29 2007, 19:24                 zltigo Цитата(lks @ Apr 29 2007, 19:24) Что тоже... Apr 29 2007, 19:36                  lks Цитата(zltigo @ Apr 29 2007, 20:36) Блеск... Apr 29 2007, 19:46                   zltigo Цитата(lks @ Apr 29 2007, 19:46) Да нет, ... Apr 29 2007, 20:01                 Сергей Борщ Цитата(lks @ Apr 29 2007, 19:24) В чем пр... Apr 29 2007, 21:03                  lks Цитата(Сергей Борщ @ Apr 29 2007, 22:03) ... Apr 29 2007, 21:31                   zltigo Цитата(lks @ Apr 29 2007, 21:31) книжку п... Apr 29 2007, 21:41                    lks Цитата(zltigo @ Apr 29 2007, 22:41) За яз... Apr 29 2007, 21:50                     zltigo Цитата(lks @ Apr 29 2007, 21:50) А что вы... Apr 29 2007, 22:04                      Legotron Уважаемые собеседники!
Не составит ли вам бол... Apr 29 2007, 22:36                       zltigo Цитата(Legotron @ Apr 29 2007, 22:36) еще... Apr 29 2007, 22:56            Legotron Цитата(Legotron @ Apr 28 2007, 23:58) У м... Apr 29 2007, 15:44             zltigo Цитата(Legotron @ Apr 29 2007, 15:44) Ptr... Apr 29 2007, 15:54              Legotron Цитата(zltigo @ Apr 29 2007, 16:51) ... Apr 29 2007, 15:56               zltigo Цитата(Legotron @ Apr 29 2007, 15:56) why... Apr 29 2007, 16:06                Legotron Цитата(zltigo @ Apr 29 2007, 17:06) Потом... Apr 29 2007, 16:23           rezident Цитата(lks @ Apr 29 2007, 01:26) Непонятн... Apr 29 2007, 00:35 o-henry Уважаемый tolik_zp!
На Ваш вопрос Вы уже полу... Apr 28 2007, 15:40 lks Цитата(o-henry @ Apr 28 2007, 16:40)... Apr 28 2007, 15:47  zltigo Цитата(lks @ Apr 28 2007, 15:47) А я не н... Apr 28 2007, 15:57   lks Цитата(zltigo @ Apr 28 2007, 16:57) Тем х... Apr 28 2007, 16:58    zltigo Цитата(lks @ Apr 28 2007, 16:58) По сущес... Apr 28 2007, 17:10 Vladimir Chekin Дежа-вю...
Юзер: - Я решил сварить яйцо в микровол... Apr 28 2007, 19:00 rezident Цитата(Vladimir Chekin)Написать или заказать напис... Apr 28 2007, 19:04 rezident Цитата(lks)Когда вы извлекаете адрес переменной с ... Apr 29 2007, 15:21 lks Цитата(rezident @ Apr 29 2007, 16:21) Ну ... Apr 29 2007, 16:43  rezident Цитата(lks @ Apr 29 2007, 19:34) Если я н... Apr 29 2007, 16:49  zltigo Цитата(lks @ Apr 29 2007, 16:34) Если я н... Apr 29 2007, 17:10   lks Цитата(zltigo @ Apr 29 2007, 18:10) Для т... Apr 29 2007, 17:25    zltigo Цитата(lks @ Apr 29 2007, 17:25) Список -... Apr 29 2007, 17:47 forever failure Неужели Дохтур Туамосес ? Apr 29 2007, 19:35 Vladimir Chekin rezident >> У вас есть адрес Доктора ТуамОс... Apr 30 2007, 03:24 Vladimir Chekin Может и не в кассу, имхо вот в этой короткой фразе... Apr 30 2007, 04:28 zltigo Цитата(Vladimir Chekin @ Apr 30 2007, 04... Apr 30 2007, 13:30  Dog Pawlowa Цитата(zltigo @ Apr 30 2007, 13:30) Описа... Apr 30 2007, 17:16   zltigo Цитата(Dog Pawlowa @ Apr 30 2007, 17:16) ... Apr 30 2007, 17:28
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|