Архивы: по дате | по разделам | по авторам

Хвосты

Архив
03.11.1998

Юрий Ревич. Прямая печать из Windows #40 (268)

 

Вы публикуете листинг. То, что он не работает и даже не компилируется - не удивительно. Такими же свойствами обладают 90% листингов, публикуемых в журналах. Всегда приходится подписывать объявления, исправлять опечатки и т. п., даже если исключить огрехи современных OCR-технологий. Но здесь же просто пятнадцать строчек! Это же кошмар! Во-первых, константам надо задавать значения. Чему равно в вашем примере BaseAddr, можно узнать только из текста статьи. А компиляторы статей не читают. Зато читают блоки определения констант. Этим же надо воспользоваться! Дальше. То, что там напечатано, - функция. А для функций в Паскале характерно наличие возвращаемого значения определенного типа. Где он? В-третьих, ни один кодер в трезвом уме не родит конструкции типа

and ah, 08h
cmp ah, 0 ;(!)
je @mer

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

(Для справки тем, кто не понял, - все нужные флаги установлены еще инструкцией and, в строке, помеченной (!), никакой нужды нет вообще:

and ah, 08h
jz @mer
).

В-четвертых, подпрограммы, написанные целиком на ассемблере, принято в Паскале, начиная с версии 7.0 (а это было очень давно, 6.0 сейчас практически невозможно достать), предварять директивой assembler и оформлять в соответствии с определенными правилами. Это, по слухам, позволяет оптимизировать результирующий код. А ведь такая фуська должна работать ужас как быстро, чтобы уменьшить вероятность конфликта с виндовым драйвером! В-пятых, Windows NT любой версии пошлют такие ухищрения подальше, и правильно сделают. А где это оговорено в тексте? Я не нашел. В общем, судя по биографии и профпригодности автора заметок, лучше бы вы назвали это все уголком электронщика.

С уважением, Дмитрий Халипский

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

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

Последняя фраза письма напомнила мне давние споры о том, как лучше разрабатывать технологическое программное обеспечение. Есть два разумных варианта: поручить это профессиональному программисту, объяснив ему принцип функционирования "железа", или поручить это профессиональному электронщику, обучив его вкратце программированию. Так вот, смею вас заверить (предчувствую, что вызову неодобрение многих программистов), основываясь на большом опыте разработки аппаратно-программных комплексов, что при всей очевидности ответа на этот вопрос для прикладных программистов, приемлемый результат получается только во втором случае. Пусть написанная электронщиком программа содержит сотню лишних команд, пусть она выглядит логически нестройной, пусть даже не отвечает (тут я, наверное, посягну на святая святых) принципам структурного программирования, но она будет реально, а не теоретически работоспособной и доведенной до рабочего состояния в необходимый срок. Господа, откуда у вас возникло мнение, что программирование самодостаточно и программы пишутся только для того, чтобы с их помощью писать другие программы? Лучше спуститесь на грешную землю и порекомендуйте нормальные способы работы, скажем, с COM-портами в Delphi, показав, что являетесь действительно профессиональными программистами.

Сергей Леонов <sleo@computerra.ru>

 
Не идеальная программа

С удивлением узнал из этой статьи о невозможности печати в сеансе DOS из-под Windows 95 (в том числе из Norton Commander).

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

Из любопытства пришлось потрудиться в Start>Settings>Printers. И при попытке печати из сеанса DOS действительно получил сообщение: "Sharing violation or disk not formatted".

Решение проблемы. Кропотливое исследование показало, что стоит лишь отключить в окошке Properties>Details>Port Settings опцию Spool MS-DOS print jobs, как все тут же встает на место: печатайте на здоровье. Это для локального принтера.

Настройками в Properties>Details>Capture Printer Port... мне удавалось печатать и через сеть. При этом на компьютере, к которому подключен сетевой принтер, печать происходила через spool manager.

(Про опцию в Port Settings для сети ничего не скажу - сейчас не могу проверить.)

Немного комментариев. Обычно печать DOS-программ производится через поток (как в обычный файл, но с особым именем PRN). Под Windows тот самый spool manager монопольно захватывает этот поток, избегая конфликта при одновременном доступе. Вот отсюда и сообщение (с виду, не имеющее отношения к принтеру).

Печать через функции BIOS тоже прекрасно работает из-под Windows.

Печать PRN-файла через F5 из Norton'а - не есть корректно. По умолчанию, поток принтера открыт в текстовом режиме (то есть транслирует LF в CR LF). Поскольку PRN-файл содержит двоичные данные, то есть графику и иногда родные шрифты принтера, то "отложенную" печать следует делать в binary (двоичном) режиме:

copy /b filename.PRN PRN

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

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

Все-таки Windows 95 получилась лучше, чем ожидалась. В том числе с точки зрения совместимости с MS-DOS. У меня даже есть подозрение, что если бы DOS-программы действительно не печатали из-под Windows 95, то мы бы узнали об этом еще в 1995 году (а за это время сколько еще работающих программ из-за незнания было выброшено на помойку!).

Предложенное автором статьи решение, и, тем более, на ассемблере, напомнило о моей первой программе для IBM PC (8088/87, 4,77 МГц , 640 Кбайт, 10 Мбайт винчестер, CGA - как недавно это было!). Это была программа для печати образа экрана на матричном принтере. Через день, гордый результатом, изучая описание MS-DOS, я обнаружил, что для этого есть "штатная" программа (GRAPHICS.COM, если не изменяет память).

Автор статьи через десяток с чем-то лет фактически повторил ту же ошибку.

Нарушено правило бритвы Оккама: не создавай сущностей без нужды.

Нарушен принцип KISS (keep it simple, stupid), да простит мне г-н Ревич последнюю букву.

Почему у письма такое заглавие?

Как-то я встретил фразу: "Идеальная программа - это та, которая не написана".

(Свои философские размышления и дополнительную информацию опускаю - письмо не статья.)

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

KISS.

Программа, приведенная в статье, не идеальна и, в каком-то смысле, не нужна.

С уважением,

Сергей Козлов
г. Фрязино Московской обл.

P. S. Тем не менее, горячо приветствую появление "Уголка программиста". Ведь программистам всегда есть что рассказать и даже написать что-нибудь на ассемблере.

P. P. S. И еще об одном правиле: "Если ничто другое не помогает, прочтите, наконец, инструкцию" (закон Мерфи, аксиома Кана). В Start>Help>Troubleshooting в разделе "If you have trouble running MS-DOS program" волшебник дает те же советы, что и в этом письме.

Cерьезное обсуждение этого материала развернулось на сайте редакции в форуме "Разное" между автором статьи и Виктором Фигурновым. В связи с большим объемом мы не приводим здесь эту переписку, хотя одно из замечаний Виктора, касающееся темы статьи, мне хотелось бы отметить: печать двоичного файла выполняется в Norton Commander с помощью комбинации клавиш Ctrl+F9, а не F5, и нормально проходит под Windows 95.

Сергей Леонов <sleo@computerra.ru>

А. В. Саяпин, Е. Козловский. Письмоносец #32 (260)

 

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

В традиционной фотографии разрешение измеряется оптическими методами.

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

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

Электронная камера имеет оптическое разрешение, скажем, 1024 ppi (пикселей на дюйм), что в соответствии с критерием Найквиста не позволяет удовлетворительно воспроизвести более 330 пар линий во всей строке.

Даже весьма посредственная 35-миллиметровая пленка имеет эквивалентное разрешение 80х36=2880 пар линий на строку. Чтобы получить хотя бы эту информацию, надо иметь разрешение сканера 2880х3х25,4/36=6096 ppi, или 8640 пикселей на строке. Профессиональные слайд-сканеры имеют даже более низкое разрешение: обычно 5000 или 10000 пикселей на 50 мм.

Для сканирования слайдов в профессиональной сфере применяют барабанные сканеры с разрешением до 20000 ppi.

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

А. Чайкин, к.т.н., главный аналитик фирмы "ЛИР консалтинг"

Илья Хрупалов. Розница #40 (268)

При описании платы WinFast 3D S800, основанной на чипе Mpact 2, допущена опечатка: на самом деле производительность этого процессора не шесть миллионов, а шесть миллиардов операций в секунду. Приносим читателям извинения.

Георгий Башилов <gbash@computerra.ru>

Виктор Жижин. Рисунок обложки #42 (270)

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

Виктор Жижин <vzh@computerra.ru>

Хвосты

© ООО "Компьютерра-Онлайн", 1997-2024
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.