|
структуры в С, копирование в байтовый массив |
|
|
|
 |
Ответов
|
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:21
|

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

|
Цитата(lks @ Apr 28 2007, 19:22)  Вот так, да? Вы меня насмешили. Тогда указатель на что будет указывать? Кстати термин не я придумал : Энциклопедия языка Си. Я. Белецкий. М. Мир. Стр 52. Не читайте больше эту книжку. Фтопку ее. Серьезно. Читайте Д.Ричи, Б.Керниган "Язык программирования С". Цитата(lks @ Apr 28 2007, 19:22)  Вы там это серъезно об этом? Вот эта хрень "&" - собстно и называется амперсанд. Да, эта хрень "&" действительно называется амперсандом. А вот эта хрень &BootSector в языках программирования С/С++ называется адресом объекта. Цитата(lks @ Apr 28 2007, 19:22)  Так как (всеже) присвоить адрес структуры указателю? Код typedef struct { ... } TBootSector;
TBootSector *p; TBootSector BootSector;
p = &BootSector; Если же хочется присвоить адрес структуры указателю на ДРУГОЙ тип, что является потенциально опасным, то это тоже можно сделать, но при этом надо сообщить компилятору, чтобы он не возмущался, что мы делаем эту опасную вещь осознанно. Для этого используется ручное преобразование типа: Код char *p;
p = (char*)&BootSector; Я понятно объясняю?  Цитата(lks @ Apr 28 2007, 19:22)  Ну тогда обясните почему я всегда могу получить адресс массива через амперсанд не зависимо от типа данных, а от структуры не получается. И от структуры взять адрес тоже получается. Вот только пихать его куда попало не получается просто так. И это правильно. С массивом есть одна особенность: про массивы есть правило, что адрес массива является адресом его первого элемента. Это логично и безопасно, т.к. все элементы в массиве одинаковые - т.е. адресная арифметика с указателем, имеющим адрес массива, работает правильно. А вот с другими агрегатными объектами, к которым относится и структура, это не верно. Кстати, адрес массива сунуть, например, в указатель на структуру Вам вряд ли удастся по тем же причинам, почему нельзя адрес структуры сунуть в указатель на char. Цитата(lks @ Apr 28 2007, 19:22)  Вот пример приведен во всех учебниках со структурой - а вы заладили - нельзя, нельзя. Чтож тут такого умного? Какой пример? Приведите его сюда, плиз. Со ссылкой на учебник. Цитата(lks @ Apr 28 2007, 19:22)  Полистайте какие-нибудь исходники написанные на языке Си - это типовая операция, вааще-то. Вам сказать нечего - вот и придумываете разные предлоги. Нет бы сказали честно - не пишем мы на Си - только на Дэлфи (фортране, или кто на чем). :-) Я уже много всякого полистал насчет и С, и С++, не надо меня отсылать. Не хочу показаться невежливым, но приходится констатировать факт, что Вы не знаете элементарных вещей из ЯП С и, что самое плохое (для Вас) и неприятное (для меня), упорствуете в этом невежестве. P.S. Дельфи и фортран я почти не знаю, никогда на них ничего серьезного не писал. На Си действительно уже давно не пишу, все больше на С++, но в обсуждаемых аспектах эти языка почти совершенно одинаковы. P.P.S. Что-то я утомился и желание вести эту дискуссию (в тоне последней Вашей фразы) у меня пропало. Всего Вам хорошего.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 28 2007, 22:26
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(dxp @ Apr 28 2007, 18:21)  Какой пример? Приведите его сюда, плиз. Со ссылкой на учебник. Еще один пример. struct S {...}s; struct S *ps; ps=&s; Программирование в среде Си для ПЭВМ ЕС. авторы. Стр 125. Тоже в топку? Цитата(rezident @ Apr 28 2007, 23:19)  А что у вас в "такой конструкции" вызывает удивление? Непонятно пока где описать этот тип данных - TBootSector *p; Этот адрес потом непереписать в обычный указатель? Ну и как на эту "баламутину" отреагирует Keil допустим. И все же читал где-то, сейчас не могу вспомнить, не должно быть запрета на получение адреса структуры. Указатель на структуру должен быть всеже адресом первого байта в выделенном адресном пространстве, точно также как и в массивах - тип тут ни при чем. Тут что-то с компиляторами.
Сообщение отредактировал lks - Apr 28 2007, 22:40
|
|
|
|
|
Apr 28 2007, 22:58
|

инопланетянин
  
Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832

|
Цитата(lks @ Apr 28 2007, 23:26)  И все же читал где-то, сейчас не могу вспомнить, не должно быть запрета на получение адреса структуры. Указатель на структуру должен быть всеже адресом первого байта в выделенном адресном пространстве, точно также как и в массивах - тип тут ни при чем. Тут что-то с компиляторами. Я делал когда-то таким образом: Был массив, который представлял собой файл EMF формата. Там структуры записаны. У меня было несколько разных типов структур и 1 указатель, который я каждый раз приводил к типу той структуры, которая мне нужна. И получал доступ к их полям. Тока с упаковкой структур (надо/ненадо) нужно быть внимательнее.
|
|
|
|
Сообщений в этой теме
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          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 Цитата(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         rezident Цитата(lks @ Apr 28 2007, 18:22) Ну тогда... Apr 28 2007, 17:48 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
|
|
|