Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Вниз

Неясности в формате файла   Найти похожие ветки 

 
Виталий ©   (2010-07-07 12:02) [0]

Здравствуйте. Пишу приложение, которое должно сохранять нарисованые пользователем картинки в фалй .FNT (простите за древний формат, это необходимость). Стал разбираться с форматом файла. Неясен следующий момент:

The following is a single-character example, in which
              are given the bytes for a 12 x 14 pixel character, as
              shown here schematically.

                 ............
                 .....**.....
                 ....*..*....
                 ...*....*...
                 ..*......*..
                 ..*......*..
                 ..*......*..
                 ..********..
                 ..*......*..
                 ..*......*..
                 ..*......*..
                 ............
                 ............
                 ............

              The bytes are given here in two sets, because the
              character is less than 17 pixels wide.

                 00 06 09 10 20 20 20 3F 20 20 20 00 00 00
                 00 00 00 80 40 40 40 C0 40 40 40 00 00 00

Можете пояснить, каким образом появилась представленая последовательность?
Формат файла тут: http://support.microsoft.com/kb/65123


 
Демо ©   (2010-07-07 12:13) [1]


> Можете пояснить, каким образом появилась представленая последовательность?


А весь дамп нельзя выложить?


 
Виталий ©   (2010-07-07 12:18) [2]

Дамп чего? Это фрагмент из описания от MS. Я не могу понять, как буква "A" выражена этими числами. Точки как-то не совпадают.


 
Sha ©   (2010-07-07 12:26) [3]

Каждая вертикальная пара байтов кодирует одну строку растра.


 
Palladin ©   (2010-07-07 12:29) [4]


> Виталий ©   (07.07.10 12:18) [2]

переведи 6, а потом 9, в двоичный и поймешь


 
Виталий ©   (2010-07-07 12:43) [5]

Не понимаю ( Вертикальная пара - это 06 00 ?
Ну получается скажем 011000 - что из этого?


 
Palladin ©   (2010-07-07 12:44) [6]

мля! я же сказал "а потом 9", что лень чтоли?


 
Palladin ©   (2010-07-07 12:45) [7]

и не 011000, а 000110
разворот делаем, да


 
Palladin ©   (2010-07-07 12:46) [8]

тьфу... до 8 байт спереди.... короче... не тупи


 
RWolf ©   (2010-07-07 12:46) [9]

байты соответствуют колонке 8 точек шириной сверху вниз, очевидно же.


 
Palladin ©   (2010-07-07 12:48) [10]


> до 8 байт спереди.

бит то есть


 
Плохиш ©   (2010-07-07 12:48) [11]


> Виталий ©   (07.07.10 12:43) [5]
>
> Не понимаю ( Вертикальная пара - это 06 00 ?
> Ну получается скажем 011000 - что из этого?
>

Хм, и как ты умудрился из 0600  011000 получить?


 
Sha ©   (2010-07-07 12:48) [12]

> Виталий ©   (07.07.10 12:43) [5]
> Не понимаю ( Вертикальная пара - это 06 00 ?
> Ну получается скажем 011000 - что из этого?

Нет. Получается 00000110 00000000. Из этих битов берем только 12.


 
RWolf ©   (2010-07-07 12:49) [13]

и да, редакторов FNT великое множество.


 
Виталий ©   (2010-07-07 12:56) [14]


> Хм, и как ты умудрился из 0600  011000 получить?

я идиот, убейте меня кто-нибудь :)


> мля! я же сказал "а потом 9", что лень чтоли?

не ругайтесь. Не лень, просто с шестеркой понять надо. Уже понял, спасибо

> и да, редакторов FNT великое множество.


найти бы какой-то с исходниками и посмотреть, как пишут реальные кодеры. А так - в меру своих скромных сил.


 
Amoeba_   (2010-07-07 13:39) [15]


> RWolf ©   (07.07.10 12:49) [13]
>
> и да, редакторов FNT великое множество.

К примеру, такой есть в Borland Resource Workshop (входит в комплект Borland Pascal).


 
Виталий ©   (2010-07-07 22:19) [16]

Блин, не могу понять, а где используется структура GlyphEntry?


 
Виталий ©   (2010-07-07 22:43) [17]

Кажется, понял: эта структура входит в главную структуру файла (по крайней мере, чисто технически ее можно не выделять). Остается только вопрос: как, пусть для примера имея пока что матрицу из 0 и 1 (думаю, в отделении логики и представления она и так будет присутствовать) "собрать" совокупность байтов?


 
Sha ©   (2010-07-08 00:42) [18]

> "собрать" совокупность байтов


   i:=0;
   for dx:=0 to maxdx do if pixel[dy,dx] then i:=i+weight[dx];


 
Виталий ©   (2010-07-08 09:36) [19]

То есть мне не нужно представлять данные в виде "вертикального набора". Теперь понял.
Мда, однако в формате столько разных мелочей, что написать его, видимо, не смогу - гугль ничего не дает, а из описания неясно, например, как разделять "битмапы". Ни у кого нету хотя бы небольшого примера кода, показываюещего, как заполнять все структуры файла, или пояснения этого более подробного, чем от MS?


 
Виталий ©   (2010-07-09 00:02) [20]

Ладно, дабы не мучать тупыми вопросами, буду пытаться постигнуть сам. Помогите тогда с конкретикой.
dfPitchAndFamily
              Specifies the pitch and font family. The low bit is set
              if the font is variable pitch. The high four bits give
              the family name of the font. Font families describe in
              a general way the look of a font. They are intended for
              specifying fonts when the exact face name desired is
              not available. The families are as follows:

                 Family               Description
                 ------               -----------
                 FF_DONTCARE (0<<4)   Don"t care or don"t know.
                 FF_ROMAN (1<<4)      Proportionally spaced fonts
                                      with serifs.
                 FF_SWISS (2<<4)      Proportionally spaced fonts
                                      without serifs.
                 FF_MODERN (3<<4)     Fixed-pitch fonts.
                 FF_SCRIPT (4<<4)
                 FF_DECORATIVE (5<<4)
Как это поле заполнить в Delphi?


 
0x00FF00   (2010-07-09 02:42) [21]


> Как это поле заполнить в Delphi?

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

ну, и младший бит сбросьте, если предоставляете фиксированную ширину канвы для всех символов, или взведите, если ширину можно задать свою для каждого символа в отдельности (скажем, у "пробела" ширина — 7, у буквы А — 12, у буквы М — вообще 15, итд).


 
0x00FF00   (2010-07-09 02:46) [22]


> юзер может намазюкать
> его ахинея "на выходе"

Во блин, прям как по Фрейду...
Крепко ж они достали. В отпуск пора =)


 
Виталий ©   (2010-07-09 10:32) [23]

То есть, насколько я понимаю, поле должно быть равным нулю?


 
0x00FF00   (2010-07-09 12:53) [24]


> То есть, насколько я понимаю, поле должно быть равным нулю?

/да. FF_DONTCARE + фиксированная ширина = $00000000.


 
Sha ©   (2010-07-09 13:45) [25]

> Виталий ©

Если на принтер будешь выводить сам, то может оказаться проще выводить в графическом режиме.
В этом случае отпадет необходимость изучения формата и загрузки фонта в принтер.


 
Виталий ©   (2010-07-09 21:34) [26]

Да тут принтер-то не нужен. Хочу написать именно редактор, просто формат (для меня) более-менее сложный и хочу понять на его примере, как работать с форматами файлов, что называется, на низком уровне. Можно еще вопросы задавать?


 
0x00FF00   (2010-07-09 21:52) [27]


> Можно еще вопросы задавать?

когда-то один мудрый модератор сказал мне, нерадивому падавану:

 — Don"t ask to ask, just ask.

и я ушёл просветлённый =)


 
Виталий ©   (2010-07-11 22:01) [28]

dfFirstChar    1 byte specifying the first character code defined by
              this font. Character definitions are stored only for
              the characters actually present in a font. Therefore,
              use this field when calculating indexes into either
              dfBits or dfCharOffset.

dfLastChar     1 byte specifying the last character code defined by
              this font. Note that all the characters with codes
              between dfFirstChar and dfLastChar must be present in
              the font character definitions.

dfDefaultChar  1 byte specifying the character to substitute
              whenever a string contains a character out of the
              range. The character is given relative to dfFirstChar
              so that dfDefaultChar is the actual value of the
              character, less dfFirstChar. The dfDefaultChar should
              indicate a special character that is not a space.

dfBreakChar    1 byte specifying the character that will define word
              breaks. This character defines word breaks for word
              wrapping and word spacing justification. The character
              is given relative to dfFirstChar so that dfBreakChar is
              the actual value of the character, less that of
              dfFirstChar. The dfBreakChar is normally (32 -
              dfFirstChar), which is an ASCII space.

Можете пояснить принцип расстановки значений в этих полях? И особенно неясно 32 -dfFirstChar


 
Sha ©   (2010-07-11 22:05) [29]

Думаю, тут словарь нужен.


 
Виталий ©   (2010-07-12 10:15) [30]

Зачем? Я могу перевести этот текст.
1 байт, определяющий код первого символа шрифта - какой код должен быть? Использовать обычную таблицу ASCII?
Кроме того, упомянуто, что это поле будет использоваться для подсчета индексов в dfBits или dfCharOffset. Таких полей в описании формата нет!
1 байт, определяющий код последнего символа - тот же вопрос.
Символ, определяющий замену, если строка содержит символ, отсутствующий в диапазоне (символов?). Сказано, что он "относителен" от dfFirstChar, поэтому он ялвяется "актуальным значением" символа, меньшего dfFirstChar. Что это за символ? Как он может выглядеть, если далее указано, что это не пробел. Каково его значение?
1 байт, определяющий символ для отделения слов друг от друга. Он ТОЖЕ меньше dfFirstChar, и обычно его значение 32-dfFirstChar (и каково же оно?) и обычно является пробелом. Смотрим в ASCII таблицу: пробел - это символ с кодом 32. Получаем 32 = 32 - dfFirstChar => dfFirtChar = 0.
32 < 0??? Ничего не понимаю.


 
Sha ©   (2010-07-12 10:31) [31]

> Виталий ©   (12.07.10 10:15) [30]
> Я могу перевести этот текст.

Осталось понять...

Фонт может содержать изображения не всех символов,
а например, только больших или равных пробелу.
Вот его и требуется указать.

Про индексы забудь. Ты же не сам будешь печатать
и доставать изображения символов из фонта.
Здесь имеется в виду, что тот, кто будет это делать,
должен учитывать, что фонт может начинаться не с #0.


 
Виталий ©   (2010-07-12 10:55) [32]

Не совсем понял - "не сам будешь печатать
и доставать изображения символов из фонта."
А кто это делать будет?
И можете таки ответить на ряд моих вопросов выше?


 
Anatoly Podgoretsky ©   (2010-07-12 11:12) [33]

> Виталий  (12.07.2010 10:55:32)  [32]

Это будет делать подсистема печати.


 
Sha ©   (2010-07-12 11:12) [34]

> Не совсем понял - "не сам будешь печатать

см. [25]

Грубо способы общения с принтером (описаны в документации к нему):
- посылка символов,
- посылка управляющих команд,
- посылка графики.

Ты, похоже, не собираешься делать третье,
поэтому тебе не надо уметь разбирать свой фонт
и вычислять положение изображения символа в нем.


> И можете таки ответить на ряд моих вопросов выше?

Ты легко это сделашь сам, сравнивая описание формата
с отпечатанной ASCII-таблицей и содержимым файла
использованного при печати фонта.


 
Виталий ©   (2010-07-12 12:15) [35]

Мне НЕ нужен вывод на печать. Еще раз: я хочу формировать файл шрифта и читать его (если угодно, пиксели выводить на канве TImage потом). Поэтому таки мне как разн надо уметь и сохранить фонт и разобрать его при загрузке файла.
И не могу я сделать это сам - нет у меня на данный момент ни фонта, и не помогает мне ASCII-таблица.
В общем, пояснений мне никто дать не может.


 
Sha ©   (2010-07-12 12:48) [36]

> Виталий ©   (12.07.10 12:15) [35]

Еще один партизан.
Если б сразу сказал, что тебе надо, самому было бы проще.

Из условий задачи вовсе не следует, что фонт
обязан храниться в каком-то наперед заданном формате.
Придумай свой формат, который тебе удобен, и все.


 
Виталий ©   (2010-07-12 12:59) [37]

Да не молчал я!
Я объясню, чего я хочу: понять принцип работы со сложными форматами. Все, что я вижу, имеет обертку - сами читаются джейпеги и гифы многочисленными классами, сами же они сохраняются, и другие форматы тоже имеют многочисленные классы для их чтения.
А я хочу понять, как оно выглядит на "низком" уровне, научиться писать и читать из файлов по правильной документации к формату. И вот прошу мне объяснить, как оно происходит. И выбрал формат .FNT, только и всего.
Вот сейчас меня остановили непонятности в символах. Хочу понять, как индексы у них устроены. Подскажите же кто-нибудь, дайте совет, что посмотреть, как исследовать и уяснить себе этот момент.


 
Sha ©   (2010-07-12 13:16) [38]

> Хочу понять, как индексы у них устроены.

Нету у них индексов. В твоем случае это виртуальное понятие.

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

 
> Подскажите же кто-нибудь

Уже. См. [36]
Это самое простое решение, если появляются вопросы, подобные
http://delphimaster.net/view/2-1278658000/


 
Anatoly Podgoretsky ©   (2010-07-12 13:33) [39]

На нижнем уровне говоришь, тогда тебе нужен учебник по АПИ и настольная книга в виде MSDN


 
Виталий ©   (2010-07-12 13:34) [40]

Зря вы на мне ставите крест. Появился вопрос - спросил. Хотя, как теперь вижу, лучше бы и не спрашивал. Впрочем, понимаю: пояснять что-то никому просто не надо и не хочется. Спасибо.


 
Виталий ©   (2010-07-12 13:34) [41]

Анатолий, зачем API и MSDN для того, чтобы понять структуру файла FNT? :)


 
Sha ©   (2010-07-12 13:41) [42]

> Виталий ©   (12.07.10 13:34) [40]

Невозможно научиться скорочтению, пропустив букварь.


 
Anatoly Podgoretsky ©   (2010-07-12 13:44) [43]

> Виталий  (12.07.2010 13:34:41)  [41]

А чего там понимать, структура описана в WinApi, а вот понимания WinAPI и
принципов работы "железа" не хватает.


 
Виталий ©   (2010-07-12 13:45) [44]

Началось. Я задал несколько конкретных вопросов. Почему на них нельзя просто дать ответ или хотя бы подсказать что-то, чтобы я сам нашел его? Какой "букварь" мне надо прочесть?


 
Виталий ©   (2010-07-12 13:46) [45]


> понимания WinAPI и
> принципов работы "железа" не хватает.

Какие принципы WinAPI и работы "железа" я должен знать, чтобы вопросы по поводу символов мне стали ясны?


 
Anatoly Podgoretsky ©   (2010-07-12 13:48) [46]

При том, что я не про fnt, это частный случай, а про

> А я хочу понять, как оно выглядит на "низком" уровне, научиться
> писать и читать из файлов по правильной документации к формату.

Документированые структуры описаны в WinAPI, и его представителе MSDN

А читать стоит начать с Рихтера, у меня есть на сайте.


 
Sha ©   (2010-07-12 13:48) [47]

> Какой "букварь" мне надо прочесть?

Представление элементарных данных в памяти.
Операции над ними.
Структуры данных.
Алгоритмы.


 
Виталий ©   (2010-07-12 13:53) [48]


>
> Документированые структуры описаны в WinAPI, и его представителе
> MSDN

да, вот например по сути эта же структура: http://msdn.microsoft.com/en-us/library/ms648014%28VS.85%29.aspx

Неясны некоторые поля в ней. Вы не дадите ответ про них?

> Алгоритмы.

Мне необходимо прочесть все алгоритмы, существующие на свете, чтобы понять, как заполнить эти четыре поля?


 
Юрий Зотов ©   (2010-07-12 13:56) [49]


> Виталий ©   (12.07.10 13:46) [45]

Не нужны Вам ни WinAPI, ни железо. Вам нужно изучить, как правильно сказал Александр, представление данных в памяти, а еще операторы Read и Write. После этого, имея описание структуры ЛЮБОГО файла, Вы прочтете и запишете его без проблем.


 
Anatoly Podgoretsky ©   (2010-07-12 13:58) [50]

> Виталий  (12.07.2010 13:45:44)  [44]

А ты сумеешь задать именно конкретные вопросы, если так то зачем же тянешь,
задавай.


 
Sha ©   (2010-07-12 13:58) [51]

> Мне необходимо прочесть все алгоритмы?

Достаточно разобраться с циклами.


 
Anatoly Podgoretsky ©   (2010-07-12 13:59) [52]

> Виталий  (12.07.2010 13:53:48)  [48]

Да вроде бы ответы даны в описание, возможно придется просмотреть еще
несколько десятков статей, но такой уж он API


 
Anatoly Podgoretsky ©   (2010-07-12 14:01) [53]


> Неясны некоторые поля в ней. Вы не дадите ответ про них?

Это конкретный вопрос?


 
Виталий ©   (2010-07-12 14:02) [54]


> представление данных в памяти

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

> задавай

Начнем с первого. У dfFirstChar есть код - это простой код, соответствующий существующей таблицы ASCII, например, для латинской "A" - 65?

> Достаточно разобраться с циклами.

А что в них может быть мне неясного? Какие-то особенные моменты связаны с моей задачей? Или вы про что-то другое?


 
Anatoly Podgoretsky ©   (2010-07-12 14:03) [55]

> Юрий Зотов  (12.07.2010 13:56:49)  [49]

Так описание как раз в WinAPI, его надо научиться читать, находить там
нужную информацию. Потому что все остальное это переврат его же.


 
Виталий ©   (2010-07-12 14:03) [56]


> Это конкретный вопрос?

Чуть ниже (и выше, но это уже в прошлом) начал задавать. Простите, специфика форума - все же не чат.


 
Виталий ©   (2010-07-12 14:04) [57]


> Так описание как раз в WinAPI

поверьте - ну нет ничего больше про .FNT в описаниях от MS, чем эта структура и описание "не в мсдн", но тоже на сайте MS. Гуглил неустанно - ничего.


 
Anatoly Podgoretsky ©   (2010-07-12 14:05) [58]

> Виталий  (12.07.2010 14:02:54)  [54]

Ответ дан в MSDN - The first character code defined in the font.


 
Виталий ©   (2010-07-12 14:06) [59]

"Первый код символа в шрифте"
От чего он отсчитывается, этот код? Или я могу задать его произвольно (в пределах формата Byte, конечно же)?


 
Anatoly Podgoretsky ©   (2010-07-12 14:08) [60]

> Виталий  (12.07.2010 14:06:59)  [59]

Он не от чего не отсчитывается, это его личный код. См. таблица кодов ASCII


 
Виталий ©   (2010-07-12 14:10) [61]

То есть мое предположение по поводу, если брать конкретно, символа A в моем шрифте верно?


 
Anatoly Podgoretsky ©   (2010-07-12 14:14) [62]


> поверьте - ну нет ничего больше про .FNT в описаниях от
> MS, чем эта структура и описание "не в мсдн", но тоже на
> сайте MS. Гуглил неустанно - ничего.

Про шрифты огромное количество информации на сайте Микрософт, и по структуре файла совсем другая статья, а это отностистя к ресурсам

http://support.microsoft.com/kb/65123

Но этой статьей нельзя ограничиваться, придется еще много статей читать по данной теме. Одной не обойтись. Я бы все таки рекомендовал сначала Рихтера прочитать.


 
Sha ©   (2010-07-12 14:15) [63]

> Виталий ©   (12.07.10 14:02) [54]
>> представление данных в памяти
> Может, какие-то статьи на русском с разжевыванием для новичков есть?

Лицей на королевстве, хелп

>> задавай
> У dfFirstChar есть код - это простой код,
> соответствующий существующей таблицы ASCII,
> например, для латинской "A" - 65?

Да. Или сама буква A, в зависимости от объявления поля.

>> Достаточно разобраться с циклами.
> А что в них может быть мне неясного?

Например, что может быть цикл от буквы A до буквы Z.
Например, может оказаться полезной адресация к данным через указатель.
Например, что в цикле можно сдвигать биты.


Заметь, как много у тебя рождается мелких вопросов в ходе любого обсуждения.
Ответить на вопрос - это одно,
а заниматься пресонально твоим обучением - это совсем другое.


 
Sha ©   (2010-07-12 14:19) [64]

> То есть мое предположение по поводу, если брать конкретно, символа A в моем шрифте верно?

Давно взял бы в качестве примера любой файл с фонтом и разобрался


 
Виталий ©   (2010-07-12 14:20) [65]


> по структуре файла совсем другая статья, а это отностистя
> к ресурсам

Не понял - статья по ссылке относится не к файлу?
Также - не нашел у вас Рихтера на сайте. Не подскажете ссылку?

> Например, что может быть цикл от буквы A до буквы Z.

Знаю.

> Например, может оказаться полезной адресация к данным через
> указатель.

Она вроде бы и отдельно от цикла возможна, нет?

> Например, что в цикле можно сдвигать биты.

for i := 1 to 7 do
t := t or (1 shl i)
?

Хорошо, то есть те вопросы, которые я задал - совершенно мелкие? Но если я не знаю ответ, к кому мне еще обратиться?


 
Виталий ©   (2010-07-12 14:22) [66]


> Давно взял бы в качестве примера любой файл с фонтом и разобрался

шестнадцатеричным редактором?


 
Sha ©   (2010-07-12 14:23) [67]

> к кому мне еще обратиться?

[64]


 
Sha ©   (2010-07-12 14:24) [68]

> шестнадцатеричным редактором?

Да, хотя достаточно гляделки.


 
Виталий ©   (2010-07-12 14:26) [69]

Я приду домой и внимательно изучу формат на примере существующего файла. И если останутся вопросы - не откажите все же.


 
Anatoly Podgoretsky ©   (2010-07-12 14:33) [70]

> Sha  (12.07.2010 14:19:04)  [64]

Я тоже хотел предложить это (постеснялся).


 
Виталий ©   (2010-07-12 14:34) [71]

Е-мое... Кажется, понял, почему пробел -  dfBreakChar
Это если начинать создание шрифта не с какого-то "видимого символа", а с нулевого, то есть 32-0 = 32 как раз.


 
Anatoly Podgoretsky ©   (2010-07-12 14:35) [72]

> Виталий  (12.07.2010 14:20:05)  [65]

По моей или по твоей, по твоей к ресурсам, а по моей к файлам .FNT
Но ты про нее знаешь, сам ссылался.


 
Виталий ©   (2010-07-12 14:36) [73]


> постеснялся

Иногда так забавно наблюдать подобную "стеснительность". Что-то вроде того, как громко говорить о ком-то "он дебил", но так, как будто этого тот, кого так называют, не слышит. Ну что же, приму как данность.


 
Виталий ©   (2010-07-12 14:38) [74]


> по твоей к ресурсам


FONTDIRENTRY Structure

Contains information about an individual font in a font resource group


 
Anatoly Podgoretsky ©   (2010-07-12 14:40) [75]


>                  .....**.....
>                  ....*..*....
>                  ...*....*...
>                  ..*......*..
>                  ..*......*..
>                  ..*......*..
>                  ..********..
>                  ..*......*..
>                  ..*......*..
>                  ..*......*..
>                  ............
>                  ............
>                  ............

Byte1                          Byte2
b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0


 
Anatoly Podgoretsky ©   (2010-07-12 14:43) [76]


> Виталий ©   (12.07.10 14:36) [73]

Это ты зря


 
Виталий ©   (2010-07-12 14:43) [77]

Это к чему?


 
Виталий ©   (2010-07-12 14:45) [78]


> Это ты зря

Что - "зря"? Просто высказал такое же мнение "в сторону".
> Это к чему?

по поводу буквы


 
Anatoly Podgoretsky ©   (2010-07-12 14:46) [79]

> Виталий  (12.07.2010 14:43:17)  [77]

Это к тому, что в итоге я твою ветку практически покинул.


 
Sha ©   (2010-07-12 14:47) [80]

> Виталий ©   (12.07.10 14:26) [69]
> Я приду домой и внимательно изучу формат на примере существующего файла.
> И если останутся вопросы - не откажите все же.

Никто не откажет, если будет видно,
что вопрос у тебя появился не 5 секунд назад.


 
Виталий ©   (2010-07-12 14:48) [81]


> Это к тому, что в итоге я твою ветку практически покинул.

Я ответил тебе в лицо. Я спокойный человек, но открытые оскорбления тоже не люблю.


 
Виталий ©   (2010-07-12 14:49) [82]


>
> Никто не откажет, если будет видно,
> что вопрос у тебя появился не 5 секунд назад.

Спасибо.


 
boriskb ©   (2010-07-12 14:50) [83]

Всё таки форум, достаточно часто, это зло.

Мне почему-то кажется, что если б у автора топика не было возможности при малейшем затруднении спрашивать у инета, он бы сам давно разобрался. И при этом меньше времени потратил.


 
Sha ©   (2010-07-12 14:51) [84]

> Виталий ©   (12.07.10 14:36) [73]

Точно зря. Мне тоже расхотелось отвечать.

Анатолий имел в виду, что такое предложение может быть воспринято как нежелание отвечать


 
Виталий ©   (2010-07-12 14:54) [85]

Извините, пожалуйста, что я не так воспринял слова и кого-то оклеветал. Мне стало неприятно от того, что я посчитал для себя обидной фразой.

> Мне почему-то кажется, что если б у автора топика не было
> возможности при малейшем затруднении спрашивать у инета,
>  он бы сам давно разобрался. И при этом меньше времени потратил.

Для меня эти пункты не показались малейшим затруднением.


 
boriskb ©   (2010-07-12 15:06) [86]

> [85] Виталий ©

Я хочу стать сильным
И начинаю свой путь к вершинам с того, что окутываю себя проводами, ставлю, где надо рычаги, приклепляю моторчики и все это делаю так что не я поднимаю вес, а рычаги и моторчики. Несомненно, я смогу так поднять и тонну. Но стану ли я сильнее?

А если начать пораньше (с младенчества) и постоянно этим пользоваться, то так можно вовсе не научиться ходить и в конце концов вырасти полным дистрофиком.
Абсолютно так же и с мозгами.
Я не могу в полной мере применить эту аналогию к тебе - я тебя просто не знаю.
НО!
1) очень уж часто сюда заглядывают за проводами, рычагами и моторчиками
2) мне ты показался вполне способным разобраться самостоятельно. Просто "есть возможность - что не воспользоваться?"

Это можно - главное не увлекаться помощью, там где вполне можешь справиться сам.
Удачи   :))


 
Виталий ©   (2010-07-12 15:08) [87]

Я понял. Поэтому приду домой и проведу (возможно, не один день), пытаясь разобраться с помощью хекс-редактора и распечатки формата, что исходит откуда.


 
Anatoly Podgoretsky ©   (2010-07-12 15:38) [88]

> Виталий  (12.07.2010 14:54:25)  [85]

Ты думаешь мы зря тебя в MSDN посылаем, там все ответы на пвопросы по API
Кроме того надо еще пару бетселлеров прочитать, одного гуру я тебе назвал
это Рихтер.
А вопрос корнями уходит в железо, в знакогенераторы, в дальнейшем
программные, к которым относятся .FNT файлы и подсистема GDI, в глубину к
Win 1 и 2, частично 3
Времена до True Type


 
Виталий ©   (2010-07-12 15:45) [89]

Но я же не по API спрашиваю (а пока вообще не буду спрашивать, дабы действительно проверить все самостоятельно). Чтобы понять сущность этого вопроса, я никуда не денусь, не прочитав тысячестраничную книгу Рихтера (у него она вообще, вроде бы, не одна, какую конкретно нужно-то?)?


 
Anatoly Podgoretsky ©   (2010-07-12 15:56) [90]

> Виталий  (12.07.2010 15:45:29)  [89]

Вот эту http://www.podgoretsky.com/ftp/Docs/Classics/Richter/richter4ru.zip


 
Виталий ©   (2010-07-12 16:09) [91]

Не вполне понял, как "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows" может мне помочь, но буду читать с самого начала.


 
Anatoly Podgoretsky ©   (2010-07-12 16:22) [92]

> Виталий  (12.07.2010 16:09:31)  [91]

Это поможет тебе понять Виндоус.
Кроме того эта библия не единственная.


 
Юрий Зотов ©   (2010-07-12 16:27) [93]

> Виталий ©   (12.07.10 15:45) [89]

> Чтобы понять сущность этого вопроса, я никуда не денусь, не прочитав
> тысячестраничную книгу Рихтера

Если под сущностью вопроса имеется в виду запись/чтение файлов ЛЮБОГО формата, то для этого нужен не Рихтер, а Паскаль. В частности, как уже говорилось, нужно твердое знание представления данных в памяти и операторов Read/Write. И еще (не всегда, но довольно часто) - работа с указателями и динамической памятью.

И только потом, после усвоения принципов - описание форматов, API, Рихтер и пр.

Вот Вам учебная задачка, если хотите. Есть такая структура данных:

type
 PFriend = ^TFriend;
 TFriend = record
   FirstName: AnsiString;
   LastName: AnsiString;
   BirthDate: TDate;
   Phone: AnsiString;
   NextRecord: PFriend
 end;

Задание: построить записную книжку, хранящую такие структуры данных.

Подсказка: сначала освойте запись/чтение ОДНОЙ такой структуры, игнорируя поле NextRecord. Потом, уже с использованием этого поля  строится список таких структур, его запись в файл и чтение из файла.

Темы для изучения: указатели и динамическая память; тип Record; операторы New и Dispose (или GetMem/FreeMem); типы с управляемым временем жизни; финализация данных; типы AnsiString, TDate и их хранение в памяти; чтение и запись бинарных файлов; связные списки (очереди, стеки...).

По сложности и объему эта задачка тянет примерно на небольшой курсовой проект для 1-2 курса. То есть, она достаточно проста и негромоздка - но уверяю Вас, что после ее решения запись и чтение ЛЮБЫХ структур данных Вы будете щелкать, как орехи. Да и многое другое - тоже.


 
Anatoly Podgoretsky ©   (2010-07-12 17:01) [94]


> Юрий Зотов ©   (12.07.10 16:27) [93]

Какой хитрый, подсунул структуру с длинными строка, наверно что бы помучился.


 
Anatoly Podgoretsky ©   (2010-07-12 17:03) [95]

Я имею ввиду запись в типизированый файл.


 
Sha ©   (2010-07-12 17:30) [96]

> Какой хитрый...

Неа, не хитрый.
Хитрый попросил бы реализовать переменное количество телефонных номеров.


 
Виталий ©   (2010-07-12 17:35) [97]

Попробую решить. Литературу на русском языке не стоит искать, исключительно английский?


 
Юрий Зотов ©   (2010-07-12 17:42) [98]

> Anatoly Podgoretsky ©   (12.07.10 17:01) [94]

Естественно, подсунул специально, поэтому и AnsiString указал явно, чтобы никаких вариантов не оставить.

Во-первых, придется изучить и понять внутреннеее хранение длинных строк (после чего динамические массивы и работа с PChar осваиваются враз). Во-вторых, придется понять финализацию данных (что весьма полезно и в дальнейшем послужит мостиком к освоению интерфейсов). В-третьих (что главное), нужно будет придумать способ записи/чтения длинных строк (после чего запись/чтение любых буферов данных тоже осваивается враз).

> Sha ©   (12.07.10 17:30) [96]

Ну я же не полный изверг, все-таки...
:о)

Хотя запись/чтение СПИСКОВ AnsiString - тоже неплохая тренировка была бы...


 
Виталий ©   (2010-07-12 17:49) [99]


> типы с управляемым временем жизни

чувствую, с этим придется повозиться - поверхностное гугление практически ничего не дало.


 
Юрий Зотов ©   (2010-07-12 17:51) [100]

> Виталий ©   (12.07.10 17:35) [97]

Есть и переводные. Вот одни из лучших (если не самые лучшие):

http://www.google.ru/search?q=%D0%A2%D0%B5%D0%B9%D0%BA%D1%81%D0%B5%D0%B9%D1%80%D0%B0+%D0%9F%D0%B0%D1%87%D0%B5%D0%BA%D0%BE&rls=com.microsoft:ru:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7GZHZ&redir_esc=&ei=uBw7TKWbFZahOPKx7YkK

http://www.google.ru/search?q=%D0%9A%D0%B0%D0%BB%D0%B2%D0%B5%D1%80%D1%82+Delphi&rls=com.microsoft:ru:IE-SearchBox&ie=UTF-8&oe=UTF-8&sourceid=ie7&rlz=1I7GZHZ&redir_esc=&ei=Yh07TJjYHZyUOLyr7IkK

На версию Delphi не обращайте внимания, для этой задачки годится любая начиная с Delphi 2.


 
Виталий ©   (2010-07-12 17:53) [101]


> нужно будет придумать способ записи/чтения длинных строк

А по этому поводу нашел способ с записью в файл дополнительно длины строки, чтобы потом знать, сколько байт считывать. Хотя, возможно, нужно придумать какой-то свой особенный способ?


 
Юрий Зотов ©   (2010-07-12 17:57) [102]


> Виталий ©   (12.07.10 17:53) [101]

Батенька, кто из нас разработчик - Вы или я?
:o)

Задача поставлена - вперед, смелее! Думайте, дерзайте! Потом обсудим.


 
Виталий ©   (2010-07-12 17:58) [103]

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


 
Виталий ©   (2010-07-12 20:38) [104]

По условию задачи файл должен быть типизированым?


 
Виталий ©   (2010-07-12 20:46) [105]

Просто что-то мне подсказывает, что записать структуру с AnsiString полями в типизированый файл невозможно (разве что не заводить дополнительные поля с длинами строк)


 
Sha ©   (2010-07-12 20:49) [106]

> Виталий ©   (12.07.10 20:38) [104]
> По условию задачи файл должен быть типизированым?

В порядке возрастания сложности:
- типизированный,
- не типизированный,
- страничный с условием, что любая запись целиком лежит на странице,
- страничный без ограничений,


 
Leonid Troyanovsky ©   (2010-07-12 20:49) [107]


> Виталий ©   (12.07.10 20:46) [105]

> Просто что-то мне подсказывает

А что именно подсказывает?

--
Regards, LVT.


 
Виталий ©   (2010-07-12 20:50) [108]

С последними двумя даже еще не столкнулся, а вот по поводу сложности типизированого и не типизированого... Таки, выходит, способ есть...


 
Виталий ©   (2010-07-12 20:53) [109]


> А что именно подсказывает?

Книги и гугль: неизвестно, сколько байт занимает строка, которую я запишу (если конечно я не сохраню это значение где-то), а как я ее прочитаю, если не знаю, сколько памяти выделять?


 
Виталий ©   (2010-07-12 21:03) [110]

Страничный файл - это, кстати, отображаемый в память?


 
Leonid Troyanovsky ©   (2010-07-12 21:04) [111]


> Виталий ©   (12.07.10 20:53) [109]

> где-то), а как я ее прочитаю, если не знаю, сколько памяти
> выделять?

Вот, хорошо.
Осталось только, IMHO, вдумчиво читать msdn.

--
Regards, LVT.


 
Виталий ©   (2010-07-12 21:08) [112]


> Осталось только, IMHO, вдумчиво читать msdn.

Там сказано, что таки есть способ это сделать, то есть я неверно считаю?


 
Leonid Troyanovsky ©   (2010-07-12 21:18) [113]


> Виталий ©   (12.07.10 21:08) [112]

> Там сказано, что таки есть способ это сделать, то есть я
> неверно считаю?

В msdn?  Да, вроде, нет там ничего сверхестественного.
Допустим, Unicode vs ANSI - все ж там понятно.

--
Regards, LVT.


 
Виталий ©   (2010-07-12 21:22) [114]

Не понял вас, поясните, если не сложно, вашу мысль.


 
Sha ©   (2010-07-12 21:22) [115]

> Виталий ©   (12.07.10 21:03) [110]
> Страничный файл - это, кстати, отображаемый в память?

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


 
Виталий ©   (2010-07-12 21:24) [116]


> Никто не запрещает работать со страницами данных,
> как с записями типизированного файла.

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


 
Юрий Зотов ©   (2010-07-12 21:28) [117]

Люди, ну че вы парня путаете? Какой, в баню, МСДН? Какие страничные файлы? Разве это ТА задача?

Ему надо просто научиться писать в бинарный файл данные произвольной структуры - так, чтобы, зная структуру, их можно было прочитать.

И все. Без всяких премудростей.

Виталий, мне кажется, Вам стоит на несколько часов покинуть форум и решить задачу САМОМУ. Иначе - что толку-то?

Как получится - так и получится. Это, по сути, неважно, потому что ЛЮБОЕ Ваше решение, хоть хорошее, хоть плохое - это всего лишь тема для дальнейшего обсуждения. Главное - сделать САМОМУ.

Смелее.


 
Виталий ©   (2010-07-12 21:29) [118]

Хорошо, давайте я наконец напишу свой быдлокод для чтения и записи ОДНОЙ структуры и выложу на ваш суд. Можно?


 
Юрий Зотов ©   (2010-07-12 21:30) [119]

Блин. Он таки ударился в страничные файлы. И даже дальше - в MMF полез.

Саш, ну и на фига? Вот скажи - на фига? Разве ЭТО ему сейчас надо?


 
Юрий Зотов ©   (2010-07-12 21:31) [120]


> Виталий ©   (12.07.10 21:29) [118]

Да не можно, а НУЖНО. Еще час назад надо было это сделать.


 
Виталий ©   (2010-07-12 21:33) [121]

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


 
Юрий Зотов ©   (2010-07-12 21:35) [122]


> Виталий ©   (12.07.10 21:33) [121]

Читать книги БЕССИСТЕМНО - почти вредно. Во всяком случае, пользы от такого чтения - немного.


 
Sha ©   (2010-07-12 21:50) [123]

> Юрий Зотов ©   (12.07.10 21:30) [119]
> Блин. Он таки ударился в страничные файлы. И даже дальше - в MMF полез.
> Саш, ну и на фига? Вот скажи - на фига? Разве ЭТО ему сейчас надо?

Вообще-то, надо. Может, конечно не сразу. Никто не заставлял его туда лезть.

Первый вопрос, который возникнет после освоения типизированных файлов -
что делать, если я не знаю максимальных длину?

Ответ - нетипизированные файлы. Второй вопрос, который возникнет после
освоения нетипизированных файлов - как бы к ним приладить прямой доступ?

Тут появляется страничная организация, далее индексы и БД.


 
Юрий Зотов ©   (2010-07-12 21:55) [124]


> Sha ©   (12.07.10 21:50) [123]

Все правильно, но не сразу же? В школе ТФКП не изучают - не зря ведь.


 
Sha ©   (2010-07-12 21:58) [125]

> Юрий Зотов ©   (12.07.10 21:55) [124]
> Все правильно, но не сразу же?

От человека зависит.
Я лишь отвечаю на вопросы.
Не удивлюсь, если завтра Виталий кинется писать свой браузер.


 
Виталий ©   (2010-07-12 21:59) [126]

Не кинусь. Пока что написал код - не получается. В смысле пишет и читает, но, видимо, не так, как надо. Ищу ошибки.


 
Виталий ©   (2010-07-12 22:07) [127]

Надеюсь, у вас не пойдет кровь из глаз при виде этого ада
unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TfrmMain = class(TForm)
   saveButton: TButton;
   loadButton: TButton;
   procedure saveButtonClick(Sender: TObject);
   procedure loadButtonClick(Sender: TObject);
 private
 { Private declarations }
 type
   PFriend = ^TFriend;

   TFriend = record
     FirstName: AnsiString;
     LastName: AnsiString;
     BirthDate: TDate;
     Phone: AnsiString;
   end;

 public
   { Public declarations }
 end;

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.loadButtonClick(Sender: TObject);
var
 Stream: TFileStream;
 test: PFriend;
 len: Integer;
begin
 Stream := TFileStream.Create("g:\test.dat", fmOpenRead);
 New(test);
 Stream.ReadBuffer(test^, sizeof(test^));

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.FirstName, len);
 Stream.ReadBuffer(pChar(test^.FirstName)^,Len);

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.LastName, len);
 Stream.ReadBuffer(pChar(test^.LastName)^,Len);

 Stream.ReadBuffer(len, sizeof(len));
 SetLength(test^.Phone, len);
 Stream.ReadBuffer(pChar(test^.Phone)^,Len);

 ShowMessage(test^.FirstName+" "+test^.LastName+" "+DateToStr(test^.BirthDate)+" "+test.Phone);

 dispose(test);
 Stream.Free;
end;

procedure TfrmMain.saveButtonClick(Sender: TObject);
var
 test: PFriend;
 Stream: TFileStream;
 s, s1, s2: AnsiString;
 len: Integer;
begin
 Stream := TFileStream.Create("g:\test.dat", fmOpenReadWrite);
 New(test);
 { эта инициализация будет заранее и сделана пользователем }
 test^.FirstName := "Иван";
 test^.LastName := "Петров";
 test^.BirthDate := Now;
 test^.Phone := "222-22-22";

 { так нужно сделать для корректной записи строк - то, что я нашел }
 s := test^.FirstName;
 test^.FirstName := "";
 s1 := test^.LastName;
 test^.LastName := "";
 s2 := test^.Phone;
 test^.Phone := "";

 Stream.WriteBuffer(test^, sizeof(test^));
 len := Length(s);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s)^, len);
 len := Length(s1);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s1)^, len);
 len := Length(s2);
 Stream.WriteBuffer(len, sizeof(len));
 Stream.WriteBuffer(pChar(s2)^, len);
 Stream.Free;

 dispose(test);
end;

end.


 
Юрий Зотов ©   (2010-07-12 22:07) [128]


> Sha ©   (12.07.10 21:58) [125]

Ну, мы же, как старшие и более опытные товарищи, его остановим? Предостережем от такой глупости, верно?
:о)

Парень-то ведь толковый, почитай его посты. Каша у него пока что в голове - ну так это потому что САМ учится, системы нет. Созреет потихоньку, сам знаешь, как оно происходит.

> Виталий

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


 
Виталий ©   (2010-07-12 22:08) [129]

Юрий, спасибо за добрые слова. А теперь материте нещадно и говорите, как переписать это, чему место только на govnokod.ru.


 
Sha ©   (2010-07-12 22:19) [130]

> Юрий Зотов ©   (12.07.10 22:07) [128]
> Предостережем

Пробовал, не помогает


 
Виталий ©   (2010-07-12 22:22) [131]


> Пробовал, не помогает

я буду стараться следовать рекомендациям, которых, чувствую, немало получу.


 
Sha ©   (2010-07-12 22:24) [132]

> Виталий ©   (12.07.10 22:08) [129]
> теперь материте

Многовато чтений придется сделать, чтобы добраться до 100-й записи.
А если надо 100000-ую?


 
Anatoly Podgoretsky ©   (2010-07-12 22:24) [133]

> Sha  (12.07.2010 17:30:36)  [96]

Это не хитрый, это садист.


 
Виталий ©   (2010-07-12 22:27) [134]


> Многовато чтений придется сделать, чтобы добраться до 100-
> й записи.
> А если надо 100000-ую?

Тоже об этом думал. Вероятно, в начале файла нужно что-то вроде индексной таблицы смещений записей, чтобы процедурами типа Seek быстро перейти на нужное место?


 
Anatoly Podgoretsky ©   (2010-07-12 22:27) [135]

> Юрий Зотов  (12.07.2010 17:42:38)  [98]

Дак это дидактика.
Задачка конечно хорошая для тренировки.


 
Sha ©   (2010-07-12 22:30) [136]

> Виталий ©   (12.07.10 22:07) [127]
> так нужно сделать для корректной записи строк - то, что я нашел

Зачем эти танцы с бубном?


> Anatoly Podgoretsky ©   (12.07.10 22:24) [133]
> Это не хитрый, это садист.

))


 
Anatoly Podgoretsky ©   (2010-07-12 22:31) [137]

> Виталий  (12.07.2010 17:53:41)  [101]

Тебе решать, мы посмотреть


 
Anatoly Podgoretsky ©   (2010-07-12 22:32) [138]

> Виталий  (12.07.2010 20:38:44)  [104]

Это говорит о полном непонимание, как минимум типизированых файлов, и не
чтение нашей с ЮЗ перепиской, должен был бы насторожиться.


 
Виталий ©   (2010-07-12 22:32) [139]


> Зачем эти танцы с бубном?

Укажите на танцы другого рода.
"Обратите внимание на то, что перед записью в поток я делаю так, что бы в поле f3 попал указатель Nil. Если этого не сделать, то в поток попадет адрес текущего экземпляра динамической строки. При чтении, он будет прочитан в поле f3. Т.е. поле f3 станет указывать на какое-то место в памяти. При выполнении SetLength, поскольку Delphi сочтет что текущее значение f3 лежит по указанному адресу, будет попытка интерпретировать лежащую там информацию как динамическую строку. Если же в поток записать Nil, то SetLength, никуда лезть не будет – экземпляра-то нет."
(http://sources.ru/magazine/0804/delphistr.html)


 
Sha ©   (2010-07-12 22:33) [140]

> Виталий ©   (12.07.10 22:27) [134]
> в начале файла нужно что-то вроде индексной таблицы

С размером этого начала как быть?
Если записи добавлять-удалять придется.


 
Anatoly Podgoretsky ©   (2010-07-12 22:34) [141]

> Виталий  (12.07.2010 21:08:52)  [112]

MSDN настолько велик, что никто точно не знает, что там есть.


 
Виталий ©   (2010-07-12 22:34) [142]


> Это говорит о полном непонимание, как минимум типизированых
> файлов

Да что уж там - об абсолютном, совершенном непонимании, что такое файл вообще... Обязательно так критиковать каждый вопрос?


 
Виталий ©   (2010-07-12 22:35) [143]


> С размером этого начала как быть?
> Если записи добавлять-удалять придется.

Вы правы. Тогда на данный момент ответа не знаю.


 
Sha ©   (2010-07-12 22:35) [144]

> Виталий ©   (12.07.10 22:32) [139]

а теперь своими словами


 
Anatoly Podgoretsky ©   (2010-07-12 22:36) [145]

> Виталий  (12.07.2010 21:29:58)  [118]

> Можно?

Нужно.
Нужна точка опоры для разговора.


 
Anatoly Podgoretsky ©   (2010-07-12 22:38) [146]

> Юрий Зотов  (12.07.2010 21:30:59)  [119]

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

Лиса, ты меня не путай
(с) кот Базилио


 
Sha ©   (2010-07-12 22:38) [147]

> Anatoly Podgoretsky ©   (12.07.10 22:32) [138]
> Это говорит о полном непонимание, как минимум типизированых файлов

Он их типа прошел уже, слишком просто, наверно.


 
Anatoly Podgoretsky ©   (2010-07-12 22:39) [148]

> Юрий Зотов  (12.07.2010 21:55:04)  [124]

ЮЗ ты плавать умеешь?
А как тебя учили?


 
Виталий ©   (2010-07-12 22:40) [149]


> а теперь своими словами

да там вроде тоже не сухой академический текст... Я понял как:
возникает проблема с тем, что неизвестен размер строки, и запишем в файл мы черти что (адрес в памяти), ведь AnsiString - указатель, только скрытый реализацией (так же?). Поэтому мы присвоим полю записи пустую строчку, то есть по сути присвоим указателю значение Nil, а действительные строки и их длины запишем после структуры. И когда будет вызываться SetLength (выделение памяти под строку), то оно не будет выделять память для данных по несуществующему адресу: nil увидит и закончит работу.


 
Виталий ©   (2010-07-12 22:42) [150]


> Он их типа прошел уже, слишком просто, наверно.

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


 
Виталий ©   (2010-07-12 22:43) [151]

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


 
Sha ©   (2010-07-12 22:48) [152]

> Виталий ©   (12.07.10 22:40) [149]

Когда именно возникнет проблема?


 
Anatoly Podgoretsky ©   (2010-07-12 22:49) [153]

> Виталий  (12.07.2010 22:07:07)  [127]

Материть не буду, но несколько замечаний.

1. Код опасный, надо писать с защищеными блоками try finally
обучись как можно раньше.

2. Не понятно зачем test типа PFriend, удобнее TFriend - это не ошибка

3. Код желательно переделать так, чтобы убрать поля len, повышает
безопасность, упрощает работу, можно использовать файлы Паскаля и если еще
немного переделать, то и строковые списки. TFileStream очень низкий уровень,
но им конечно тоже надо владеть. Но здесь лучше изменить формат записи и
файловые операции.

Ну и если не обращать внимания на выше приведеные заявления, то неплохо, я
ожидал хуже.


 
Anatoly Podgoretsky ©   (2010-07-12 22:53) [154]

> Виталий  (12.07.2010 22:27:14)  [134]

Ну вот тебя и стали отвлекать на несвоевременные задачи. Дидактически
правильно. Надо же научить не отвлекаться на неважное на данном этапе. Пока
ты слишком поддаешься постороннему влиянию. А ты учти, что мы будем тебя
путать и смотреть, путать и смотреть. Это очень важно точно поставить цель,
пути решения и не перепрыгивать через ходы.


 
Виталий ©   (2010-07-12 22:53) [155]

Спасибо, Анатолий. Просто теперь Sha говорит о необходимости быстрого доступа к записям, и я понимаю, что это, возможно, реализация своей примитивной базы данных внутри файла, но, увы, не знаю как это сделать правильнее. Однако, думаю, ее будет возможно сделать только с помощью низкого уровня доступа к файлам.

> Когда именно возникнет проблема?

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


 
Anatoly Podgoretsky ©   (2010-07-12 22:53) [156]

> Sha  (12.07.2010 22:30:16)  [136]

Я не осуждаю :-)
Я сам такой.


 
Anatoly Podgoretsky ©   (2010-07-12 22:55) [157]

> Виталий  (12.07.2010 22:32:19)  [139]

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


 
Виталий ©   (2010-07-12 22:57) [158]


>  например любое поле может быть пустым и это надо
> учитывать.

с этим вроде бы проблем не возникает. Но, думаю, тут уже скорее проверка ввода пользователя.


 
Anatoly Podgoretsky ©   (2010-07-12 22:57) [159]

> Виталий  (12.07.2010 22:34:22)  [142]

> Обязательно так критиковать каждый вопрос?

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


 
Виталий ©   (2010-07-12 22:59) [160]

Нет, я адекватно воспринимаю критику, просто немного растерялся. Теперь я собран и больше этого не повторится.


 
Anatoly Podgoretsky ©   (2010-07-12 23:01) [161]

> Sha  (12.07.2010 22:38:27)  [147]

Не так просто, тем более что Юрий побеспокоился, а ты еще и масла подлил.
Но на мой взгляд он выбрал неверное решение,ему следовало бы сначала решить
это с помощью файлов Паскаля (текстовых), а потом как домашнее задание с
помощью файловых потоков, а на закуску MMF

Ведь выбор оптимального решения входит в мастерство. В умение решать задачи
разными путями. Во взрастание специалиста.


 
Anatoly Podgoretsky ©   (2010-07-12 23:02) [162]

> Виталий  (12.07.2010 22:42:30)  [150]

Правильно, так и есть, только цели ты неверно определил.
В конце концов ты же сам напросился, ты в любой момент можешь отказаться.


 
Виталий ©   (2010-07-12 23:03) [163]


> MMF

Я хотел бы, если на данный момент это не скачок, чтобы вы подсказали более подробную работу с ними, чем то, что описано в книгах. Или только MSDN?


 
Виталий ©   (2010-07-12 23:04) [164]


> ты в любой момент можешь отказаться

я, может, и глупый, но упорный. Не откажусь.


 
Anatoly Podgoretsky ©   (2010-07-12 23:05) [165]

> Виталий  (12.07.2010 22:43:31)  [151]

Хочешь совет, прежде чем читать наши ответы, подготовься, приготовь закуску,
поставь графинчик водки, уютно расположишь в кресле и начинай читать. Как
только не понравилось, хлопни стопочку, глядишь к концу чтения, будешь
полностью согласен с нами и песни петь начнешь.


 
Sha ©   (2010-07-12 23:06) [166]

1. Проблема возникает из-за того, что ты сам решил писать в файл мусор. Нафига туда писать указатели, причем пустые?

2. Проблема возникнет при чтении, т.к. ты этот мусор еще зачем-то читаешь.
Если в момент установки длины строки ее указатель в записи будет содержать
непустое значение, то будет сделана попытка перераспределения памяти
и получено AV. Проблему лучше решать по месту возникновения, например
pointer(test.FirstName):=nil; перед установкой длины.

3. Ну и вообще в это поле удобно было бы писать длину строки.


 
Anatoly Podgoretsky ©   (2010-07-12 23:06) [167]

> Виталий  (12.07.2010 22:53:35)  [155]

Правильно говорит и ты это должен иметь в виду, но выбери приоритеты, разбей
задачу по этапам. Ведь ты же учишься и хочешь этого?


 
Anatoly Podgoretsky ©   (2010-07-12 23:07) [168]

> Виталий  (12.07.2010 22:57:38)  [158]

Не надо проверять ввод пользователя, пустое значение - нормальное значение,
надо писать так, что бы не возникало проблем (ошибок) из-за этого.


 
Sha ©   (2010-07-12 23:10) [169]

> Anatoly Podgoretsky ©   (12.07.10 23:01) [161]
> на закуску MMF

Страничная организация данных не предполагает обязательное использование MMF.
Например, MS SQL Server работает через порты завершения.


 
Юрий Зотов ©   (2010-07-12 23:10) [170]

> Виталий

1. Почему тип структуры объявлен внутри класса, да еще в секции private?

Впрочем, это к теме не относится.

Код, кстати, очень даже неплохой. Не без погрешностей, но вполне разумный. И идея в целом правильная - если данные имеют произвольную длину, то сначала пишем эту длину (блоком заведомо известного размера), а потом сами данные. Читаем соответственно.

2. Писать пустую структуру в файл - незачем (поэтому переменные s, s1, s2 - лишние, можно писать прямо из test^). Читать пустую структуру тоже незачем. То ли в статье что-то не так написано, то ли Вы что-то не так поняли.

3. Нет записи и чтения BirthDate. Дата (и любые другие данные фиксированной длины) пишется и читается так же, как и строки - только длина известна заранее: SizeOf(TDate), поэтому писать сначала длину незачем, можно писать сразу сами данные.

4. Не хватает двух блоков try-finally. Общая схема всегда такая:
захват_ресурса;
try
 работа_с_ресурсом;
finally
 освобождение_ресурса;
end;

В данном случае мы дважды захватываем память - при создании стрима и структуры. Значит, должно быть так:

Stream := TFileStream.Create(...);
try
 New(test);
 try
   ...
 finally
   Dispose(test);
 end;
finally  
 Stream.Free;
end;

==================

Ну и на закуску: вот работающий код. Сравните со своим - никаких принципиальных различий. Поэтому - кто сказал, что Ваш код плохой? Нормальный код, и не надо комплексовать, нет для этого причины.

procedure TForm1.btnSaveClick(Sender: TObject);
var
 test: PFriend;
 Stream: TFileStream;
 len: integer;
begin
 Stream := TFileStream.Create("D:\temp\test.dat", fmCreate);
 try
   New(test);
   try
     test^.FirstName := "Иван";
     test^.LastName := "Петров";
     test^.BirthDate := Now;
     test^.Phone := "222-22-22";
     len := Length(Test^.FirstName);
     Stream.WriteBuffer(len, sizeof(len));
     Stream.WriteBuffer(pChar(Test^.FirstName)^, len);
     len := Length(test^.LastName);
     Stream.WriteBuffer(len, sizeof(len));
     Stream.WriteBuffer(pChar(test^.LastName)^, len);
     Stream.WriteBuffer(Test^.BirthDate, SizeOf(TDate));
     len := Length(Test^.Phone);
     Stream.WriteBuffer(len, sizeof(len));
     Stream.WriteBuffer(pChar(Test^.Phone)^, len);
   finally
     Dispose(test);
   end;
 finally
   Stream.Free;
 end
end;

procedure TForm1.btnLoadClick(Sender: TObject);
var
 Stream: TFileStream;
 test: PFriend;
 len: Integer;
begin
 Stream := TFileStream.Create("D:\temp\test.dat", fmOpenRead);
 try
   New(test);
   try
     Stream.ReadBuffer(len, sizeof(len));
     SetLength(test^.FirstName, len);
     Stream.ReadBuffer(pChar(test^.FirstName)^,Len);
     Stream.ReadBuffer(len, sizeof(len));
     SetLength(test^.LastName, len);
     Stream.ReadBuffer(pChar(test^.LastName)^,Len);
     Stream.ReadBuffer(test^.BirthDate, SizeOf(TDate));
     Stream.ReadBuffer(len, sizeof(len));
     SetLength(test^.Phone, len);
     Stream.ReadBuffer(pChar(test^.Phone)^,Len);
     ShowMessage(test^.FirstName+" "+test^.LastName+" "+DateToStr(test^.BirthDate)+" "+test.Phone);
   finally
     dispose(test);
   end;
 finally
   Stream.Free;
 end
end;


 
Виталий ©   (2010-07-12 23:14) [171]


> Как
> только не понравилось, хлопни стопочку, глядишь к концу
> чтения, будешь
> полностью согласен с нами и песни петь начнешь.

Спасибо, не пью.

> Нафига туда писать указатели, причем пустые?

В этом случае, насколько я понимаю, я должен отказаться от удобства писать структуру целиком (скажем, у меня только 3 поля текстовые и 20 - других типов) и писать поле за полем?

А вот это, простите, не понял:
> Проблему лучше решать по месту возникновения, например
> pointer(test.FirstName):=nil; перед установкой длины.

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


 
Sha ©   (2010-07-12 23:17) [172]

> Юрий Зотов ©   (12.07.10 23:10) [170]
> 3. Нет записи и чтения BirthDate.

Для этого он и пишет структуру целиком


 
Юрий Зотов ©   (2010-07-12 23:18) [173]

Да, я это уже позже понял. Кстати, тоже очень неплохая идея.


 
Виталий ©   (2010-07-12 23:18) [174]


> Писать пустую структуру в файл

Именно хотел попробовать работу записи структуры сразу, а не по ее полям один за другим.

> Нет записи и чтения BirthDate

когда записывается вся структура, то это поле запишется вместе с ней (и потом считается), у меня по крайней мере вывелось значение
Ваш код прочел, понял, да, насчет try...finally не подумал, но это в принципе более-менее известная мне техника.


 
Виталий ©   (2010-07-12 23:20) [175]


> Страничная организация данных не предполагает обязательное
> использование MMF.
> Например, MS SQL Server работает через порты завершения.
>

Уже знаю, вы меня сбиваете :) Я не знаю, что такое порты завершения, но если будет литература и необходимость - попробую осилить.


 
Sha ©   (2010-07-12 23:23) [176]

> В этом случае, насколько я понимаю, я должен отказаться от удобства писать структуру целиком

Нет. Просто пиши длину строки вместо указателя.


> Но можно сделать и так, а при сохранении не обнулять - что изменится-то?

Очень многое.
Это все равно, что в одной процедуре присвоить значение глобальной переменной,
а в другой его использовать. Если возможно, таких вещей надо избегать.


 
Sha ©   (2010-07-12 23:24) [177]

> Я не знаю, что такое порты завершения, но если будет литература и необходимость - попробую осилить.

Не надо тебе это. Seek вполне достаточно.


 
Виталий ©   (2010-07-12 23:26) [178]


> Нет. Просто пиши длину строки вместо указателя.

Как вместо указателя на строку в структуру записать длину строки?

> Seek вполне достаточно.

а вот с проблемой добавить/удалить записи и их размером все сложнее..


 
Anatoly Podgoretsky ©   (2010-07-12 23:27) [179]

> Sha  (12.07.2010 23:10:49)  [169]

Вот в список неоложных дел пусть включит и порты завершения.


 
Anatoly Podgoretsky ©   (2010-07-12 23:31) [180]

> Виталий  (12.07.2010 23:14:51)  [171]

С нами придется, если хочешь нервы сохранить


 
Anatoly Podgoretsky ©   (2010-07-12 23:31) [181]

> Юрий Зотов  (12.07.2010 23:10:50)  [170]

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


 
Виталий ©   (2010-07-12 23:36) [182]


> С нами придется, если хочешь нервы сохранить

:)
А если серьезно - дайте совет, куда копать в сторону организации быстрого доступа к данным? Я думаю, это второй шаг.


 
Sha ©   (2010-07-12 23:37) [183]

> Как вместо указателя на строку в структуру записать длину строки?

Move(person, person2, size);
integer(person.FirstName):=Length(person.FirstName);
....
Move(person2, person, size);
FillChar(person2, size, 0);


> Вот в список неоложных дел пусть включит и порты завершения.

))


 
Юрий Зотов ©   (2010-07-12 23:37) [184]

> Виталий ©   (12.07.10 23:26) [178]
> Как вместо указателя на строку в структуру записать длину строки?

Либо приведением типа, либо вариантным объявлением записи:

type
 PFriend = ^TFriend;
 TFriend = record
   case boolean of
     True: (
       FirstName: AnsiString;
       LastName: AnsiString;
       BirthDate: TDate;
       Phone: AnsiString);
     False: (
       FirstLen: integer;
       LastLen: integer;
       Dummy: TDate;
       PhoneLen: integer);
 end;


 
Sha ©   (2010-07-12 23:41) [185]

> А если серьезно - дайте совет, куда копать в сторону организации быстрого доступа к данным?

А не надо было проскакивать типизированные файлы.
Мож чего бы на ум и пришло.


 
Виталий ©   (2010-07-12 23:45) [186]


> Move(person, person2, size);
> integer(person.FirstName):=Length(person.FirstName);
> ....
> Move(person2, person, size);
> FillChar(person2, size, 0);

При сохранении, как я понимаю, копируем данные во временную запись и с приведением типов записываем длину.
При загрузке - копируем назад и заполняем временную запись нулями - а это-то зачем? И таки таскаем за собой глобальную переменную!


 
Виталий ©   (2010-07-12 23:46) [187]


> А не надо было проскакивать типизированные файлы.
> Мож чего бы на ум и пришло.

А в типизированый файл я AnsiString не запишу нормально!


 
Юрий Зотов ©   (2010-07-12 23:47) [188]

> Виталий ©   (12.07.10 23:36) [182]

> куда копать в сторону организации быстрого доступа к данным?
> Я думаю, это второй шаг.

Правильно думаете. А копать в сторону Seek, конечно. Но тогда перед каждым блоком нужно писать его размер. Под блоком здесь подразумевается сама структура + 3 ее строки. То есть, если длины строк писать в самой структуре, то размер блока будет равен
SizeOf(TFriend) + Length(FirstName) + Length(LatsName) + Length(Phone)

Тогда, чтобы быстро выйти на N-й блок, в цикле делаем так:
читаем длину блока
перемещаемся на эту длину


 
Виталий ©   (2010-07-12 23:47) [189]

Там-то я, зная точный размер структуры, легко перейду к нужной с помощью Seek.


 
Sha ©   (2010-07-12 23:47) [190]

Ниасилил, значит.


 
Виталий ©   (2010-07-12 23:50) [191]


> Ниасилил, значит.

что "ниасилил"-то? Какой важный момент я упускаю?


 
Юрий Зотов ©   (2010-07-12 23:51) [192]

Во всяком случае, уже можно делать резюме: тема записи и чтения произвольных структур данных таки раскрыта.

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


 
Виталий ©   (2010-07-12 23:55) [193]


> откуда взялись первоначальные проблемы

До них еще дойду. Они-то не столько с этим связаны, сколько с правильным пониманием.


 
Юрий Зотов ©   (2010-07-12 23:55) [194]

> Виталий

Как насчет двух файлов? Первый - типизированный, второй - нет.
Второй хранит сами блоки данных, первый - их смещения во втором.

Тогда на любой блок данных выходим за два Seek.


 
Виталий ©   (2010-07-12 23:58) [195]


> Как насчет двух файлов? Первый - типизированный, второй
> - нет.

Мне кажется, "настоящие" базы данных не "расходуют" файлы в таком количестве. Хотя - кто их знает, как они реализованы.


 
Sha ©   (2010-07-13 00:01) [196]

> что "ниасилил"-то?

В целом полет нормальный.

> Какой важный момент я упускаю?

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

> А в типизированый файл я AnsiString не запишу нормально!

Нет ли тут противоречия?


 
Виталий ©   (2010-07-13 00:04) [197]


> Нет ли тут противоречия?

Вы предлагаете ограниченную длину строки некоторым все же весьма небольшим значением. А если я хочу записать значение в пару мегабайт (заметку, например)? Причем одна заметка будет на 100 кб, а другая - на 2 мб?


 
Sha ©   (2010-07-13 00:05) [198]

> Вы предлагаете ограниченную длину строки

Где?


 
Виталий ©   (2010-07-13 00:06) [199]


> Например, на диске данных хранятся в секторах одного типа
> размером 512 байт.
> И это не мешает тебе туда писать достаточно длинные строки.
>

Или я чего-то не понимаю.


 
Sha ©   (2010-07-13 00:06) [200]

Или


 
Anatoly Podgoretsky ©   (2010-07-13 00:07) [201]

> Виталий  (12.07.2010 23:46:07)  [187]

А на AnsiString свет клином не сошелся, например есть управляемый по длине
ShortString, есть массивы символов
Возьми на моем сайте статью "Работа с файлами Паскаля", не обращай внимание
на ошибки со свойствами и попыткой использования их как var параметрам,
полезно для начинающего, там и про типизированые и про текстовые файлы
Паскаля есть


 
Anatoly Podgoretsky ©   (2010-07-13 00:08) [202]

> Виталий  (12.07.2010 23:46:07)  [187]

Типизированые файлы обеспечивают очень быструю работу.
Правда тогда задание останется не выполненым по сути, как учебная, но задача
будет решена.


 
Виталий ©   (2010-07-13 00:09) [203]


> Или

Тогда объясните.


 
Юрий Зотов ©   (2010-07-13 00:09) [204]

> Виталий ©   (13.07.10 00:06) [199]

Сектора фиксированного размера, но в каждом сектора есть служебное поле, указывающее на следующий сектор (если он есть), либо содержащее NULL (если сектор - последний).


 
Sha ©   (2010-07-13 00:10) [205]

> Виталий ©   (13.07.10 00:09) [203]
> Тогда объясните.

Можно, конечно. А разве самому неинтересно?


 
Виталий ©   (2010-07-13 00:11) [206]

Ну вот пусть оно фиксированого размера с указанием на след. сектор или отсутствием такового. Как, используя это, сделать запись типизированого файла с AnsiString, чтобы позже ее можно было считать?


 
Виталий ©   (2010-07-13 00:12) [207]


> Можно, конечно. А разве самому неинтересно?

Интересно. Куда копать - может, не ту литературу читаю!


 
Sha ©   (2010-07-13 00:18) [208]

> сделать запись типизированого файла с AnsiString,
> чтобы позже ее можно было считать?

Вот базы данных, например, умеют работать с длинными строками.
Более того, умеют в одном файле хранить несколько таблиц.
Значит у них тип файла от типа записей в таблицах ваще не зависит.
Просто мысль.


 
Виталий ©   (2010-07-13 00:20) [209]

Они крутые, разработчики СУБД. Но как они это делают - не могу представить.


 
Anatoly Podgoretsky ©   (2010-07-13 00:22) [210]

> Виталий  (13.07.2010 00:11:26)  [206]

Типизированых файлов с AnsiString в природе не бывает.


 
Anatoly Podgoretsky ©   (2010-07-13 00:27) [211]

> Sha  (13.07.2010 00:18:28)  [208]

При этом у них полный аналог длинных строк.


 
Anatoly Podgoretsky ©   (2010-07-13 00:27) [212]

> Виталий  (13.07.2010 00:20:29)  [209]

Про все не буду говорить, а для MS SQL это не секрет, документировано.


 
Sha ©   (2010-07-13 00:28) [213]

> Anatoly Podgoretsky ©   (13.07.10 00:22) [210]
> Типизированых файлов с AnsiString в природе не бывает.

Масса тела не зависит от скорости.
Параллельные не пересекаются.


 
Виталий ©   (2010-07-13 00:29) [214]

Единственное - могу представить, что данные в файле БД хранятся как, вначале, набор полей, а затем - набор записей, соответствующих этим полям. И неким байтом (группой байт) обрывается одна таблица и начинается другая. А вот махинации с секторами и прочим - не представляю.


 
0x00FF00   (2010-07-13 00:34) [215]

Ого!

С какого уж года не видел, как Мастера вдруг (даже почти без стёба!) вместе взялись помогать новичку!
Где-то сдохли штабеля волков! =)

Так держать =)


 
Виталий ©   (2010-07-13 00:42) [216]


> для MS SQL это не секрет, документировано.

Нашел книгу Inside SQL Server, вроде бы в ней описан формат файла... Но сейчас уже слишком хочу спать, посему прошу Мастеров перенести обсуждение до утра :) Спасибо всем огромное!


 
Виталий ©   (2010-07-13 00:46) [217]

Кому, кстати, интересно, если найти сложно ее: http://www.hot.ee/gloryee/


 
Германн ©   (2010-07-13 00:58) [218]


>
> С какого уж года не видел, как Мастера вдруг (даже почти
> без стёба!) вместе взялись помогать новичку!

Редко попадаются такие новички, которые не крутят пальцы, пытаются разобраться сами, не требуют готового кода и готовые читать книги (только не знают какие). Вот Мастера и соскучились по такой возможности.


 
Юрий Зотов ©   (2010-07-13 01:16) [219]

Да и не такой уж он новичок. Код посмотрите - не без погрешностей, но в целом грамотный, работа с динамической памятью и с длинными строками раскручена четко. А главное вот что: на одном языке разговариваем и чувствуется, что терминологией человек вполне владеет, от слов "указатель", "ссылка", "адрес", "смещение"  в обморок вовсе не падает.

Какой же это новичок? Скорее, это на развод похоже, кто-то из профи поразвлекаться решил - вот и косит под новичка...
:o)


 
Виталий ©   (2010-07-13 01:26) [220]


> Какой же это новичок? Скорее, это на развод похоже, кто-
> то из профи поразвлекаться решил - вот и косит под новичка.

Сами прикалываетесь :) - тонко)


 
Германн ©   (2010-07-13 03:10) [221]


> Скорее, это на развод похоже, кто-то из профи поразвлекаться
> решил

Не. У наших профи не хватит энергии на столько постов. Да что б при этом ни разу не проколоться.

Во. Уже даже ЮЗ сомневается.

"Редко попадаются такие новички, которые не крутят пальцы, пытаются разобраться сами, не требуют готового кода и готовые читать книги (только не знают какие)."

Редко, но они есть!


 
Sha ©   (2010-07-13 09:20) [222]

> Нашел книгу Inside SQL Server

Давай сначала рассмотрим чуть более чем полностью документированные вещи.
MS DOS имеет типизированные файлы оглавления.
Известно, что некто умудрился, не меняя структуры, дополнительно хранить там длинные имена файлов.
Как некте это удалось? Ну, интересно же ))


 
Anatoly Podgoretsky ©   (2010-07-13 10:14) [223]

> Sha  (13.07.2010 09:20:42)  [222]

Оригинальное было решение, потеряли только расширения, да они и не нужны
были.


 
Виталий ©   (2010-07-13 11:25) [224]

Здравствуйте вновь, не было света :)
Сейчас попробую поискать.


 
Виталий ©   (2010-07-13 11:53) [225]

Нашел вот это: http://www.codenet.ru/progr/other/doslfn.php, но там весьма сложные ассемблерные вставки (для меня), да и общий принцип неясен. Попробую разобрать, а пока, может, кто подскажет объяснение, если оно, как говорите, документировано?


 
Sha ©   (2010-07-13 11:59) [226]

Обед. Пойду поговорю сам с собой


 
Виталий ©   (2010-07-13 14:01) [227]

Пожалуйста, помогите в этом.


 
Sha ©   (2010-07-13 14:07) [228]

Вставки там можно опустить - они для чтения нужного сектора файла оглавления.
См. функцию GetUniLFN


 
Виталий ©   (2010-07-13 15:17) [229]

Пока непонятно. Буду думать.


 
Sha ©   (2010-07-13 15:27) [230]

тут понятно http://www.ipm.kstu.ru/os/lec/13.php
тут познавательно ttp://www.ipm.kstu.ru/os/lec/12.php


 
Виталий ©   (2010-07-13 16:02) [231]

Спасибо. Это уже довольно сложный уровень. Мда :)


 
Sha ©   (2010-07-13 16:18) [232]

Здесь интересен принцип реализации цепочки контнейнеров одного типа
для хранения разнородной информации.
После ознакомления с ним можно перечитать ветку и подумать,
страницы какого типа подошли бы для хранения твоих записей.
На это 5-ти секунд точно не хватит.


 
Виталий ©   (2010-07-20 20:10) [233]

Здравствуйте вновь - пропадал некоторое время. Можете хотя бы намекнуть на смысл операций сдвига в процедуре?
То есть я прочел описание каталоговой записи, но манипуляции с извлечением из нее данных мне неясны. Как разобраться с этими сдвигами?


 
Sha ©   (2010-07-20 21:56) [234]

> Виталий ©   (20.07.10 20:10) [233]
> Как разобраться с этими сдвигами?

В данном случае операции сдвига - замечательный пример того,
что не надо экономить на "лишних" объвлениях типов и переменных.
В результате вместо сцепления строк у автора получился
трудно понимаемый код.

Первая ссылка из [230] поможет понять, что он имел в виду,
и переписать код в удобочитаемом виде :)


 
Sha ©   (2010-07-20 22:01) [235]

Где-то там выше не зря говорилось о необходимости знать представление
данных в памяти. Без этого нельзя считать себя программистом.


 
Виталий ©   (2010-07-21 09:09) [236]

Я именно в материале по первой ссылке и прочел описание каталоговой записи, но то, что имел ввиду автор, не понял. Дайте хотя бы намек, куда копать. И поясните, что подразумевается под словами "знать представление данных в памяти"?


 
Anatoly Podgoretsky ©   (2010-07-21 09:48) [237]

> Виталий  (21.07.2010 09:09:56)  [236]

Что за каталоговая запись, как она выглядит, что за манипуляции надо с ней
делать?
Представление данных в памяти - это знать как побитно данные представлены в
памяти.


 
Alien1769 ©   (2010-07-21 10:41) [238]

> Виталий  (21.07.2010 09:09:56)  [236]

В помощь :

DosConstant   Value
ReadOnly        $01
Hidden           $02
SysFile          $04
VolumeID       $08
Directory       $10
Archive         $20
AnyFile         $3F

плюс
> Anatoly Podgoretsky ©   (21.07.10 09:48) [237]
> Представление данных в памяти - это знать как побитно данные
> представлены в
> памяти.


 
Виталий ©   (2010-07-21 11:12) [239]

Анатолий, как я понял, эта запись описывает "метаданные" для одного файла, как то: его расширение, имя, атрибуты, размер и проч., но не само его содержимое.
Когда файл хотят открыть, то система идет в нужный каталог и узнает, что за файл ей предстоит читать, каковы его характеристик, а потом уже только начинает читать. Верно?
Ну вот я прочел в коде описание полей. Да, там есть Word (16 бит, 2 байт), LongInt (4 байта). Но как из описания полей можно понять, что за хитрые вещи проводятся с их содержимым и для чего?
Alien1769, вы привели то, какие значения может принимать поле атрибута. Но в коде оно вообще не используется.


 
Sha ©   (2010-07-21 11:33) [240]

> Виталий ©   (21.07.10 09:09) [236]
> Я именно в материале по первой ссылке и прочел описание каталоговой записи

Там же описан способ хранения длинных имен.
Т.е. сектор каталога может содержать записи двух типов.
Чтобы выполнить задание [234] надо просто добавить к коду
недостающее описание и переписать GetUniLFN.

> Виталий ©   (21.07.10 11:12) [239]
> Но как из описания полей можно понять,
> что за хитрые вещи проводятся с их содержимым и для чего?

Никак.
Потому что у автора нет описания этих полей для случая
хранения на тех же местах частей длинного имени.


 
Sha ©   (2010-07-21 11:44) [241]

> Sha ©   (21.07.10 11:33) [240]
> Никак.

Ну, или знать,
что в IA-32 целые типы хранятся в Little Endian (меньшим концом вперед) представлении,
что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),
что после Shr 8 первый байт становится нулевым, второй - первым и т.д.,
что после Shr 16 .........


 
Anatoly Podgoretsky ©   (2010-07-21 11:51) [242]

> Виталий  (21.07.2010 11:12:59)  [239]

Мы уже говорили про WinApi, а здесь надо знать DOSApi, что проще, но уже все
забыли.
Ты не в ту степь полез.


 
Anatoly Podgoretsky ©   (2010-07-21 11:52) [243]

> Sha  (21.07.2010 11:33:00)  [240]

Автор честно признается, что он не пользовалься документированой
информацией, а делал хакерский анализ и не несет ответственности за
достоверность данной информации.


 
Sha ©   (2010-07-21 11:59) [244]

> Anatoly Podgoretsky ©   (21.07.10 11:51) [242]
> а здесь надо знать DOSApi,

Да там ваще никакой апи не нужен.
Обычная функция преобразования данных.

Достаточно уметь работать с массивами и со структурами данных.
Объявить record как надо и пройтись по массиву record"ов,
сцепляя данные в одно длинное имя.


 
Anatoly Podgoretsky ©   (2010-07-21 12:11) [245]

> Sha  (21.07.2010 11:59:04)  [244]

Ты разве не видел там int 21/25 АПИ в ДОС реализовывалось через вызов
прерывания.


 
Sha ©   (2010-07-21 12:21) [246]

> Anatoly Podgoretsky ©   (21.07.10 12:11) [245]

Мы ща говорим конкретно о функции GetUniLFN


 
Anatoly Podgoretsky ©   (2010-07-21 12:26) [247]

> Sha  (21.07.2010 12:21:06)  [246]

Внутри которой непонятные функции и операции.


 
Sha ©   (2010-07-21 12:28) [248]

> Anatoly Podgoretsky ©   (21.07.10 12:26) [247]

Ждем. Виталий разъяснить должен.


 
Alien1769 ©   (2010-07-21 12:58) [249]


> Alien1769, вы привели то, какие значения может принимать
> поле атрибута. Но в коде оно вообще не используется.


Ошибочное мнение. Как же функция узнает про каталог ?? :)


 
Виталий ©   (2010-07-21 13:49) [250]


> что в IA-32 целые типы хранятся в Little Endian

Это читал в википедии.

> что Chr(i) эквивалентно Chr(Byte(i)) или Chr(i and 255),

Догадываюсь. В третьем случае поразрядное AND, а 255 - это 11111111, то есть число в итоге даст опять же i

> что после Shr 8 первый байт становится нулевым, второй -
>  первым и т.д.,
> что после Shr 16 .........

- вероятно, третий - вторым, 4-й - третьим, ведь сдвиг вправо на 8 разрядов - это заполнение их (старших на х86) нулями, а то, что было младшими 8 разрядами, исчезнет.
-----------------------------------
Но в мою голову никак не приходит, как эти полезные знания использовать. А способ хранения длинных имен мне неясен. Откуда там эти 12 байт (6 юникод-символов)?


 
Виталий ©   (2010-07-21 13:50) [251]


> Ошибочное мнение. Как же функция узнает про каталог ?? :
> )

Я имею ввиду про только эту рассматриваемую функцию.


 
Виталий ©   (2010-07-21 13:53) [252]

Ой, простите, не понял вас. Но там if Dir[I].Attr<>15, а 15 - это вообще что? $10 - это 16dec


 
Anatoly Podgoretsky ©   (2010-07-21 13:54) [253]

> Виталий  (21.07.2010 13:49:10)  [250]

Не совсем

Chr(256) и Chr(256 and 255) дадут разные результаты. Chr(I and 255) нужно
для выделения младшего байта, а Chr поддерживает и Юникод.


 
Виталий ©   (2010-07-21 13:55) [254]


> Откуда там эти 12 байт

Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи. Но в коде автор, по-моему, работает совсем не с ней.


 
Виталий ©   (2010-07-21 13:58) [255]


> Chr(I and 255) нужно
> для выделения младшего байта, а Chr поддерживает и Юникод.
>

Понял вас, спасибо (проверил в калькуляторе и на бумаге работу).


 
Sha ©   (2010-07-21 14:00) [256]

> Виталий ©   (21.07.10 13:55) [254]
> Подразумеваю, что в статье сказано о "дополнительной" каталоговой записи.
> Но в коде автор, по-моему, работает совсем не с ней.

Да.
Не пытайся понять, что делает автор.
Выполни задание [234].
А там, глядишь, и поймешь.


 
Виталий ©   (2010-07-21 14:03) [257]

Как же я перепишу эту функцию, если мне неясен принцип ее работы?


 
Sha ©   (2010-07-21 14:09) [258]

> Виталий ©  
> а 255 - это 11111111, то есть число в итоге даст опять же i

Нет. -1<>255, но chr(-1)=chr(255)

> Anatoly Podgoretsky ©   (21.07.10 13:54) [253]
> Chr поддерживает и Юникод.

В код функции написан задолго до юникодовой Chr,
там везде имеется в виду AnsiChr


 
Виталий ©   (2010-07-21 14:11) [259]


>
> Нет. -1<>255, но chr(-1)=chr(255)

А вот это откуда узнать и так ли важна работа с отрицательными числами?


 
Sha ©   (2010-07-21 14:14) [260]

> Виталий ©   (21.07.10 14:03) [257]
> Как же я перепишу эту функцию, если мне неясен принцип ее работы?

Есть описание способа хранения длинного имени
http://www.ipm.kstu.ru/os/lec/13.php
этого достаточно, чтобы, (почти) не заглядывая в код чужой функции, написать свою.

Ведь ты же можешь написать код вычисления факториала,
не глядя на то, как это делают другие?


 
Anatoly Podgoretsky ©   (2010-07-21 14:14) [261]

> Виталий  (21.07.2010 13:53:12)  [252]

Dir[I].Attr<>15 это грубо, надо использовать именованые константы, а так это
набор флагов.
Смотри справку по FindFirst, а значение констант в файле windows.pas


 
Sha ©   (2010-07-21 14:17) [262]

> Виталий ©   (21.07.10 14:11) [259]
> А вот это откуда узнать и так ли важна работа с отрицательными числами?

А зачем тебе узнавать это?
Вот положительные
МахInt<>255, но chr(MaxInt)=chr(255)
511<>255, но chr(511)=chr(255)


 
Anatoly Podgoretsky ©   (2010-07-21 14:18) [263]

> Виталий  (21.07.2010 14:03:17)  [257]

Зачем тебе ее переписывать?
На чем ее переписывать, укажи точное название компилятора.
Принцип будет ясен, если изучить формат хранения длинных имен, за этим в
MSDN.


 
Виталий ©   (2010-07-21 14:19) [264]


> этого достаточно, чтобы, (почти) не заглядывая в код чужой
> функции, написать свою.

Мне, к сожалению, недостаточно. Факториал написать проще. А тут, даже если я опишу эту "дополнительную" каталоговую запись, то у меня явно возникнет еще куча вопросов, и, что самое сложное, нужно еще будет написать немаленьку обертку типа той, что описана автором и в которой я совершенно ничего не понимаю.


 
Виталий ©   (2010-07-21 14:21) [265]


> Зачем тебе ее переписывать?

дали же задание "удобочитаемо" ее переписать.

> На чем ее переписывать, укажи точное название компилятора.

У меня RAD Studio 2010. Вопрос лицензионности, прошу вас, отложите.

> Принцип будет ясен, если изучить формат хранения длинных
> имен, за этим в
> MSDN.

Есть подозрение, что он отличен от того хака, который сделан автором кода.


 
Anatoly Podgoretsky ©   (2010-07-21 14:22) [266]

> Sha  (21.07.2010 14:09:18)  [258]

Это так, но ты попробуй это на Д2010
А то что функция написана неверна, то это не является заслугой автора. Он
мог бы ее и правильно написать, хотя бы как предложено Chr(Byte(i)) или
Chr(i and 255)


 
Виталий ©   (2010-07-21 14:22) [267]


> 511<>255, но chr(511)=chr(255)

все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?


 
Anatoly Podgoretsky ©   (2010-07-21 14:23) [268]

> Виталий  (21.07.2010 14:11:19)  [259]

А что ты тогда будешь делать если встретишь в чужом коде отричательные
числа, да в том же MSDN можно встретить и то и другое.


 
Sha ©   (2010-07-21 14:25) [269]

> А тут, даже если я опишу эту "дополнительную" каталоговую запись,

А ты попробуй.


> то у меня явно возникнет еще куча вопросов

Эти вопросы будут только по букварю.

> немаленьку обертку типа той, что описана автором

С чего взял? У автора немаленькая из-за его стремления экономить на описаниях.
А у тебя должно быть просто сцепление кусков.

> и в которой я совершенно ничего не понимаю.

А нафиг тебе это понимать до написания своего кода?


 
Sha ©   (2010-07-21 14:26) [270]

> все, что за пределами типа 0..255, становится равным тому, что вернется по коду 255?

chr(256)=chr(0)


 
Виталий ©   (2010-07-21 14:28) [271]


> А что ты тогда будешь делать если встретишь в чужом коде
> отричательные
> числа, да в том же MSDN можно встретить и то и другое.

Тогда приду домой и попробую в книгах, которые мне порекомендовали здесь, найти поведение Chr, поскольку гугление ничего не дало.

> А ты попробуй.

Это я тоже попробую
Только затык с:

> С чего взял? У автора немаленькая из-за его стремления экономить
> на описаниях.
> А у тебя должно быть просто сцепление кусков.

Я имею ввиду все эти ассемблерные вставки и прочее.


 
Anatoly Podgoretsky ©   (2010-07-21 14:30) [272]

> Виталий  (21.07.2010 14:21:25)  [265]

Смею тебя огорчить, RAD не пишет программы под ДОС, а указаная программа
исключительно только под ДОС, на Виндоус она не нужна, да и замучаешься
использовать прерывания.


 
Anatoly Podgoretsky ©   (2010-07-21 14:31) [273]

> Виталий  (21.07.2010 14:22:27)  [267]

Нет CHR(Byte(256))


 
Виталий ©   (2010-07-21 14:32) [274]


> chr(256)=chr(0)

Понял. Чтобы получить равенство, нужно проводить AND с 255. Получая младшие биты, имеем равенство. Наверное, c unicode-символами и большими кодами будет как-то иначе, поскольку там может получаться 2 и более младших бит.


 
Anatoly Podgoretsky ©   (2010-07-21 14:33) [275]

> Виталий  (21.07.2010 14:28:31)  [271]

Хорошо, тогда почему ты так не поступил, да хотя бы справку посмотрел бы,
при том для старой Дельфи и для Дельфи 2009+


 
Виталий ©   (2010-07-21 14:34) [276]


> Смею тебя огорчить, RAD не пишет программы под ДОС

я догадался, но думаю, что какой-то способ написать подобное, считывая данные на низком уровне, должен быть и под Windows?


 
Sha ©   (2010-07-21 14:35) [277]

> Виталий ©   (21.07.10 14:21) [265]
> У меня RAD Studio 2010.

Тогда в этом коде используй
AnsiChr вместо Chr,
AnsiString вместо String.

> Я имею ввиду все эти ассемблерные вставки и прочее.

В функции GetUniLFN нету всех этих ассемблерные вставок и прочего.
Не хочешь писать - не морочь нам голову.
Но букварь все же лучше выучить наизусть.


 
Виталий ©   (2010-07-21 14:38) [278]


> Хорошо, тогда почему ты так не поступил, да хотя бы справку
> посмотрел бы

Нету сейчас под рукой. А гугль молчит.


 
Виталий ©   (2010-07-21 14:39) [279]


> Не хочешь писать - не морочь нам голову.

Если бы я не хотел писать и понимать, я бы не спрашивал все это. Я вижу, что в функции нету ассемблерных вставок. Но она - не вещь в себе. И ее надо будет откуда-то вызвать. А вызывается она у автора именно после всех подобных свистоплясок.


 
Sha ©   (2010-07-21 14:44) [280]

> И ее надо будет откуда-то вызвать.

Это просто учебный пример.
Напишешь подыгрывающую программу.


 
Виталий ©   (2010-07-21 14:45) [281]

А "подыгрывающие" данные случайно сгенерировать что ли, подстроившись под формат?


 
Sha ©   (2010-07-21 14:46) [282]

> А "подыгрывающие" данные случайно сгенерировать что ли, подстроившись под формат?

Почему бы нет?
Сравнишь свой выход с выходом автора (после замены на AnsiChr)


 
Виталий ©   (2010-07-21 14:50) [283]

Хорошо, приду домой и попробую.


 
Виталий ©   (2010-07-21 14:59) [284]

Кстати, такой вот вопрос:
"в Delphi 2009 тип string по умолчанию эквивалентен типу UnicodeString. Кроме того, тип Char по умолчанию - тип WideChar, а тип PChar по умолчанию - PWideChar. "
Я буду использовать юникод-строки. Тогда почему вы говорили об AnsiChr?


 
Sha ©   (2010-07-21 15:00) [285]

> Anatoly Podgoretsky ©   (21.07.10 14:22) [266]
> Это так, но ты попробуй это на Д2010
> А то что функция написана неверна, то это не является заслугой автора.
> Он мог бы ее и правильно написать, хотя бы как предложено Chr(Byte(i)) или
Chr(i and 255)

По идее AnsiChr лучше, но вряд ли он мог мог такое предсказать.


 
Sha ©   (2010-07-21 15:01) [286]

> Виталий ©   (21.07.10 14:59) [284]
> Тогда почему вы говорили об AnsiChr?

Попробуй сам ответить.


 
Anatoly Podgoretsky ©   (2010-07-21 15:02) [287]

> Виталий  (21.07.2010 14:32:34)  [274]

Неправильно, 255 если значия должны быть ограничены (завернуты) на это
значение, поскольку правильно и Chr(Word(x))


 
Anatoly Podgoretsky ©   (2010-07-21 15:02) [288]

> Виталий  (21.07.2010 14:34:36)  [276]

Под Виндоус не надо, нет смысла


 
Виталий ©   (2010-07-21 15:05) [289]


> ограничены (завернуты)

то есть на and c ним (с 255)?

> Попробуй сам ответить.

Не могу.


 
Anatoly Podgoretsky ©   (2010-07-21 15:06) [290]

> Виталий  (21.07.2010 14:59:44)  [284]

А наверно для - AnsiChar = Byte(0..255);
Это понимать надо, а не спрашивать почему, потому что ответом может быть
много и опять упремся в понимание процесса.


 
Anatoly Podgoretsky ©   (2010-07-21 15:07) [291]

> Sha  (21.07.2010 15:00:45)  [285]

Я не знаю насчет него, но я такое предсказывал уже в Турбо Паскаль, всегда
приводя к Byte


 
Anatoly Podgoretsky ©   (2010-07-21 15:08) [292]

> Виталий  (21.07.2010 15:05:49)  [289]

Завернутя это когда после 255 идет не 256, а ноль, по модулю 256


 
Виталий ©   (2010-07-21 15:08) [293]

Совершенно вас не понял. Сказано в описании - юникод, мол, по 2 байта символы. Да. А AnsiChar тут причем?


 
Sha ©   (2010-07-21 15:10) [294]

> Виталий ©   (21.07.10 15:05) [289]
> Не могу.

Главное простота реализации.
На мой взгляд проще сформировать результат в сырой или в Ansi-строке,
а затем перевести ее в юникод. Может быть, я не прав.


 
Виталий ©   (2010-07-21 15:11) [295]

The AnsiChar type is used to hold single characters. It is guaranteed to be 8 bits in size.
Логично, что 0-255


 
Виталий ©   (2010-07-21 15:12) [296]


> в Ansi-строке

У нее каждый символ - AnsiChar, то есть 1 байт. Есть способ в такой строке хранить двухбайтовые символы?
Сырая строка... Вообще что-то новенькое.


 
Виталий ©   (2010-07-21 15:14) [297]


> Есть способ в такой строке хранить двухбайтовые символы?

Понял. Тут не хранение, а конвертация.


 
Sha ©   (2010-07-21 15:17) [298]

> Есть способ в такой строке хранить двухбайтовые символы?

Ага, в двух байтах один символ, как автор.


 
Виталий ©   (2010-07-21 15:19) [299]


>
> Ага, в двух байтах один символ, как автор.

Судя по этому, нифига я не понял. Не вижу я, не понимаю, как он это делает. Вижу только странное соединение строк и все.


 
Sha ©   (2010-07-21 15:22) [300]

Сделай по-своему.


 
Виталий ©   (2010-07-21 15:27) [301]

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


 
Sha ©   (2010-07-21 15:35) [302]

> Виталий ©   (21.07.10 15:27) [301]

По-своему, как ты хотел, просто сцепляя юникодовые части строки.
Если скажу подробнее, то тебе писать ничего не останется.


 
Виталий ©   (2010-07-21 15:37) [303]


> Если скажу подробнее, то тебе писать ничего не останется

То есть я никогда не пойму ни метод автора кода, ни метод, как в анси-строку записывать юникод.


 
Sha ©   (2010-07-21 15:38) [304]

Для реализации [302] этого не требуется.
А после этого увидишь, что там и понимать-то нечего.


 
RWolf ©   (2010-07-21 15:39) [305]

открой виндовую Таблицу символов, и всё станет понятно.


 
Виталий ©   (2010-07-21 15:40) [306]

Мне кажется сомнительным, что написав одну программу можно понять два совершенно неясных мне метода.


 
Виталий ©   (2010-07-21 15:41) [307]


> открой виндовую Таблицу символов, и всё станет понятно.

Открыл. Наверное, я просто не понимаю ваших мыслей, вы говорите намеками.


 
RWolf ©   (2010-07-21 15:43) [308]


> Виталий ©   (21.07.10 15:41) [307]

это наглядная иллюстрация того, как одному символу соответствуют два байта.


 
Sha ©   (2010-07-21 15:43) [309]

> Виталий ©   (21.07.10 15:40) [306]

Не пытайся накапливать знания впрок методом "в ширину",
задавая кучу вопросов, слабосвязанных с поставленной задачей.
Это тебе только мешает


 
Виталий ©   (2010-07-21 15:44) [310]


>
> это наглядная иллюстрация того, как одному символу соответствуют
> два байта.

Мне это и так было ясно, скажем, кириллическая А как 0410. А теперь нужно два этих байта записать в анси-строку. Но для анси-строки 04 и 10 будут двумя разными символами.


 
Виталий ©   (2010-07-21 15:46) [311]


> задавая кучу вопросов, слабосвязанных с поставленной задачей.

Хорошо. Решу задачу и, возможно, вы мне наконец откроете секрет.


 
Sha ©   (2010-07-21 15:47) [312]

> Виталий ©   (21.07.10 15:46) [311]

Этого не потребуется, поверь. Сам поймешь.


 
RWolf ©   (2010-07-21 15:48) [313]


> Виталий ©   (21.07.10 15:44) [310]

в простейшем случае — просто присвоить юникодную строку анси-строке. Дельфи сам сконвертирует символы.


 
Виталий ©   (2010-07-21 15:50) [314]


> Этого не потребуется, поверь. Сам поймешь.

У меня просто в голове уже возникло представление о том, как я объявляю юникод строку, да буду читать ее через BlockRead. А вот представления о тех задачах не возникло)


 
Anatoly Podgoretsky ©   (2010-07-21 15:52) [315]

> Виталий  (21.07.2010 15:08:53)  [293]

А AnsiChar один байт.


 
Anatoly Podgoretsky ©   (2010-07-21 15:53) [316]

> Sha  (21.07.2010 15:10:54)  [294]

По уму в 2010 нельзя использовать AnsiString, обязательно RawByteString,
если конечно клиенту это что то говорит. Иначе возможны побочные эффекты


 
Виталий ©   (2010-07-21 15:54) [317]


> просто присвоить юникодную строку анси-строке

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


 
Anatoly Podgoretsky ©   (2010-07-21 15:55) [318]

> Виталий  (21.07.2010 15:12:56)  [296]

String может хранить что угодно, хоть код программы. Так что двубайтные
символы тоже можно. Только помнить о побочных эффектах.


 
Anatoly Podgoretsky ©   (2010-07-21 15:56) [319]

> Виталий  (21.07.2010 15:19:59)  [299]

У автора нет AnsiString они тогда еще не существовали.


 
Sha ©   (2010-07-21 15:57) [320]

> Anatoly Podgoretsky ©   (21.07.10 15:53) [316]
> Иначе возможны побочные эффекты

Разумеется, сырая предпочтительнее, но можно и Ansi,
если данные пересылать при помощи Move.


 
Anatoly Podgoretsky ©   (2010-07-21 15:57) [321]

> Виталий  (21.07.2010 15:27:01)  [301]

Непонимание от отсутствия базовых знаний.


 
Виталий ©   (2010-07-21 15:57) [322]


> так что двубайтные
> символы тоже можно

Остался маленький вопрос - как?) Второе из моих предположений, насколько я понимаю, неверно (первое неверно по-любому, я сглупил)?


 
Anatoly Podgoretsky ©   (2010-07-21 15:57) [323]

> Виталий  (21.07.2010 15:37:03)  [303]

Через приведение.


 
Anatoly Podgoretsky ©   (2010-07-21 15:59) [324]

> Sha  (21.07.2010 15:43:09)  [309]

Уже писали, что разбрасывать вредно и при том очень.


 
Виталий ©   (2010-07-21 15:59) [325]

> Через приведение
WideCharToMultiByte?


 
Anatoly Podgoretsky ©   (2010-07-21 16:01) [326]

> Виталий  (21.07.2010 15:44:10)  [310]

Ну и что что разные символы, s[1] = $10; s[2] = $04; А WideChar(s[1] = $0410
Приведение тоже относится к базовым принципам (возможностям) языка. Без
приведения можно писать только программы уровня Hello World


 
Виталий ©   (2010-07-21 16:03) [327]


> У автора нет AnsiString они тогда еще не существовали.

Я не знаю, чему когда-то равно соответствовало просто "String".


 
Anatoly Podgoretsky ©   (2010-07-21 16:04) [328]

> Виталий  (21.07.2010 15:46:11)  [311]

Секрета нет, есть знания, без знаний никак, сколько не объясняй все без
толку, только количество вопросов будет возрастать, о чем тебя в самом
начале предупреждали. В такой ситуации выход только один, это написать за
тебя задачу, но в Виндоус она не имеет смысла, а в Дос Дельфи не делает. Тут
надо переходить на Турбо Паскаль, а для него она уже реализована.


 
Виталий ©   (2010-07-21 16:10) [329]


> Секрета нет, есть знания, без знаний никак, сколько не объясняй
> все без
> толку

То есть я безнадежен?
Какие знания мне нужны, чтобы понять, как решил задачу автор, как в ANSI кидать еще каким-то спосом юникод?


 
Sha ©   (2010-07-21 16:13) [330]

Кошмар. Кодить начинай.


 
Виталий ©   (2010-07-21 16:13) [331]

Или мне нужно только писать свой код и не пытаться даже рассмотреть более "крутые" вещи?


 
Виталий ©   (2010-07-21 16:15) [332]


> Кошмар. Кодить начинай.

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


 
Sha ©   (2010-07-21 16:15) [333]

Доктор сказал "в морг" - значит, в морг.


 
Виталий ©   (2010-07-21 16:17) [334]

Что же вы проиллюстрировали этой фразой?


 
Sha ©   (2010-07-21 16:19) [335]

> Что же вы проиллюстрировали этой фразой?

не пытаться даже рассмотреть более "крутые" вещи?

Да. Не нужны они на начальном этапе. Тем более круты они только с виду.


 
Anatoly Podgoretsky ©   (2010-07-21 16:38) [336]

> RWolf  (21.07.2010 15:48:13)  [313]

Это еще бабушка надвое сказала, ну не может любой символ из множества в 1
миллион присвоен множеству в 256


 
Anatoly Podgoretsky ©   (2010-07-21 16:40) [337]

> Sha  (21.07.2010 15:57:20)  [320]

Я очень давно отказался от использования таких низкоуровневых функций как
Move


 
Anatoly Podgoretsky ©   (2010-07-21 16:41) [338]

> Виталий  (21.07.2010 15:59:25)  [325]

Это не приведение, а преобразование юникода во многобайтную кодировку


 
Anatoly Podgoretsky ©   (2010-07-21 16:41) [339]

> Виталий  (21.07.2010 16:03:27)  [327]

ShortString


 
Anatoly Podgoretsky ©   (2010-07-21 16:43) [340]

> Виталий  (21.07.2010 16:10:29)  [329]

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


 
Виталий ©   (2010-07-21 17:32) [341]

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


 
Sha ©   (2010-07-21 17:41) [342]

Учусь варить щи.
Сейчас засел за изучение первого ингредиента - капусты.


 
Виталий ©   (2010-07-21 17:54) [343]

Всегда ищу двойное дно в ваших словах. "Все постепенно, так и надо" или "Неверный путь"?


 
Sha ©   (2010-07-21 17:55) [344]

Из одной капусты щей не сварить


 
Виталий ©   (2010-07-21 17:59) [345]

Для начала я хочу понять материал с преобразованиями. Я прочел, что приводить можно как b := Byte(W), где b - byte, w - Word, так и
type TBRec = record
hi, low: Byte;
end;
b := TBREc(W).hi;
буду разбираться и с обратной операцией.


 
Anatoly Podgoretsky ©   (2010-07-21 19:31) [346]

> Sha  (21.07.2010 17:41:42)  [342]

А я бы со сметаны начал.
А что такое сметана?
Вот так выглядит обсуждение.


 
Anatoly Podgoretsky ©   (2010-07-21 19:32) [347]

> Виталий  (21.07.2010 17:59:45)  [345]

Операции не равнозначны.


 
Виталий ©   (2010-07-21 19:32) [348]


> Операции не равнозначны.

Я знаю. Это просто то, что я себе отметил.


 
Sha ©   (2010-07-21 19:37) [349]

Чему равны byte(w shr 8), byte(w shr 4) и byte(w div 256)?
Пусть i - integer, равны ли byte(i shr 8) и byte(i div 256)?
Равны ли знаки shortint(i) и smallint(i)?


 
Sha ©   (2010-07-21 19:39) [350]

> Anatoly Podgoretsky ©   (21.07.10 19:31) [346]
> А я бы со сметаны начал.

)


 
Sha ©   (2010-07-21 19:46) [351]

Виталий ©   (21.07.10 17:59) [345]

Где такое объявление видел?
Автор не Сусанин, случайно?


 
Виталий ©   (2010-07-21 23:26) [352]


> Чему равны byte(w shr 8), byte(w shr 4) и byte(w div 256)?

Ответить в общем случае или на конкретном примере?

> Где такое объявление видел?

http://www.sai.msu.su:7000/programming/bp70_lr/lr5.shtml
Фамилия автора не указана :)


 
Sha ©   (2010-07-21 23:54) [353]

> Виталий ©   (21.07.10 23:26) [352]
> Ответить в общем случае или на конкретном примере?

в общем

>> Где такое объявление видел?
> ...Фамилия автора не указана :)

у него нет ничего такого, нашел там только это:
TByteRec = record
 lo, hi: byte;
 end;

существенная разница


 
Виталий ©   (2010-07-22 09:27) [354]


> TByteRec = record
>  lo, hi: byte;
>  end;


> type TBRec = record
> hi, low: Byte;
> end;

в чем разница? Или имена имеют значение?


 
Sha ©   (2010-07-22 09:33) [355]

> Или имена имеют значение?

const
 clBlack = TColor($FFFFFF);
 clWhite = TColor($000000);


 
RWolf ©   (2010-07-22 10:37) [356]


> Виталий ©   (22.07.10 09:27) [354]

разница в порядке следования полей. В записи TByteRec адрес поля lo меньше адреса поля hi на единицу, в TBRec — наоборот.


 
Виталий ©   (2010-07-22 13:27) [357]


> разница в порядке следования полей. В записи TByteRec адрес
> поля lo меньше адреса поля hi на единицу, в TBRec — наоборот.

Спасибо, понял, как оно работает.


 
Sha ©   (2010-07-23 09:28) [358]

> Виталий ©   (22.07.10 13:27) [357]
> понял, как оно работает.

Тогда дополнительно к [349] еще:

Пусть
a, b: cardinal;
Равны ли выражения:
a+b
(a or b) + (a and b)
2 * (a or b) - (a xor b)
2 * (a and b) + (a xor b)

Почему?


 
Виталий ©   (2010-07-26 09:59) [359]


> Чему равны byte(w shr 8), byte(w shr 4) и byte(w div 256)?

Число, разделенное на 2 в восьмой, 2 в четвертой и на 256 без остатка?

> равны ли byte(i shr 8) и byte(i div 256)?

равны, 2^8 = 256, сдвиг вправо - деление

> Равны ли знаки shortint(i) и smallint(i)?

Вот этот вопрос не понял. Да, у них разные диапазоны. Но у -120 что в shortint, что в smallint будет одинаковый знак. Или я что-то упустил.

> Пусть
> a, b: cardinal;

А как на эти вопросы ответить без знания значений a и b?


 
Anatoly Podgoretsky ©   (2010-07-26 10:09) [360]


> А как на эти вопросы ответить без знания значений a и b?

А зачем нам частные случаи?


 
Sha ©   (2010-07-26 10:31) [361]

>> Чему равны byte(w shr 8), byte(w shr 4) и byte(w div 256)?
> Число, разделенное на 2 в восьмой, 2 в четвертой и на 256 без остатка?

Ответ на пятерку не тянет, хотя  по существу верен.
Те, кто знает толк в извращениях, мыслят в категориях байтов и ниблов.


>> равны ли byte(i shr 8) и byte(i div 256)?
> равны, 2^8 = 256, сдвиг вправо - деление

Двойка.
Проверь для отрицательных i.


>> Равны ли знаки shortint(i) и smallint(i)?
> Да, у них разные диапазоны.
> Но у -120 что в shortint, что в smallint будет одинаковый знак.
> Или я что-то упустил.

Опять двойка.
Упустил i=32767.

>> Пусть a, b: cardinal; Равны ли выражения... Почему?
> А как на эти вопросы ответить без знания значений a и b?

Будем считать выражения равными, если они равны при любых a и b (тождество).
Выражения не равны, если существует хотя бы одна пара a и b,
при которых равенство нарушается.


 
RWolf ©   (2010-07-26 10:32) [362]


> Виталий ©   (26.07.10 09:59) [359]
> > равны ли byte(i shr 8) и byte(i div 256)?
> равны, 2^8 = 256, сдвиг вправо - деление


var i:Integer;
begin
 i:=-257;
 ShowMessage(IntToStr(Byte(i shr 8)));
 ShowMessage(IntToStr(Byte(i div 256)));
end;

ответы: 254, 255.


 
Anatoly Podgoretsky ©   (2010-07-26 11:06) [363]

> RWolf  (26.07.2010 10:32:02)  [362]

Ты считрил, ты восспользовался подсказкой.


 
RWolf ©   (2010-07-26 11:36) [364]


> Anatoly Podgoretsky ©   (26.07.10 11:06) [363]

нет, я как-то раз сам на это наткнулся.


 
Виталий ©   (2010-07-26 11:46) [365]


> Проверь для отрицательных i.

я плохо понимаю эту тему с отрицательными значениями и по поводу выхода за пределы формата (там переполнения не будет разве? Дельфи под рукой нет). Где можно прочесть про них более подробно?

> мыслят в категориях байтов и ниблов.

сказать, как оно было сдвинуто с байтами и полубайтами?

>
> Будем считать выражения равными, если они равны при любых
> a и b (тождество).

в этом случае я не знаю, как подступиться к этому решению. Упрощение логики до чего-то? Путей пока что не вижу.


 
Anatoly Podgoretsky ©   (2010-07-26 11:54) [366]


> там переполнения не будет разве?

Откуда переполнение при целочисленом деление?


 
Sha ©   (2010-07-26 11:57) [367]

> я плохо понимаю эту тему с отрицательными значениями

Представление целых чисел в памяти. Наизусть.

> сказать, как оно было сдвинуто с байтами и полубайтами?

Да не надо уже.

> в этом случае я не знаю, как подступиться к этому решению.

Проверить на нескольких парах.
Выдвинуть гипотезу.
Попробовать доказать или опровергнуть.
Если не получится, наконец прочесть хелп по логическим операциям над целыми.


 
Виталий ©   (2010-07-26 12:19) [368]


> прочесть хелп по логическим операциям над целыми

Они сильно отличаются от обычных операций, которые я могу представить с числами в двоичном виде?


 
Sha ©   (2010-07-26 12:22) [369]

Откуда мне знать, что ты можешь представить? :)


 
Anatoly Podgoretsky ©   (2010-07-26 12:25) [370]

> Виталий  (26.07.2010 12:19:08)  [368]

Не сильно, просто они основаны на двоичной логике
Не помню посылал ли на
http://www.podgoretsky.com/Redir.aspx?id=137&DownloadFile=~/ddp/bits.aspx


 
brother ©   (2010-07-26 12:27) [371]

2+2=4
II+II=IIII
10+10=100
еще фантазия?


 
Виталий ©   (2010-07-26 12:44) [372]


> http://www.podgoretsky.com/Redir.aspx?id=137&DownloadFile=~/ddp/bits.
> aspx

Не посылали. Там вроде бы все то же, что в вашей статье на Королевстве Дельфи. Но вот по поводу вывода логики из абстрактных чисел я ничего не понял. Да, я могу наделать массу примеров - но свести в систему их... Как?

> 2+2=4
> II+II=IIII
> 10+10=100
> еще фантазия?

десятичная
палочки какие-то
двоичная
Зачем?


 
Sha ©   (2010-07-26 12:50) [373]

Виталий, честно скажи, хелп прочел или еще нет?
А чего тогда разговоры разговариваем, если еще нет?


 
brother ©   (2010-07-26 12:51) [374]

> десятичная
> палочки какие-то
> двоичная

достаточно)


 
Виталий ©   (2010-07-26 12:53) [375]


> хелп прочел или еще нет?

А что вы подразумеваете под хелпом? Хелп, вызываемый по f1 из дельфи? Так говорю же, нет сейчас под рукой. Мне вот заранее интересно, что я там такого узнаю, что изменит мое представление о том, как без значений можно доказать тождественность приведенных выражений?


 
Anatoly Podgoretsky ©   (2010-07-26 12:55) [376]

> brother  (26.07.2010 12:27:11)  [371]

II+II=IV


 
Anatoly Podgoretsky ©   (2010-07-26 12:57) [377]

> Виталий  (26.07.2010 12:44:12)  [372]

> десятичная

Это ты откуда взял, я же четко вижу, что это пятиричная


 
Виталий ©   (2010-07-26 12:57) [378]


> II+II=IV

тоже так подумал, но решил, что мне показали забавную "систему счисления".


 
Sha ©   (2010-07-26 12:58) [379]

> Хелп, вызываемый по f1 из дельфи?

Да. На and, or, xor и т.п.

> как без значений можно доказать тождественность приведенных выражений?

Попробуй используя багаж начальной школы:
"от перестановки слагаемых сумма не меняется".


 
Виталий ©   (2010-07-26 12:58) [380]


> Это ты откуда взял, я же четко вижу, что это пятиричная

В шестнадцатеричной та же фигня с 2+2.


 
Anatoly Podgoretsky ©   (2010-07-26 12:58) [381]

> Виталий  (26.07.2010 12:53:15)  [375]

Справке трудно изменить представление, она не для этого, а на изменение
сильно влияют книги по теории.


 
Виталий ©   (2010-07-26 13:01) [382]


> от перестановки слагаемых сумма не меняется".

а также a or b = b or a и т.д. Я не могу понять. Не получается. Не знаю решения. Действия в скобках не упрощаются. Or - не равен "+", и упростить все это не получится.


 
Виталий ©   (2010-07-26 13:02) [383]


> а на изменение
> сильно влияют книги по теории.

я бы с радостью прочел, да не знаю, в каких рассказано, как такое доказать.


 
brother ©   (2010-07-26 13:04) [384]

> В шестнадцатеричной та же фигня с 2+2.

+5!


 
Виталий ©   (2010-07-26 13:06) [385]


> +5!

Калькулятор и здравая логика подтверждают мои слова, не понимаю, что опять не так :)


 
Sha ©   (2010-07-26 13:09) [386]

> Or - не равен "+",

Начни с простого, посмотри на это в двоичной системе:
1 + 2 + 4 = 7
3 + 4 = 7
2 + 5 = 7
1 + 6 = 7


 
Anatoly Podgoretsky ©   (2010-07-26 13:11) [387]

> Виталий  (26.07.2010 12:57:18)  [378]

Может и показали, количество палочек равно значению, здесь четыре палочки


 
Anatoly Podgoretsky ©   (2010-07-26 13:12) [388]

> Виталий  (26.07.2010 12:58:20)  [380]

Это просто совпадение, и подмножество.


 
Виталий ©   (2010-07-26 13:21) [389]


> Это просто совпадение, и подмножество.

да естественно, что внутри системы счисления с явно большим основанием и другой системы с основанием меньшим, но выполняемыми одинаковыми операциями с результатом в пределах этого основания он как бы будет одинаковым. И в восьмеричной так же.


 
Anatoly Podgoretsky ©   (2010-07-26 13:21) [390]

> Виталий  (26.07.2010 13:01:22)  [382]

Естественно Or - не равен "+", и это выходит из теории битовых операций


 
Anatoly Podgoretsky ©   (2010-07-26 13:22) [391]

> Виталий  (26.07.2010 13:06:25)  [385]

Он тебя похвалил.


 
Anatoly Podgoretsky ©   (2010-07-26 13:25) [392]

> Виталий  (26.07.2010 13:02:23)  [383]

Тебя пытаются заставить мыслить абстрактно и на основе абстракций делать
правильные выводы.
Кстати я тебя предупреждал, что мы будем пытаться сбить с пути, вводя новые
переменные, посмотреть на что ты пригоден, умеешь ли держаться выбраной
линии или будешь метаться туда и сюда. Пока второе.


 
Виталий ©   (2010-07-26 13:31) [393]


> умеешь ли держаться выбраной
> линии

Линия такова - рассмотреть для начала, равно ли a + b выражению (A OR B) + (A AND B)
Мне предлагают аналогию с разложением числа 7 на слагаемые и их комбинации. Однако данные операции не подвержены разложению - я не могу выделить из этого выражения "частицы".


 
Sha ©   (2010-07-26 13:35) [394]

> Мне предлагают аналогию с разложением числа 7

Тебе предлагают начать с разложения числа 7 на слагаемые.
А если хочешь аналогию, то это: a=7, b=2.


 
Anatoly Podgoretsky ©   (2010-07-26 13:36) [395]

> Виталий  (26.07.2010 13:21:29)  [389]

Операции могут быть изменены, многие языки позволяют переопределять
операторы.


 
Sha ©   (2010-07-26 13:37) [396]

А потом a=3, b=6


 
Виталий ©   (2010-07-26 13:37) [397]


> Операции могут быть изменены, многие языки позволяют переопределять
> операторы.

В таком случае без программного кода или его кусков задача будет неполностью сформированой, и, следовательно, рассматривать ее вне контекста кода будет бессмысленно.


 
Sha ©   (2010-07-26 13:41) [398]

Хорошо сказал, попробую ввернуть где-нить при случае.


 
Anatoly Podgoretsky ©   (2010-07-26 13:45) [399]


> да естественно, что внутри системы счисления с явно большим
> основанием и другой системы с основанием меньшим, но выполняемыми
> одинаковыми операциями с результатом в пределах этого основания
> он как бы будет одинаковым. И в восьмеричной так же.

Вот твои слова
а вот пример

2+2=4
2+2=6

Второй оператор переопределен, но это одинаковый оператор


 
Виталий ©   (2010-07-26 13:45) [400]


> Хорошо сказал, попробую ввернуть где-нить при случае.

:)

> А если хочешь аналогию, то это: a=7, b=2.

ерунда полная получается.


 
Виталий ©   (2010-07-26 13:46) [401]


> Второй оператор переопределен, но это одинаковый оператор

Одинаковый оператор, неодинаковая операция.


 
Anatoly Podgoretsky ©   (2010-07-26 13:47) [402]

Операция сложения, оператор "+"


 
Виталий ©   (2010-07-26 13:48) [403]


> Операция сложения, оператор "+"

зачем мне ваша операция сложения? Я хочу использовать свою, понятную мне :)


 
Виталий ©   (2010-07-26 13:49) [404]

Если я назову нож вилкой, то от этого мало что изменится во Вселенной.


 
Anatoly Podgoretsky ©   (2010-07-26 13:53) [405]

> Виталий  (26.07.2010 13:48:43)  [403]

Вот и мысли абстрактно, а то утверждение не выдерживает критики.


 
Anatoly Podgoretsky ©   (2010-07-26 13:53) [406]

> Виталий  (26.07.2010 13:49:44)  [404]

Попробуй сделать из вилки нож, или хотя бы понять различия, как в случае + и
OR


 
Виталий ©   (2010-07-26 13:58) [407]


> Вот и мысли абстрактно, а то утверждение не выдерживает
> критики.

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


 
Виталий ©   (2010-07-26 13:59) [408]


> Попробуй сделать из вилки нож, или хотя бы понять различия,
>  как в случае + и
> OR

Да я вроде их понимаю! a or b != a + b


 
Sha ©   (2010-07-26 14:15) [409]

> путь, подсказанный Sha, меня никуда не привел.

Знать путь не значит идти по нему :)


 
Виталий ©   (2010-07-26 14:18) [410]

Меткое замечание. Объясните уже наконец, как идти.


 
Sha ©   (2010-07-26 14:21) [411]

> Объясните уже наконец

См. [396]


 
Sha ©   (2010-07-26 14:25) [412]

4 слагамых слева, 4 справа.
Вся разница между ними состоит в расстановке скобок.


 
Виталий ©   (2010-07-26 14:33) [413]

Не понимаю и, видимо, не пойму. 4 слагаемых, a=3, b=6  и т.д.


 
Виталий ©   (2010-07-26 14:38) [414]

Откуда их там 4? Ужасно, просто ужасно.


 
Sha ©   (2010-07-26 14:40) [415]

слева:
a = 3 = 1 + 2
b = 6 = 2 + 4
a + b = 1 + 2 + 2 + 4

справа напиши сам


 
Виталий ©   (2010-07-26 14:41) [416]

Тю.
( (1+2) or (2+4) ) + ( (1+2) and (2+4) )


 
Sha ©   (2010-07-26 14:44) [417]

OR и AND выполни


 
Виталий ©   (2010-07-26 15:00) [418]

Вот это меня и поставило в тупик. Дизъюнкция сумм - как выполнить?..


 
Виталий ©   (2010-07-26 15:02) [419]

Мда. Или такой операции вообще нет, и вначале считается значение суммы, или я никогда не видел именно подобной операции.


 
Sha ©   (2010-07-26 15:03) [420]

Это не простые суммы, а разложения по степеням двойки.
Букварь в помощь.


 
Виталий ©   (2010-07-26 15:06) [421]

Несомненно, эти конкретные числа - степени двойки. Что от этого меняется?


 
Sha ©   (2010-07-26 15:10) [422]

Вряд ли тут будут заинтересованные в коллективном чтении букваря.


 
Виталий ©   (2010-07-26 15:12) [423]

Ясно. Как называется букварь, простите?
От себя: есть ли способ посчитать что-то вроде (a + b) or (c + d), не считая суммы выражений в скобках, будь они хоть степенью двойки, хоть 11, без разницы?


 
RWolf ©   (2010-07-26 15:23) [424]


> Виталий ©   (26.07.10 15:12) [423]
> есть ли способ посчитать

В столбик:
11 = 00001011 or
17 = 00010001
--------------
31 = 00011111


 
RWolf ©   (2010-07-26 15:24) [425]

пардон, ошибся:
11 = 00001011 or
17 = 00010001
--------------
27 = 00011011


 
Виталий ©   (2010-07-26 15:24) [426]

Это очевидно, я умею выполнять поразрядные операции. Нужно не считать сумму. Или Sha просто сбивает меня?


 
Sha ©   (2010-07-26 15:24) [427]

> Как называется букварь

Устал повторять: представление целых в памяти эвм и операции с ними.

> есть ли способ посчитать

В частном случае (a and b)=0, (c and d)=0 - легко, иначе нафиг надо.


 
Виталий ©   (2010-07-26 15:27) [428]

Я вам не про ваш частный случай, а про этот вполне конкретный (1+2) or (2+4)
Смысл в том, что мы разбили числа на слагаемые? Все равно ж сумму считать, чтоб операцию произвести!


 
Sha ©   (2010-07-26 15:27) [429]

> Виталий ©   (26.07.10 15:24) [426]
> я умею выполнять поразрядные операции

Важно сначала их увидеть, а выполнить каждый дурак сможет.


 
RWolf ©   (2010-07-26 15:27) [430]


> Виталий ©   (26.07.10 15:24) [426]

не вычисляя — нет, но обычно оно и не нужно.


 
Виталий ©   (2010-07-26 15:33) [431]


>
> Важно сначала их увидеть, а выполнить каждый дурак сможет.
>

Черт побери... Для степеней двойки or = + ?


 
RWolf ©   (2010-07-26 15:40) [432]


> Виталий ©   (26.07.10 15:33) [431]

2 or 2 = 2
2 + 2 = 4


 
Виталий ©   (2010-07-26 15:42) [433]


>
> 2 or 2 = 2
> 2 + 2 = 4

Ну это ясно. Я и на другом проверил - работает.


 
RWolf ©   (2010-07-26 15:45) [434]


> Виталий ©   (26.07.10 15:42) [433]

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


 
Anatoly Podgoretsky ©   (2010-07-26 15:50) [435]

> Виталий  (26.07.2010 15:12:03)  [423]

Не считая суммы выражений результат неопределен, по простому это абсурд


 
Anatoly Podgoretsky ©   (2010-07-26 15:51) [436]

> RWolf  (26.07.2010 15:24:05)  [425]

Пересчитай еще раз и попробуй наконец не ошибиться


 
Anatoly Podgoretsky ©   (2010-07-26 15:52) [437]

> Виталий  (26.07.2010 15:27:08)  [428]

Будет 7 а на 9


 
RWolf ©   (2010-07-26 15:53) [438]


> Anatoly Podgoretsky ©   (26.07.10 15:51) [436]

да вроде всё верно.


 
Anatoly Podgoretsky ©   (2010-07-26 15:53) [439]

> Виталий  (26.07.2010 15:33:11)  [431]

Ты больше так в слух не говори, это серьезная ошибка заменять ОR плючом,
потому горе программисты удивляются почему не так работает, ведь вроде все
правильно


 
Anatoly Podgoretsky ©   (2010-07-26 15:56) [440]

Правильно, это я с плюсом спутал, будь он неладен.


 
Виталий ©   (2010-07-26 16:01) [441]


> это серьезная ошибка заменять ОR плючом

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

> Будет 7 а на 9

Не понял, вы про что?


 
Alien1769 ©   (2010-07-26 16:14) [442]

Автору,
попробуй словами описать алгоритм !

const
  n = 5;
var
  mask,i: byte;
begin
  writeln("=====");
  for mask:=0 to (1 shl n)-1 do
  begin
    for i:=0 to n-1 do
    write(ord(mask and (1 shl i)<>0));
    writeln;
  end;
  readln;
end.


 
Виталий ©   (2010-07-26 16:31) [443]

32 раза (от 0 до 31) выведет последовательность из 5 элементов - кодов 1, если бит в i-той позиции текущей переменной внешнего цикла установлен, и нуля в противном случае, а затем перевода на новую строку.


 
Alien1769 ©   (2010-07-26 16:46) [444]

Неплохо :)
Теперь я думаю тебе можно начинать делать редактор фонтов. Для начала научись выводить любой код ASCII в виде единиц и нулей. Потом собирать из представленных битов последовательность байтов и записывать на диск.


 
Sha ©   (2010-07-26 18:01) [445]

> Виталий ©   (26.07.10 16:31) [443]

Наверно, теперь ты сможешь объяснить, почему код,
приведенный han_malign (12.07.10 18:03) [22]
в ветке http://delphimaster.net/view/2-1278658000/ , выполняет побайтовое сложение переменных по модулю 256:

a, b, c: cardinal;
c:= ((a xor b) and $80808080) xor ((a and $7F7F7F7F) + (b and $7F7F7F7F));


А если напишешь без циклов алгоритм побайтовго сложения с насыщением до 255,
то можешь считать, что материал усвоен на 5.

Конечно, доказательство тождеств никто не отменял :)



Страницы: 1 2 3 4 5 6 7 8 9 
10 11 12 вся ветка

Форум: "Прочее";
Текущий архив: 2010.11.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 2.42 MB
Время: 0.019 c
15-1280222834
12
2010-07-27 13:27
2010.11.07
О "природных" и "противоприродных" видах оружия


2-1281731884
Andrey K
2010-08-14 00:38
2010.11.07
Как через родителя обратится к компоненту.


2-1281735892
Германн
2010-08-14 01:44
2010.11.07
Named pipes


15-1280158011
AKE
2010-07-26 19:26
2010.11.07
Скажите это развод??


6-1228811420
Добежал
2008-12-09 11:30
2010.11.07
Ошибка в TIdHTTPServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский