КИТА unofficial
Ноябрь 22, 2024, 09:43:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Викторина на тему "Искусство программирования" (задача 4)  (Прочитано 23530 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #20 : Март 15, 2007, 07:17:25 »

уххххх..... ну чё я сказать могу? Твоя цитата относится ко всем директивам #pragma. А конкретно про #pragma pack ничего не сказано.Там только общие фразы и ничего конкретного.

Все там конкретно: семантика конкретной прагмы зависит от реализации в конкретном компиляторе. Т.е. два компилятора, соответствующих стандарту С++ могут ее по разному интерпретировать и реагировать на нее.

Цитировать
я С реально использую и все мои задачи взяты реально из практики. Если исходить из твоей логики, тогда мой пример не имеет решения, и предопределить действие компилятора вообще невозможно? ерунда какая-то.

Возможно узнать действия компилятора. Для этого нужно узнать какие прагмы в данном компиляторе поддерживаются и что делают. ))

Цитировать
Что на практике проверено, то факт, а то что на бумаге написано - то фигня. Вот мое мнение.

Это мнение студента-первокурсника «но программа ведь компилится и работает!!!» в ответ на замечание преподавателя о наличии логической ошибки в программе. ))

Цитировать

Единственная зависимость от компилятора и от платформы: установленное значение по умолчанию для #pragma pack

Компилятор С++ по стандарту вообще может не поддерживать твою прагму или придавать ей другой смысл. Но если стандарт - это не авторитетный источник, тогда вопрос закрываю...

А указать место мусора в структуре тоже было несложно.

Ты уверен в том что мусор будет в указанном тобой месте и в указанном тобой размере на любой из существующих или будущих платформах, для которой можно создать компилятор С++? Или вообще в наличии мусора как такового на любой платформе?
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #21 : Март 15, 2007, 07:28:31 »

Да, стандарт - это не авторитетный источник.
привели конкретный пример платформы или компилятора, где не работает #pragma pack
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #22 : Март 15, 2007, 07:35:08 »

Да, стандарт - это не авторитетный источник.

Все вопросов больше не имею.

Цитировать
привели конкретный пример платформы или компилятора, где не работает #pragma pack

Товарищ, язык С++ - это язык программирования, который описан в стандарте, а не компилятор, уж прости за то что приходится повторять очевидные казалось бы вещи. Есть компиляторы, нету компиляторов, поддерживают они стандарт или нет, вне зависимости от этого если ты пишешь в условии задачи про исходник на С++ без указания компилятора, то это подразумевает, что решение доступно стандартными средствами, а все нестандартные фокусы неприменимы. Иначе твоя задача несостоятельна. Заметь, даже при условии, что я такой платформы или компилятора могу и не знать.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #23 : Март 15, 2007, 08:10:29 »

Sochin ты меня замучал своими придирками. Нормальная задача, нормальные требования и нормальный ответ. Все твои слова - вода. Я, в отличие от тебя, привел конкретную реализацию, конкретный ответ и конкретные компиляторы где все это работает.
Если ты уверен что я ошибаюсь, тогда приведи конкретный пример, как Storm.

Нестандартных фокусов тут нет. Если ты не сталкивался с такой проблемой на практике, это не значит что я тут шаманю.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Storm
Верховный
Администратор
Аспирант
*****

Карма: +29/-0
Offline Offline

Пол: Мужской
Сообщений: 484



« Ответ #24 : Март 15, 2007, 10:20:27 »

Storm может и побайтовое, если контроллер. )))))))))
Вообще-то чтобы получилось 1 или -1, надо предварительно заполнить структуру (и мусор в ней) какими-то значениями, например командой memset. По стандарту в С++ все создаваемые объекты равны 0 или заполнены 0х00.
Именно, AVR фирмы Atmel и MicroCHIP PIC. в них считаешь каждый бит и раскидываться на выравнивание непозволительная роскошь.
Записан

Только две вещи бесконечны: вселенная и тупость, и я еще не уверен по поводу вселенной. (Альберт Эйнштейн)
----------------------------------------------------
"There are two major products that came out of Berkeley: LSD and UNIX. We don't believe this to be a coincidence." (с) Jeremy S. Anderson

Проходит ирландец мимо паба....
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #25 : Март 16, 2007, 11:38:44 »

Sochin ты меня замучал своими придирками. Нормальная задача, нормальные требования и нормальный ответ. Все твои слова - вода.


Придирки? Вода? Цитаты пожалуйста.
Куда уж конкретнее -
#pragma pack не описана в стандарте языка, т.е. она не является стандартной для С++. Ее употребление - это нестандартная фича. Если мы говорим о конретном компиляторе - нет вопросов. Но ты настаиваешь на том, чтобы не указывать конкретную реализацию. А если мы говорим о языке в целом, то твой ответ на твою же задачу не является верным для общего случая.
Вода?

Цитировать
Я, в отличие от тебя, привел конкретную реализацию, конкретный ответ и конкретные компиляторы где все это работает.


Да нет проблем, работает и хорошо, я ж не говорю что не работает. Но я, похоже что в отличие от тебя, понимаю что такое язык и стандарт и что такое компилятор и нестандартные фичи.

Цитировать
Если ты уверен что я ошибаюсь, тогда приведи конкретный пример, как Storm.


Компилятор назвать? Пожалуйста, в качестве примера IBM Rational Apex® C/C++ compiler

Вот посмотри, что пишут ребята из IBM (понимаю, что для тебя это возможно полная туфта, также как и стандарт языка, но все же):
Цитировать
C/C++ programmers often rely upon '#pragma pack' to remove padding between structure fields. However, this pragma has many pitfalls and it is not supported in the IBM Rational Apex® C/C++ compiler.

There are some reasons not to use pragma pack:

[1] It is implementation defined (as with all pragmas). Some processors have the instruction set to support non-aligned memory whereas others do not.

[2] The syntax of pragma pack varies across implementations. 'pragma pack (n)' is the most common syntax for setting a particular packing alignment, but implementations vary in how to tell the compiler reset to the default alignment. Sometimes it's 'pragma pack (0)' while other times it's 'pragma pack ()'. Plus there are the 'push' and 'pop' derivatives offered by some vendors. In summary, the pragma is not portable.

[3] pragma pack is stand-alone and affects all following declarations until the next pragma pack or the end of the compilation unit. Therefore, it is very easy to apply packing to structures where it is not wanted.

[4] pragma pack specifies a *maximum* alignment. Thus, 'pragma pack (2)' followed by a structure of chars could give you either (i) each char packed into a byte or (ii) each char packed into a word. You won't know without debugging the code.


Цитировать
Нестандартных фокусов тут нет. Если ты не сталкивался с такой проблемой на практике, это не значит что я тут шаманю.


Ой я тебя умоляю. Твой ответ не соответствует стандарту С++. Если ты не уважаешь стандарты, это другой вопрос. Менее нестандартным (с точки зрения стандарта С++ конечно, а то может у тебя другое понимание «стандартности/нестандартности») он от этого не становится. И я тут ни при чем. Все вопросы - в комитет по стандартизации.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #26 : Март 16, 2007, 12:30:21 »

Отлично! IBM -> http://www-1.ibm.com/support/ авторитетный для меня источник. Хорошая статья.

1. Теперь согласен, #pragma pack работает не на всех компиляторах.
Цитировать
С++ это не регламентирует и не ограничивает

В данной статье отлично показано как изменить расположение членов структуры в памяти используя С++.

2. Специалисты IBM отлично умеют расчитывать дыры в структурах и их конкретный размер. Это не случайный процесс, а четко определенный, его можно изучить и научится расчитывать самому.

3. Мой пример показывает, что необходимо хотябы примерно прикидывать расположение объектов в памяти и исключать подобные ошибки еще на этапе программирования.

4. Я думаю надо заканчивать эту дискуссию. На твое следующее сообщение отвечать не буду.

ДА, забыл,  Sochin +1 за ссылку на статью.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #27 : Март 16, 2007, 12:44:42 »

Цитировать
С++ это не регламентирует и не ограничивает
В данной статье отлично показано как изменить расположение членов структуры в памяти используя С++.

Хе-хе. Цитируемое тобой замечание касалось конкретно твоего примера простой структуры без битовых полей. ))

З.Ы. До встречи в очередной дискуссии. Закрывай тему. )))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Страниц: 1 [2]  Все   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.241 секунд. Запросов: 31.