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

Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Apr 27 2007, 19:53
|
Местный
  
Группа: Новичок
Сообщений: 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 - как телеге пятое колесо (или очень неэффективный прием).
|
|
|
|
|
Apr 27 2007, 20:06
|

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

|
Цитата(lks @ Apr 27 2007, 19:53)  Ну может быть.. Не может быть. Учите матчасть. Цитата Допустим чтобы работало как union - внутри: массив + структура. union двух структур и используйте - одна стркутура с массивом, вторая со всякой всячиной. Обычно это не делается, поскольку нагляднее банальное преобразование типов. Цитата Тогда реально memcpy - как телеге пятое колесо (или очень неэффективный прием). Это две совсем разные вещи никак не заменяющие друг друга. Заговариваетесь?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
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, 11:53
|

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

|
Цитата(lks @ Apr 28 2007, 10:11)  Этот пример кода взят (судя по всему) из учебника - автором темы. Никто не сомневается что он должен работать. А чего тут сомневаться  ? Разумеется он не должен работать. В приведенном коде указателю на unsigned charприсваивается адрес структуры BootSectorStruct, т.е адрес объекта совершенно другого типа. И любой компилятор просто обязан сообщить об ошибке. А тот факт, что в данном случае структура состоит исключительно из массивов типа unsigned char совершенно никакой роли не играет.
|
|
|
|
|
Apr 28 2007, 12:46
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 28 2007, 12:58
|
Местный
  
Группа: Новичок
Сообщений: 493
Регистрация: 18-06-06
Пользователь №: 18 143

|
Цитата(o-henry @ Apr 28 2007, 12:53)  А чего тут сомневаться  ? Разумеется он не должен работать. Может нужно вместо unsigned char *ptr - написать void *ptr? Мне кажется это ничего не изменит. Ошибка будет в момент выполнения операции & от структуры. Вы серъезно считаете что энциклопедию языка Си писали идиоты? Цитата(Сергей Борщ @ Apr 28 2007, 13:46)  Если вам что-то будет непонятно у Кернигана и Ритчи - спрашивайте, с удовольствием объясним. Но сделайте сначала сами элементарное усилие.
P.S. Какой, нафиг, пример из учебника, если судя по названию массива идет работа с MultiMedia Card? Нет, нет - с учебниками все в порядке. Желающих пересказывать в форуме учебники и так черезчур много. Небеспокойтесь. А что разве Си нельзя применять для MMC - это такое системное ограничение - типа чернила только для 8 класса?
|
|
|
|
|
Apr 28 2007, 13:28
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|