Andrey Stolyarov

Андрей Викторович Столяров: сайт автора

ПРОГРАММИРОВАНИЕ: ВВЕДЕНИЕ В ПРОФЕССИЮ

краудфандинговый проект

Программирование: введение в профессию. Издание 2,9 (электронное)

1st volume cover 2nd volume cover 3rd volume cover taskbook cover

Опубликовано исправленное издание (к сожалению, чисто электронное) книги Программирование: введение в профессию (трёх томов и сборника задач). Издание авторским произволом получило номер 2,9 (два и девять десятых). Предполагается, что последующие версии, если когда-нибудь появятся, получат номера 2,99, 2,999 и т.д., т.е. номера электронных изданий будут арифметически всё ближе и ближе к тройке, но равными тройке станут лишь в случае, если книга когда-нибудь будет снова напечатана на бумаге типографским способом.

Три тома и задачник были опубликованы 14 января, 9 апреля, 30 апреля и 2 мая 2025 г. Ссылки для скачивания см. ниже.

Аннотация

Учебник «Программирование: введение в профессию» ориентирован на самостоятельное изучение и предполагает использование систем семейства Unix (в т.ч. Linux) в роли сквозной среды для обучения.

Скачать книгу

Дополнительные файлы

Архив, содержащий примеры программ, можно скачать здесь: progintro_2_9_examples.tgz. Напоминаем, что раскрыть этот архив можно командой

   tar -xzf progintro_2_9_examples.tgz

Файл stud_io.inc, используемый в начальных примерах третьей («ассемблерной») части, есть в архиве примеров, но его также можно взять здесь: stud_io_inc. Не забудьте переименовать файл! Это делается так:

  mv stud_io_inc stud_io.inc

Errata

Том I

Стр.Положение Содержание, комментарий
2аннотацияпоследнее предложение первого абзаца аннотации дублируется в начале второго абзаца; должно быть только во втором
4заголовокнаписано «Оглавление», должно быть «Содержание»
17начало второго абзаца после заголовканаписано «Второе издание, которое вы держите в руках», что не соответствует действительности, поскольку издание уже не второе
36в сноске 1имя команды ps набрано не тем шрифтом
385 абзац снизу, 2 строканаписано VI, должно быть vi
586 абзац сверху, 4 строкаслова в скобках «его мощность обозначают...» представляют собой рудимент предыдущих версий текста, следует убрать целиком
78пример выдачи ls и далеепоказаны размеры файлов. относящиеся к другой версии программы; в той версии, которая реально приведена в книге, размер исходника составляет 55 байт, а не 47, как это утверждается здесь
128в тексте примера (5 строка сверху)присваивание переменной filemode перед вызовом rewrite бессмысленно
1343 абзац снизу, 3 строканаписано «попытатся», должно быть «попытаться» (пропущен мягкий знак)
13621 и 19 строки снизу (первые две строки примера)перепутаны местами ключевые слова do и then
1712 абзац снизу, 6 строканаписано «Секцию стека», но речь должна идти про сегмент
17817 строка сверхунаписано «fig7», должно быть «dig7»
1865 абзац, 25 строканаписано «не превосходит 32», должно быть «не превосходит 31»
2023 абзац сверху, 2 строканаписано «(влево)», должно быть «(вправо)»

Том II

Стр.Положение Содержание, комментарий
87 абзац сверху, 7 строкапосле «во-вторых» стоит точка, должна быть запятая
2217 строка сверхупосле «Его используют» стоит точка, должна быть запятая
38две нижние строкине закрыта скобка (должна быть закрывающая перед двоеточием)
456 абзац сверху (мелким шрифтом), 5 строканаписано «к потоку вывода» должно быть «ввода»
51начало текста, набранного мелким шрифтом; 2 строканаписано «передют» должно быть «передают»
973 абзац сверху написано «EACCESS», должно быть «EACCES»
184первая и вторая "выключные" вставки кода после заголовканеправильное положение звёздочек в типах параметров и возвращаемого значения

Том III

Стр.Положение Содержание, комментарий
22последний абзац, 7 строка снизудважды написано «len-min», должно быть «len-min+1» (последняя строка матрицы должна как раз иметь индекс len-min при нумерации с нуля)
704 абзац снизу, 3 строканаписано «общим значеним», пропущена буква «е»
704 абзац снизу, 8 строканаписано «стрнанно», лишняя буква «н»

Задачник

Стр.Положение Содержание, комментарий
34в тексте задачи 2.52, 3 строканаписано «существует», должно быть «существуют»
57в тексте задачи 4.27написано «от 1 до argc», должно быть «от 1 до argc-1»
153в ответе задачи 4.01 h)написано «1», должно быть «0»

From EVI profile Sun Jul 27 13:10:02 2025 UTC pencil

Возможно опечатка.

Том 3, стр. 108, первый абзац:

"...передать такой список в функцию(пусть она называется F)"

И в дальнейшем эта функция называется f.

parent From Andrey V. Stolyarov profile Sun Jul 27 16:30:22 2025 UTC pencil

userpic

Re: Возможно опечатка.

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

В общем, в эррату не потащу, но поправлю.

From YanRozetkin (unverified) Wed Jul 23 12:37:40 2025 UTC pencil

ошибка 1 том

1 том, страница 90, 1 абзац, 5 строка, написано "отличается", должно быть "отличаются".

parent From Andrey V. Stolyarov profile Fri Jul 25 09:31:21 2025 UTC pencil

userpic

Re: ошибка 1 том

Искал, не нашёл. Увы.

From Robert (unverified) Sun Jul 13 11:49:05 2025 UTC pencil

short и near переходы в NASM

В первом томе на стр. 183 написано:

Вид перехода можно указать явно, поставив после команды слово short или near (ассемблер понимает, разумеется, и слово far, но нам это не нужно). Если этого не сделать, ассемблер выбирает тип перехода по умолчанию, причём для безусловных переходов это near, что нас обычно устраивает, а вот для условных переходов по умолчанию используется short, что создаёт определённые сложности.

Однако, я заметил, что ассемблер сам выбирает подходящий тип перехода: если значение смещения умещается в один байт (то есть, имеет значение от -128 до 127), то используется short, а иначе используется near. Например:

$ cat test.asm
section .text
	jmp label1
times	127 db 0
label1:
	jz label2
times	127 db 0
label2:
$ nasm -f elf test.asm -l test.lst && cat test.lst
     1                                  section .text
     2 00000000 EB7F                    	jmp label1
     3 00000002 00<rep 7Fh>             times	127 db 0
     4                                  label1:
     5 00000081 747F                    	jz label2
     6 00000083 00<rep 7Fh>             times	127 db 0
     7                                  label2:

Но:

$ cat test.asm
section .text
	jmp label1
times	128 db 0
label1:
	jz label2
times	128 db 0
label2:
$ nasm -f elf test.asm -l test.lst && cat test.lst
     1                                  section .text
     2 00000000 E980000000              	jmp label1
     3 00000005 00<rep 80h>             times	128 db 0
     4                                  label1:
     5 00000085 0F8480000000            	jz label2
     6 0000008B 00<rep 80h>             times	128 db 0
     7                                  label2:

У меня установлен NASM версии 2.16.01. Быть может это отличие более новой версии ассемблера, или это неточность в книге?

parent From Andrey V. Stolyarov profile Fri Jul 25 15:40:12 2025 UTC pencil

userpic

Re: short и near переходы в NASM

В старых версиях он этого не делал (2.4.*, насколько я помню, таким ещё не страдала). Надо сказать, что такая самодеятельность крайне неприятна, не его собачье дело выбирать команду, его дело транслировать мнемоники в код. Но да, в книжке придётся что-то на эту тему сказать, пока я это себе пометил "к доработке".

From Михаил (unverified) Sat Jul 12 15:23:14 2025 UTC pencil

Изд 2,9, Задачник, стр 57, задача 4.27

> Программа должна завершиться с кодом 0, если была нажата клавиша Escape, а при нажатии Enter - с кодом от 1 до argc, соответствующим номеру выбранного пользователем пункта меню.

Если под argc подразумевается параметр функции main, то должно быть argc - 1, разве нет?

parent From Andrey V. Stolyarov profile Fri Jul 25 15:58:38 2025 UTC pencil

From feriman (unverified) Thu Jul 10 20:26:00 2025 UTC pencil

Опечатки

Том III, стр. 70, параграф 10.7.2, 2 абзац, 3 строка - написано "общим значеним" - пропущена буква 'е';
Том III, стр. 70, параграф 10.7.2, 2 абзац, 8 строка - написано "несколько стрнанно" - лишняя буква 'н';

parent From Andrey V. Stolyarov profile Fri Jul 25 09:55:28 2025 UTC pencil

userpic

Re: Опечатки

Факт, спасибо

From Ivan (unverified) Wed Jul 9 21:59:06 2025 UTC pencil

Команды содержащие команду wait

На странице 222, сказано что инструкция выполнение которой привело к исключению только возводит флаг в регистре SR, а внутренее прерывание как я понял инициирует уже следующая f-инструкция если исключение было немаскированно. В таком случае вопрос, зачем были созданы команды fstsw и т.п. которые состоят из команды fwait и fnstsw(и других fn-команд), если после f-команды которая взведет флаг будет стоять команда fnstsw? Тоесть разве не должна команда fnstsw уже инициировать внутренее прерывание т.к. это следующая f-команда после f-команды которая взвела флаг SR?

parent From Andrey V. Stolyarov profile Sat Jul 12 16:16:10 2025 UTC pencil

userpic

Re: Команды содержащие команду wait

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

From Михаил (unverified) Sun Jul 6 16:10:08 2025 UTC pencil

Изд 2,9, том 2, стр 85, функция setpair

Андрей Викторович, есть два вопроса по примеру curses_col.c:

  1. Почему setpair определена как функция, а не как процедура? Вроде побочный эффект внутри функции является ее непосредственным назначением, но как будто что-то смущает.
  2. Почему setpair не названа set_pair в соответствии с именами других вводимых функций?

parent From Andrey V. Stolyarov profile Fri Jul 25 15:51:13 2025 UTC pencil

userpic

Re: Изд 2,9, том 2, стр 85, функция setpair

> Почему setpair определена как функция, а не как процедура?

Например, потому что в Си нет процедур.

> Почему setpair не названа set_pair

Потому что моей левой пятке в момент написания этой программы так захотелось.

В любом случае я не вижу тут поводов что-либо исправлять.

From re_plz (unverified) Fri Jul 4 10:52:37 2025 UTC pencil

Как конвертировать в fb2 и вообще можно ли это сделать?

Здравствуйте хочу спросить возможно ли конвертировать книги в fb2? При конвертации текст из кириллицы превращается в набор символов смена кодировки не помогает(. Подскажите пожайлуста ибо очень не удобно читать в пдф

parent From Andrey V. Stolyarov profile Fri Jul 4 11:42:37 2025 UTC pencil

userpic

Re: Как конвертировать в fb2 и вообще можно ли это сделать?

Заведите себе полезную привычку сначала читать лицензию, а потом уже использовать. Что бы то ни было. И вообще сначала читать (например, FAQ), а потом уже писать.

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

Впрочем, меня не так давно чёрт дёрнул наобещать публике всякого разного, так что теперь всё имеет свою цену. Прямо на текущий момент можете единолично задонатить мне что-то около 250'000 рублей, это как раз даст десять недостающих слоников (там сейчас превышение на двадцать, а надо тридцать) — и от преднамеренного убивания текстового слоя я тут же откажусь, выложу трёхтомник и задачник с корректным текстовым слоем. С fb2 потруднее будет, до искомого превышения на 50 пока что далеко; впрочем, умножьте сумму на три, это же не так тяжело вроде.

From Михаил (unverified) Mon Jun 30 01:00:58 2025 UTC pencil

Изд 2,9, том 2, стр 83, функция handle_resize

Андрей Викторович, а почему вы в функции handle_resize вместо последних четырех строк не использовали вызов move_message(x, y, *mx, *my, 0, 0)? Разве не дублирование кода выходит?

parent From Andrey V. Stolyarov profile Fri Jul 25 15:55:14 2025 UTC pencil

userpic

Re: Изд 2,9, том 2, стр 83, функция handle_resize

> почему вы в функции handle_resize вместо последних четырех строк не использовали вызов move_message(x, y, *mx, *my, 0, 0)

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

> Разве не дублирование кода выходит?

Нет, разумеется. Четыре последние строчки handle_resize не являются копией тела move_message, поскольку в ней вообще-то на два оператора больше. То обстоятельство, что вы нашли способ, как эти два оператора превратить в no-op'ы, никак ситуацию не меняет. Я вам больше скажу, если описать работу move_message словами, и потом смотреть только на эти слова, а не на её тело, то её вызов с этими вашими двумя нулями будет выглядеть бессмысленным. Ну а коль скоро придётся заглядывать в её тело, это окажется явным и очевидным нарушением принципа обособления.

From Михаил (unverified) Sun Jun 29 20:22:54 2025 UTC pencil

Съехала таблица

Изд 2,9, том 2, стр 84, самый верх

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

parent From Andrey V. Stolyarov profile Fri Jul 25 13:54:11 2025 UTC pencil

userpic

Re: Съехала таблица

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

From Виктор (unverified) Sat Jun 21 20:10:25 2025 UTC pencil

Ошибка: Том 1, страница 36, абзац 6 снизу

!137:2 обозначает слово номер 2 (третье, если считать с единицы)

здесь наверное ошибка, правильно "если считать с ноля"

parent From Andrey V. Stolyarov profile Fri Jul 25 10:13:44 2025 UTC pencil

userpic

Re: Ошибка: Том 1, страница 36, абзац 6 снизу

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

From Михаил (unverified) Tue Jun 17 12:30:27 2025 UTC pencil

Опечатка во втором томе

Изд 2,9, том 2, стр 45, врезка про fflush:

Впрочем, в одном из новомодных "стандартов" появилось утверждение, что применение fflush к потоку вывода -- это undefined behaviour, ...

Речь шла про поток ввода, и, наверное, здесь тоже должен был быть именно поток ввода?

parent From Andrey V. Stolyarov profile Fri Jul 25 14:13:32 2025 UTC pencil

From Trodden (unverified) Tue Jun 17 11:21:00 2025 UTC pencil

Ошибка 2 том

Страница 31, параграф 4.3.16., строка 6

"Начать с того" - одинокий инфинитив звучит странно. Должно быть что-то вроде "Начать стоит с того".

parent From Andrey V. Stolyarov profile Fri Jul 25 14:23:40 2025 UTC pencil

userpic

Re: Ошибка 2 том

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

From Михаил (unverified) Mon Jun 16 21:53:12 2025 UTC pencil

Опечатка в задачнике

Изд 2,9, задачник, стр 34

Опечатка в задаче 2.52 в слове "существует":

> предполагается; что все эти файлы уже существует.

parent From Andrey V. Stolyarov profile Sat Jul 26 12:56:22 2025 UTC pencil

From Михаил (unverified) Mon Jun 16 00:07:53 2025 UTC pencil

Транслит

Изд 2,9, том 2, стр 42

Андрей Викторович, вы справедливо ругаете транслит в идентификаторах в коде, но он просочился в пример с печатью значений синусов и косинусов в файл - int grad.

parent From Andrey V. Stolyarov profile Fri Jul 25 14:36:26 2025 UTC pencil

userpic

Re: Транслит

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

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

From Михаил (unverified) Sun Jun 15 00:09:22 2025 UTC pencil

Печать бинарного дерева в цикле

Изд. 2,9, том 2, стр 53 (и bintree.c тоже)

Функция int_bin_tree_print_loop будет некорректно себя вести при переданном пустом дереве. В каждом состоянии, пожалуй, следует проверять просто if (bp->p), а не bp->p->left и bp->p->right, и печать в проверку засунуть во втором состоянии.

parent From Andrey V. Stolyarov profile Sat Jul 26 13:02:53 2025 UTC pencil

userpic

Re: Печать бинарного дерева в цикле

> Функция int_bin_tree_print_loop будет некорректно себя вести при переданном пустом дереве.

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

> пожалуй, следует

Вот уж точно нет, и тратить время на объяснения я в этот раз не буду.

From Аркадий (unverified) Thu Jun 12 16:55:33 2025 UTC pencil

Непонятка

Здравствуйте. Я уже писал по поводу 22 страницы 3го тома, там вроде как ошибка в коде и тексте. Например, в эффективном решении вроде бы нет одной цепочки: 1, 2, 3, 4, 5. (Это просто для наглядного рассмотрения). Нас интересуют: 12, 23, 34, 45 В решении будут (5-2=3): 12, 23, 34. Цепочек 4, а не 3. Либо я не понял суть алгоритма и чего-то упустил, либо там действительно ошибка с len-min. Даже если на примере цикла посмотреть.

parent From Andrey V. Stolyarov profile Fri Jul 25 13:50:54 2025 UTC pencil

userpic

Re: Непонятка

Ваш коммент отправлен 12 июня. В это время (а точнее, с 7 мая до 13 июня) верхней новостью в ленте и на главной висело вот это. Даже интересно, что конкретно вам оказалось "непонятно".

From noanon (unverified) Tue Jun 10 11:29:19 2025 UTC pencil

Тернарная операция

Нередко в коде можно встретить использование тернарной операции в классическом варианте

max = (a > b) ? a : b;

А как вам, Андрей Викторович, подобное выражение (из добавления элемента в начало двусвязного списка) в чистом Си?

*(first ? &first->prev : &last) = tmp;

Оправдано ли такое сокращение кода или подобное трюкачество лишь запутывает читателя?

parent From Andrey V. Stolyarov profile Tue Jun 10 11:40:16 2025 UTC pencil

userpic

Re: Тернарная операция

См. в третьем томе параграф 10.4.7 "ссылки как семантический феномен".

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

parent From noanon (unverified) Tue Jun 10 17:24:04 2025 UTC pencil

Re: Re: Тернарная операция

Спасибо, до третьего тома пока не дошел, а там как раз тема про lvalue развернута.

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

parent From Andrey V. Stolyarov profile Tue Jun 10 19:02:23 2025 UTC pencil

userpic

Re: Re: Re: Тернарная операция

"Тема про lvalue" развёрнута во втором томе, параграф 4.3.16.

parent From Anonymous (unverified) Fri Jul 18 20:49:01 2025 UTC pencil

Re: Тернарная операция

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

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

parent From Andrey V. Stolyarov profile Fri Jul 18 21:27:00 2025 UTC pencil

userpic

Re: Re: Тернарная операция

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

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

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

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

From Михаил (unverified) Sun Jun 1 19:44:10 2025 UTC pencil

Работа с кучей

Изд. 2,9, т. 2, стр. 78

Андрей Викторович, для функций calloc и realloc вы записываете сигнатуры

void *calloc(int nmemb, int size);

void *realloc(void *ptr, int size);

однако в заголовочных файлах в системе, K&R (второе издание) и интернете в качестве типа второго аргумента указан size_t.

По какой причине вы использовали int? Могу предположить, что size_t был введен в C99, но вроде и long long, про который вы упоминаете в книге, оттуда же? Если причина в этом, то какая между ними разница?

parent From Andrey V. Stolyarov profile Sat Jul 26 12:49:06 2025 UTC pencil

userpic

Re: Работа с кучей

Этот ваш коммент хоть в экспонаты записывай.

Для начала, не знаю как там насчёт "в интернете", но вот в бумажной книге в тексте самой книги честный unsigned int, а size_t появляется только в приложении, каковое явно появилось в качестве компромисса с мудаками из комитета. Но это не так уж важно.

Интереснее другое — вы вот этот вот вопрос какая между ними разница? судя по всему задали на полном серьёзе. И раз так, у меня для вас крайне печальные новости: вы, по-видимому, принципиально неспособны думать.

Во-первых, long long есть часть языка (то, что обязан знать компилятор), тогда как size_t — бессмысленный и никому не нужный typedef, введённый где-то в хидерах. Во-вторых, и это намного важнее, если выкинуть long long, мы потеряем возможность использования 64-битной целочисленной арифметики, что очевидным образом неприемлемо. Выкинув size_t, мы не потеряем ничего, только сэкономим время на объяснениях, а заодно силы обучаемого, которые отнюдь не бесконечны.

Ну и в-третьих: long long введён авторами компиляторов в полном соответствии с традициями языка Си, в котором к тому времени уже были всевозможные unsigned short int или там long double. Все (!) синонимы типов, задаваемые идентификаторами с суффиксом _t, придуманы мудаками из комитетов (где-то ANSI C, где-то POSIX), а традициям Си не то что не соответствуют, а просто-таки напрямую противоречат.

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

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

From Михаил (unverified) Fri May 23 21:30:02 2025 UTC pencil

Еще кой-чего заметил

Том 2, изд. 2,9, стр. 66

Андрей Викторович, ближе к концу страницы вы рекомендуете каждую константу описывать на отдельной строке при явном задании целочисленных значений в enum, но в задачнике, 4.02, описываете их на одной строке. Почему?

Дальше в этом же абзаце вы советуете выравнивать знаки равенства перед константами в enum'ах табуляцими, если они используются в качестве структурных отступов. В общем же случае такое выравнивание будет нарушаться, если изменять длину таба. Не считаете ли вы, что более правильным подходом в данной ситуации будет все остальные выравнивания в строке, после первого непробельного символа, проводить все равно пробелами? Тогда при изменении длины таба код не будет разъезжаться.

Том 2, изд. 2,9, стр. 75

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

> (ну а что ещё можно сделать с результатом разыменования адреса функции, то есть с самой функцией? взятие адреса здесь смысла...

Задачник, 4.28c

Какой смысл в примере, если он совсем не отличается от пункта "a"?

parent From Andrey V. Stolyarov profile Sat Jul 26 11:49:16 2025 UTC pencil

userpic

Re: Еще кой-чего заметил

> Почему?

По кочану.

> Не считаете ли вы

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

> начинается со строчной буквы:

Сами скобки входят составной частью в объемлющее предложение, и это в моём понимании означает, что ни о каких "предложениях" внутри скобок речи идти не может. Если бы там напрашивалась точка, я бы заменил её на точку с запятой; для вопросительного знака такой замены не существует, что никоим образом не отменяет категорической невозможности следующее слово писать с заглавной. Если угодно, считайте это авторской пунктуацией.

> отличается от пункта "a"

Что вообще за бредни, а? Как это не отличается, когда отличается.

From Аркадий (unverified) Tue May 20 18:27:34 2025 UTC pencil

Пропущена цепочка

Том 3. С 22 (обнаружил в издательстве дмк).
Там должно быть len - min + 1 и т.п. Иначе, в массиве: 0, 1, 2, 3, 4 (len = 5) и цепочек из 2 элементов (min = 2). Получается, что матрица имеет строк 5-2=3, а цепочек в таком случае должно быть 4: 01, 12, 23, 34. Не учитывается последняя цепочка.

parent From Andrey V. Stolyarov profile Fri Jul 25 11:19:55 2025 UTC pencil

userpic

Re: Пропущена цепочка

Похоже на правду, спасибо.

From Михаил (unverified) Fri May 16 22:37:32 2025 UTC pencil

Изд. 2,9, задачник, оглавление

Андрей Викторович, а возможно добавить в оглавление задачника также "параграфы", "Закрепление базовых понятий", "Побитовые операции" и так далее, для упрощения навигации?

parent From Andrey V. Stolyarov profile Fri Jul 25 16:52:01 2025 UTC pencil

userpic

Re: Изд. 2,9, задачник, оглавление

Подумаю на эту тему.

From Михаил (unverified) Thu May 15 11:58:36 2025 UTC pencil

Изд. 2,9, задачник, задача 4.17(а)

Андрей Викторович, какой смысл в задаче 4.17 (а), если решение этого пункта, рекурсивное и через цикл, рассмотрено в учебнике (изд. 2,9, т. 2, стр. 49)?

parent From Andrey V. Stolyarov profile Sat Jul 26 11:51:31 2025 UTC pencil

userpic

Re: Изд. 2,9, задачник, задача 4.17(а)

Я что, должен ещё и на оправдания время терять? Мне есть на что потратить время. NB: я эту задачу включил в задачник совершенно намеренно, прекрасно помня, что её решение приведено в тексте учебника. Ни для каких дополнительных комментариев повода не вижу.

From Михаил (unverified) Wed May 14 23:58:21 2025 UTC pencil

Изд. 2,9, Том 2, стр 51

Начало сноски после рекурсивного удаления отрицательных элементов:

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

parent From Andrey V. Stolyarov profile Sat Jul 26 12:05:57 2025 UTC pencil

From Михаил (unverified) Sun May 11 15:27:21 2025 UTC pencil

Изд. 2,9, Том 2, стр 42

Если компилировать sin360.c, приведенную внизу страницы, с указанием какого-либо стандарта (-ansi, -std=c99, ...), то M_PI не будет определен:

gcc -ansi -Wall -Wextra -g -O0 sin360.c -lm

error: ‘M_PI’ undeclared (first use in this function)

Не считаете ли вы, Андрей Викторович, что было бы уместно добавить в текст информацию о том, что M_PI не определена в стандартах (-ansi же вы все-таки котируете?) и, следовательно, в стандартной библиотеке (базово в <math.h>, ибо там различные варианты числа Пи закрыты за директивами условной компиляции)?

parent From Andrey V. Stolyarov profile Sat Jul 26 12:29:54 2025 UTC pencil

userpic

Re: Изд. 2,9, Том 2, стр 42

> с указанием какого-либо стандарта

-- Доктор, мне больно, когда я вот так делаю
-- А вы, больной, вот так не делайте!

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

> -ansi же вы все-таки котируете?

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

Что касается ключика -ansi, то он удобен, чтобы можно было выловить всякие комменты в стиле C++ или там переменные, описанные где попало, но не более того. В частности, я нахожу совершенно возмутительным, что "стандартные" хидеры написаны так, как они написаны (M_PI ещё ладно, а вот когда при этом исчезает snprintf, хочется кого-нибудь убить).

> Не считаете ли вы,

Нет, не считаю. Я считаю ровно одно: на этот ваш коммент мне пришлось потратить время, причём совершенно вхолостую. Если бы не тот факт, что вы в других своих комментах сообщили о паре десятков реальных опечаток, я бы этот просто не раскрыл.

From Михаил (unverified) Sun May 11 10:05:57 2025 UTC pencil

Изд. 2,9, Том 2, стр 38

Две последние строки, не закрыта скобка:

> (каждый из них не обязателен, то есть может присутствовать, а может и отсутствовать:

parent From Andrey V. Stolyarov profile Sat Jul 26 12:19:35 2025 UTC pencil

From Михаил (unverified) Tue May 6 22:55:42 2025 UTC pencil

Задачник, изд. 2,9, стр. 52

Андрей Викторович, похоже ошибка в задаче 4.01 h) инвертировалась:

В условии 15 / 17, следовательно, ответ должен быть 0, но в ответах на странице 156 теперь 1.

P.S. Позвольте поинтересоваться, мой комментарий о невыдаче компилятором предупреждений при работе с неизменяемой областью памяти без спецификатора const был признан бесполезным? Я счел утверждение в учебнике ошибочным, ну или как минимум, требующим уточнения, что в относительно свежем gcc это не так.

parent From Andrey V. Stolyarov profile Sat Jul 26 11:56:42 2025 UTC pencil

userpic

Re: Задачник, изд. 2,9, стр. 52

> похоже ошибка в задаче 4.01 h) инвертировалась:

Факт, благодарю.

> Позвольте поинтересоваться

см. здесь

From Михаил (unverified) Mon May 5 19:28:13 2025 UTC pencil

Том 2, стр 32

Последний абзац в т.2, стр. 32

Код (извините, нормальную разметку с помощью <code> не осилил, и табы режет, и пробелы)

#include <stdio.h>

int string_length(char * str)

{

char * p = str;

for (; *p; p++)

{}

return p - str;

}

int main(void)

{

printf("[%d] %s\n", string_length("Hello, world!"), "Hello, world!");

return 0;

}

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

gcc -v

...

gcc version 12.2.0 (Debian 12.2.0-14)

gcc -Wall -Wextra -ansi -g mystrlen.c

0 предупреждений.

Между прочим, компилятор размещает строковые литераты в неизменяемой памяти, так что если наша функция будет принимать простой параметр типа char*, она не сможет считать длины строк, записанных в двойных кавычках.

./a.out

[13] Hello, world!

Все считает и выдает результат, не ругнувшись.

ЧЯДНТ? Компиляторописатели опять внедряют всякие несуразности.

parent From Andrey V. Stolyarov profile Fri Jul 25 15:04:50 2025 UTC pencil

userpic

Re: Том 2, стр 32

Да, факт, причём — увы — старые компиляторы тоже на эту тему молчат, если их запускать в режиме чистого Си (тогда как в Си++ это вообще ошибка, а не предупреждение). Придётся мне этот абзац в книге переформулировать, пометил его "к доработке".

From - (unverified) Sun May 4 17:16:38 2025 UTC pencil

Разный размер страниц

Здравствуйте! В издании 2.9 учебника размер страницы по высоте отличается от той, что в задачнике. Так и было задумано?

parent From Andrey V. Stolyarov profile Sun May 4 18:14:30 2025 UTC pencil

userpic

Re: Разный размер страниц

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

From anonymous (unverified) Thu May 1 15:59:48 2025 UTC pencil

Том 3, стр. 199

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

parent From Andrey V. Stolyarov profile Thu May 1 16:59:30 2025 UTC pencil

userpic

Re: Том 3, стр. 199

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

(есличо, имеется в виду всякое node.js, и таки да, оно именно на стороне сервера)

From Trodden (unverified) Thu May 1 13:44:40 2025 UTC pencil

Ошибка 1 том

Том 1, страница 178, 17 строка сверху.

Речь идёт о метке "dig7" (15 строка), в тексте указано "fig7"

parent From Andrey V. Stolyarov profile Thu May 1 14:17:53 2025 UTC pencil

userpic

Re: Ошибка 1 том

Факт, спасибо

From алдоважлоывлафо (unverified) Thu May 1 10:48:34 2025 UTC pencil

Функция с побочным эффектом

>progintro_2_9_examples.tgz

Файл "treedemo.pas". Функция с побочным эффектом ещё с того четырёхтомника

parent From Andrey V. Stolyarov profile Thu May 1 11:16:17 2025 UTC pencil

userpic

Re: Функция с побочным эффектом

Да, вы совершенно правы. Понять бы ещё, как мне это удалось, учитывая, что в тексте книги это уже давным-давно процедура.

В общем занёс в TODO.

From Михаил (unverified) Sat Apr 26 16:18:41 2025 UTC pencil

Том 2, стр. 8

В дополнение к предыдущему комментарию (можно слить воедино). Четвертый абзац мелкого текста:

> ; во-вторых. личный авторитет отдельный лиц,

Точка вместо запятой.

parent From Andrey V. Stolyarov profile Sat Apr 26 16:26:58 2025 UTC pencil

userpic

Re: Том 2, стр. 8

Есть такое, благодарю.

parent From Михаил (unverified) Sat May 3 22:39:43 2025 UTC pencil

Re: Re: Том 2, стр. 8

Том 2, стр. 22, последний абзац перед "Составной оператор (блок);...", второе предложение.

"Его используют. например, в качестве ..."

Точка вместо запятой после "используют".

parent From Andrey V. Stolyarov profile Sun May 4 09:02:21 2025 UTC pencil

userpic

Re: Re: Re: Том 2, стр. 8

Есть такое, благодарю.

P.S. Ваш второй комментарий раскрыт не будет, не теряйте времени на подобное. Я принимаю исключительно сообщения о явных и несомненных ошибках.

From Михаил (unverified) Sat Apr 26 15:59:28 2025 UTC pencil

Том 2, стр. 8

Начало второго абзаца:

> его рождение в виде "наколенной поделки" даёт себя знать

Должно быть "даёт о себе знать"?

Третий абзац:

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

Должно быть "избежали"?

parent From Andrey V. Stolyarov profile Sat Apr 26 16:10:26 2025 UTC pencil

userpic

Re: Том 2, стр. 8

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

From ScrollLock (unverified) Mon Apr 21 22:13:19 2025 UTC pencil

Мощности множеств

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

parent From Andrey V. Stolyarov profile Tue Apr 22 15:50:12 2025 UTC pencil

userpic

Re: Мощности множеств

Факт, недочистил это дело. Спасибо.

From sbcf (unverified) Mon Apr 21 18:05:44 2025 UTC pencil

немного занудства касательно названий ПО (т.1, стр.38)

Андрей Викторович, всех благ вам.

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

Поэтому на всякий случай перечислю:

MSWord - понятно, но как-то непривычно, что MS и Word без пробела

Unix-подобных, и в тоже время unix-системами - выглядит непоследовательно с точки зрения большой буквы в названии Unix/unix. А ещё на просторах сети часто встречается сленговое "*nix" - типа избавились от такого вопроса.

Ну и редактор vim - его название у вас совпадает с командой вызова (отличаются только шрифтом). Это не согласуется с другими редакторами в книге (Nano, Joe - который вроде JOE по официальному сайту), и с самим редактором Vim (как он назван в программе и на его сайте).

Ну и "на закуску": Таблица 1.5. Наиболее употребительные команды редактора joe

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

parent From Andrey V. Stolyarov profile Wed Apr 30 18:49:08 2025 UTC pencil

userpic

Re: немного занудства касательно названий ПО (т.1, стр.38)

Ну окей, правда, это всё уже в вышедших томах, так что придётся подождать теперь следующего релиза. А так, похоже, Vim с большой буквы, JOE всеми большими, nano — наоборот всеми маленькими. Ну и MS Word — хрен бы с ним, пусть там будет пробел.

Что до редакторов, то таковых в подготовке книги не участвовало.

Кстати, *nix — это не про большую/маленькую, это про всякие minix и xenix, а заодно и про все остальные. Но вот как раз-таки Unix-like — это "похожие на Unix" (конкретный Unix, имя собственное), а unix-системы — ну, тут словом "unix" обозначен скорее тип систем, т.е. это уже нарицательное. Так что тут, пардон, останусь при своём авторском начертании :)

From RCgoff (unverified) Mon Apr 21 09:41:52 2025 UTC pencil

Триггер

Я электронщик, и меня триггерит то, как в первом томе изображена схема лампового триггера. В издании 2.9 это схема на странице 22 (Рис.1.1). Во-первых, там, где сходятся несколько проводников и между ними есть электрический контакт, должна быть жирная точка. На даном рисунке это все пересечения, кроме центрального перекрестья. Во-вторых, чтобы триггер действительно переключался, чтобы лампы запирались, потенциал сетки должен быть ниже потенциала катода. Поэтому либо катод должен быть заземлен, а два резистора и выключатель должны быть подключены к отрицательному напряжению, либо в цепи катодов должны стоять сопротивления смещения.

См. Книгу Бонч-Бруевич М.А. "Применение электронных ламп в экспериментальной физике", 3-е изд, 1955. Рис. 4.70 и 4.72.

parent From Andrey V. Stolyarov profile Mon Apr 21 10:32:35 2025 UTC pencil

userpic

Re: Триггер

Так-с, ну допустим.

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

Это не проблема.

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

Поскольку я не электронщик, всё это описание мне ничем не поможет.

> См. Книгу Бонч-Бруевич М.А

Где я её возьму, пардон?

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

parent From RCgoff (unverified) Mon Apr 21 13:42:15 2025 UTC pencil

Re: Re: Триггер

>Где я её возьму, пардон?

https://publ.lib.ru/ARCHIVES/B/BONCH-BRUEVICH_Aleksey_Mihaylovich_(fizik)/_Bonch-Bruevich_A.M..html

parent From Andrey V. Stolyarov profile Mon Apr 21 14:17:16 2025 UTC pencil

userpic

Re: Re: Re: Триггер

Скачал, посмотрел. Ну, рисунок 4.72 вообще непонятен как целое, т.е., возможно, электронщикам там что-то и понятно, мне — нет, и целевой аудитории моей книги, соответственно, тоже нет. Что касается рис. 4.70, то там "земля" и "минус" представляют собой разные сущности, я, честно говоря, такого до сей поры нигде и никогда не видел. Выключателей там нет, в тексте упоминается "внешнее воздействие", но не говорится, как конкретно его осуществить.

Что со всем этим делать — не вполне понятно. Я подумаю, не убрать ли этот рисунок из книги вообще. Исправить его на основании той информации, которую вы мне предоставили, я возможности не вижу.

parent From RCgoff (unverified) Mon Apr 21 14:38:24 2025 UTC pencil

Re: Re: Re: Re: Триггер

На рис 4.70 земля - это провод с напряжением 0в, а минус - с отрицательным (к примеру, -10в). Напряжение можно отсчитывать от разных точек. В этом смысле "земля" играет роль начала отсчета. Нуля. Выключатели должны быть помещены параллельно резисторам R2, как и на Вашей схеме в книге

parent From Andrey V. Stolyarov profile Mon Apr 21 14:40:15 2025 UTC pencil

userpic

Re: Триггер

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

parent From RCgoff (unverified) Wed Apr 23 09:41:20 2025 UTC pencil

Re: Re: Re: Re: Триггер

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

Если эта реплика относилась не к схеме триггера, а в целом к электронике, то, наверное, два самых близких электронщику примера - это уровни сигналов в интерфейсе RS232 и номенклатура питающих напряжений на разъеме ATX блока питания компьютера.

На разъеме блока питания среди прочих есть и земля, и минус 12 вольт, и это разные сущности.

В интерфейсе RS232 логический 1 это минус 12в, а логический 0 это плюс 12в. Но в числе линий интерфейса есть и земля с напряжением 0в. И на электрическую схему преобразования уровней сигналов в уровни RS232 от источника должно приходить три линии питания: +12, земля/общий и -12в.

parent From Andrey V. Stolyarov profile Fri Apr 25 08:51:53 2025 UTC pencil

userpic

Re: Триггер

Про rs232 я мог бы и сам вспомнить, старый становлюсь, видимо. Остальное для меня новость.

parent From RCgoff (unverified) Mon Apr 21 13:51:43 2025 UTC pencil

Re: Re: Триггер

>Это не проблема.

Это проблема, т.к. в текщем варианте у вас на схеме не различаются ситуации "пересечение проводов без электрического контакта между ними" и "пересечение проводов с контактом между ними, т.е. соединение проводов"

parent From Andrey V. Stolyarov profile Mon Apr 21 13:55:05 2025 UTC pencil

userpic

Re: Re: Re: Триггер

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

parent From Andrey V. Stolyarov profile Thu Jul 24 23:08:12 2025 UTC pencil

userpic

Так сойдёт?

new scheme

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

И я правильно понимаю, что потенциал ниже катода на сетке нужен только для запирания, а потом лампа так и останется закрытой, несмотря на то, что напряжение, приходящее на её сетку через вторую (открытую) лампу, никак не может быть ниже напряжения на катодах?

From RandomName (unverified) Sat Apr 19 17:31:44 2025 UTC pencil

Рыба с обложки

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

parent From Andrey V. Stolyarov profile Sat Apr 19 17:54:38 2025 UTC pencil

userpic

Re: Рыба с обложки

Вот уж как раз рыба-то, которая мало того что с крылышками, так ещё и с лапами — к программированию имеет отношение самое прямое.

From ScrollLock (unverified) Sat Apr 19 17:18:20 2025 UTC pencil

Утверждения о качестве rand

Здравствуйте!

На стр. 80 второго тома утверждается, что "в целом псевдослучайные числа имеют распределение, достаточно близкое к равномерному". Но для реализации функции rand из glibc наблюдаются довольно грубые отклонения от равномерности, делающие её совершенно непригодной не только для паролей, но и для научных и инженерных расчётов. Её старшие биты проваливают gap test из TAOCP2 с почти вековой историей. Если отслеживать интервалы (число членов последовательности) между псевдослучайными числами, старшие 10 бит которых равны 0, то картина получается очень далёкой от теоретической. Это очень легко воспроизвести с помощью вот такой короткой программы на ANSI C. Она строит гистограмму длин интервалов, рассчитывает статистику из критерия Пирсона и переводит её в нормально распределённую величину z (mu=0, sigma=1). Она очень упрощена, совсем не блещет стилем, не совсем точно обрабатывает некоторые граничные случаи, а нужный ГПСЧ выбирается редактированием строки. И на совсем уж ужасных генераторах программа может зависнуть. Но сравнить rand() и /dev/urandom с её помощью можно. Написано для 32-битного int и 31 или 32-битного выхода rand().

#include < stdio.h >
#include < stdlib.h >
#include < time.h >
#include < math.h >

#define BUFSIZE 1024

unsigned int rand_good(FILE *fp)
{
    static unsigned int buf[BUFSIZE], pos = BUFSIZE;
    if (pos >= BUFSIZE) {
        fread(buf, sizeof(unsigned int), BUFSIZE, fp);
        pos = 0;
    }
    return buf[pos++];
}

/* 10.1073/pnas.17.12.684 */
double chi2_to_stdnorm(double x, double f)
{
    double s2 = 2.0 / (9.0 * f);
    double mu = 1.0 - s2;
    return (pow(x/f, 1.0/3.0) - mu) / sqrt(s2);
}

void process_freq(const int *o, int maxlen, int ngaps, double p)
{
    double e_i = (double) ngaps * p;
    double chi2_emp = 0.0, df = maxlen - 1.0;
    int i;
    for (i = 0; i < maxlen; i++) {
        chi2_emp += pow(o[i] - e_i, 2.0) / e_i;
        e_i *= (1.0 - p);
    }
    printf("chi2emp = %g; df = %g\n", chi2_emp, df);
    printf("z = %g\n", chi2_to_stdnorm(chi2_emp, df));
}

int main()
{
    int maxlen = 5000, ngaps = 5000000, i, gaplen = 0;
    double p = 1.0 / 1024.0;
    time_t tic, toc;
    int *o = calloc(maxlen + 1, sizeof(int));
    FILE *fp = fopen("/dev/urandom", "rb");
    if (fp == NULL) {
        printf("Cannot open /dev/urandom\n");
        return 1;
    }
    tic = time(NULL);
    srand(tic);
    for (i = 0; i < ngaps; i++) {
        if (i % 1000 == 0)
            printf("%.1f %% completed\r", 100.0 * i / ngaps);
        do {
            unsigned int x = /*rand();*/rand_good(fp);
            if (((x >> (31 - 10)) & 0x3FF) == 0) {
                o[(gaplen <= maxlen) ? gaplen : maxlen]++;
                gaplen = 0;
            } else {
                gaplen++;
            }
        } while (gaplen != 0);
    }
    toc = time(NULL);
    printf("\nTime elapsed: %u sec\n", (unsigned int) (toc - tic));
    process_freq(o, maxlen, ngaps, p);
    fclose(fp);
    free(o);
    return 0;
}

Результаты выполнения программы на Lubuntu 22.04.5 LTS:

rand():
100.0 % completed
Time elapsed: 70 sec
chi2emp = 6084.94; df = 4999
z = 10.1638

/dev/urandom:
Time elapsed: 53 sec
chi2emp = 4899.76; df = 4999
z = -0.99245

Видно, что rand() тест не проходит, а /dev/urandom - проходит. Более того, /dev/urandom оказался БЫСТРЕЕ rand(), т.к. внутри rand() есть мьютексы. Правда, в методе Монте-Карло /dev/urandom использовать нельзя, т.к. он невоспроизводим. Также очень грубые отклонения от равномерности для функции rand из glibc можно выявить тестами вроде одномерного Birthday Spacings, а также BCFN из PractRand. Первый из них вообще можно чуть ли не на IBM PC XT реализовать. В musl генератор другой и gap test проходит, но для его "разоблачения" оказывается снова достаточно IBM PC XT и другого теста.

Также ссылка [2] ведёт на второе издание книги Numerical Recipes, ГПСЧ из которого столь же ужасны, как и в функции rand(). Есть более новое третье издание, в котором один из рекомендованных генераторов оказался пригоден в качестве генератора общего назначения (и нет, это не RC4).

parent From Andrey V. Stolyarov profile Sat Apr 19 17:26:44 2025 UTC pencil

userpic

Re: Утверждения о качестве rand

Честно говоря, во всём этом мне интересным кажется только расплата за мьютексы.

parent From ScrollLock (unverified) Sat Apr 19 20:32:17 2025 UTC pencil

Re: Re: Утверждения о качестве rand

Да тут вообще всё феерично. Производительность rand с мьютексами получается около 8 cpb (тактов на байт). Аналогичный генератор без мьютексов, но сляпанный "на скорую руку" - меньше 1 cpb. Зачем они там - не ясно, потокобезопасность от rand вроде бы не требуется, а для параллельных вычислений никакие мьютексы в ГПСЧ никто в здравом уме использовать не будет.

Нормальные ГПСЧ на той же машине с поддержкой AVX2: AES128-CTR аппаратный: 2 cpb, AES128-CTR программный - 7-8 cpb. ChaCha12 - 1 cpb, LEA128-CTR - 1.4 cpb, Threefish256-CTR - 2.2 cpb. Они же прекрасно подходят для параллельных вычислений, т.к. каждому процессу/потоку дают диапазон номеров членов последовательности - и всё. "Хакерские" (от слова bithack) генераторы приемлемого качества: xoroshiro128++ - 0.20 cpb, pcg64_xsl_rr - 0.35 cpb, SFC64 - 0.15-0.20 cpb, mlfib - 0.55 cpb, Philox - 1 cpb.

Т.е. из-за мьютексов скорость работы функции rand() стала существенно медленнее некоторых блочных шифров, и это при очень низком качестве. А ведь шифры мы заменяем на всякие хакерские трюки (иногда даже времён ENIAC) именно ради скорости и простоты.

From Robert (unverified) Sat Apr 19 14:16:01 2025 UTC pencil

Предположительно ошибка

Том 1, стр. 191, конец 2-го абзаца параграфа 3.3.6. Написано:

Так, если в стек занести три четырёхбайтных параметра, а потом вызвать процедуру, то адрес возврата будет лежать в памяти по адресу [esp], ну а параметры, очевидно, окажутся доступны по адресам [esp+4], [esp+8] и [esp+12]. Если же разместить в стеке локальные четырёхбайтные переменные, то они окажутся доступны по адресам [esp-4], [esp-8] и т. д.

Имеется ли в виду во втором предложении изначальное (сразу после вызова подпрограммы) значение ESP? Если нет, то здесь ошибка, ведь если поместить в стек локальные четырёхбайтные перменные, то значение ESP изменится и эти переменные будут доступны по адресам [esp], [esp+4] и т. д.

parent From Andrey V. Stolyarov profile Sat Apr 19 17:11:37 2025 UTC pencil

userpic

Re: Предположительно ошибка

> Имеется ли в виду во втором предложении изначальное (сразу после вызова подпрограммы) значение ESP?

Естественно. Из контекста это очевидно, не?

From Egor (unverified) Mon Apr 14 08:53:20 2025 UTC pencil

Синтаксические ошибки в примере

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

while first <> nil then

и

if first^.data < 0 do.

А остаток примера убежал на другую страницу.

parent From Andrey V. Stolyarov profile Mon Apr 14 10:18:28 2025 UTC pencil

userpic

Re: Синтаксические ошибки в примере

Ага, ну вот и начались ошибки, внесённые при подготовке версии 2.9. Спасибо, вы совершенно правы.

> убежал на другую страницу.

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

From anon (unverified) Sun Apr 13 21:33:34 2025 UTC pencil

Том 2, стр. 84, п. 4.11.3, строка 12

На FreeBSD указанная команда man attr к желаемому результату не приводит, вместо неё нужная страница ищется через man curs_attr.

parent From Andrey V. Stolyarov profile Mon Apr 14 10:01:49 2025 UTC pencil

userpic

Re: Том 2, стр. 84, п. 4.11.3, строка 12

И что? Учесть все подобные нюансы невозможно.

From Robert (unverified) Mon Mar 31 08:38:55 2025 UTC pencil

Предположительно ошибка

На стр. 189 в первом предложении параграфа 3.3.1 написано:

Как мы уже знаем, под стеком в программировании подразумевают структуру данных

Ранее в книге (стр. 134, параграф 2.10.5) было объяснено, что называть стек (а также очередь) структурой данных - некорректно.

parent From Andrey V. Stolyarov profile Mon Mar 31 08:46:57 2025 UTC pencil

userpic

Re: Предположительно ошибка

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

From Иван aka technocrat (unverified) Thu Mar 6 12:28:30 2025 UTC pencil

offtop

Андрей Викторович, здравствуйте!

Несколько минут назад узнал о выходе электронного издания книги и хочу сказать, что Вы глыба!

Простите меня, если метафора Вам не понравится.

Я 74-го года рождения, программирование для меня некоторая страсть, но профессионально я не смог сделать это своим занятием, кривая жизни увела в сторону.

It doesn't matter.

Это не Ваша проблема.

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

Будьте здоровы и успехов Вам во всём!

P.S.

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

Тот комментарий Вы, скорее всего "похоронили" и это хорошо.

parent From Andrey V. Stolyarov profile Thu Mar 6 13:52:05 2025 UTC pencil

userpic

Re: offtop

Вот смотрю на это и не знаю, как реагировать. Какое "тогда", какое ещё "сегодня"? Если я только понимаю, про какой исторический период идёт речь, господствовал тогда омерзительный MSDOS, нормальные операционки на обычных компах только-только появлялись, публика про них и не знала толком. Ну, возможно, в те времена не было долбаной вебни, но было бы крайне странно думать, что сейчас кроме вебни нет вообще ничего.

parent From diesi (unverified) Sun Mar 9 02:50:08 2025 UTC pencil

Re: Re: offtop

Интересный момент: даже сама M$ не рассматривала DOS как что-то, что придёт надолго, они рассчитывали, что эта убогая хрень побудит людей покупать Unix-подобную Xenix, которую нельзя было поставить на PC с завода из-за разногласий между IBM (делавшей PC) и AT&T (которой принадлежали права на Unix). И успешно с этим продолбались, понятное дело. А всё почему? А потому что нехрен прибивать ОС к железу гвоздями -- DOS шёл на любом PC любого производителя as is, а Xenix каждый производитель должен был адаптировать к каждой своей модели PC, и разумеется, самой IBM эта процедура вообще была недоступна.

parent From Andrey V. Stolyarov profile Sun Mar 9 08:43:58 2025 UTC pencil

userpic

Re: offtop

Это конфликтует с моим пониманием истории. До сей поры мне встречалась только такая версия, что Билл Гейтс для MSDOS придумал модель per copy, т.е. вместо того, чтобы лицензировать её IBM за какую-то единовременную сумму, он потребовал, если не ошибаюсь, два бакса за каждый устанавливаемый экземпляр, и с этого началась копирастическая "революция" (ну или революция без кавычек, но в самом поганом смысле слова) в области софта. Упоминание Xenix в окрестностях этой истории я вижу впервые, да и при чём тут MS, на Xenix'е деньги бы зарабатывали не они.

parent From diesi (unverified) Sun Mar 9 10:57:54 2025 UTC pencil

Re: Re: offtop

Это верно, но не противоречит тому, что юзеру за его же деньги предоставляют в составе компа "троянского коня", который призван побудить его открыть кошелёк ещё раз, и на этот раз пошире, чтобы получить софт получше. Xenix лицензировалась точно так же, per copy (это для неё придумали изначально, ещё до дел с IBM), но значительно дороже, с отдельным вариантом для многопользовательских машин и без возможности купить копию у самой M$. Современная стратегия продаж винды это что-то среднее между таковыми для DOS и для Xenix.

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

parent From Недопредпенс (unverified) Fri Apr 11 14:26:48 2025 UTC pencil

offtop

DOS шёл на любом PC любого производителя as is

Если производитель написал для своего PC процедуры ввода и вывода на CON:, чтения и записи секторов дискеты, собрал BIOS (IO.SYS) https://raw.githubusercontent.com/microsoft/MS-DOS/refs/heads/main/v1.25/source/IO.ASM прилагаемым ассемблером и позаботился о процедуре IPL.

parent From diesi (unverified) Tue Apr 15 16:05:58 2025 UTC pencil

Re: offtop

Под PC здесь имелся в виду не абы какой персональный компьютер, а IBM PC-совместимый персональный компьютер, уже достаточно давно под PC имеют в виду именно это. Без указанных вами особенностей совместимым компьютер бы не был.

parent From Недопредпенс (unverified) Fri May 30 19:57:35 2025 UTC pencil

XENIX offtop

IBM PC-совместимый персональный компьютер несовместим без IBM PC-совместимого BIOS'а.

Да и кому нужен IBM PC-совместимый, если есть несовместимые, которые лучше, а не хуже?

200293871.jpg

В документе intel есть листинг драйвера для XENIX на интеловском одноплатнике:

XENIX Device Driver Guide

История изменений начинается с 1981 года. Кому (из разработчиков оборудования) нужен был XENIX на x86, у того он был. IBM XENIX понадобился к 1984 году, и не для исходного IBM PC.

parent From Недопредпенс (unverified) Sat Apr 12 08:29:43 2025 UTC pencil

Re: offtop

Unix-подобную Xenix, которую нельзя было поставить на PC с завода из-за разногласий между IBM (делавшей PC) и AT&T (которой принадлежали права на Unix)

Gary Kildall:

The problem is that micros haven't had the power to support it. They haven't had the large amount of main memory, the hard disk, the fast processor and so forth.

UNIX1985. Computer Chronicles

У IBM в первой половине 1980-х были машинки с XENIX на мотороловских 68k с 32-разрядной архитектурой. И не только у IBM

parent From diesi (unverified) Tue Apr 15 16:28:58 2025 UTC pencil

Re: Re: offtop

Судя по тексту, Килдалл говорил о персоналках прошедшей эпохи, когда UNIX уже был, но никто и не думал ставить его на персоналки, то есть, про 1970-е годы, примерно времена процессора Intel 8080. На самом первом IBM PC с Intel 8088 Xenix ещё как работал. А писался он вообще для 18-разрядного PDP-7, у которого даже процессора не было, и памяти от десятка до сотни килобайт.

Мало ли, что там у IBM было, у них и сейчас много всякого есть интересного. На PC-то этого не было.

parent From Andrey V. Stolyarov profile Tue Apr 15 19:22:45 2025 UTC pencil

userpic

Re: Re: Re: offtop

> Xenix ещё как работал. А писался он вообще для 18-разрядного PDP-7

Кто, пардон, для PDP-7 писался? Xenix? Что-то сдаётся мне, к моменту появления Xenix если где ещё и были живые PDP-7, то разве что в музеях.

parent From diesi (unverified) Wed Apr 16 03:27:55 2025 UTC pencil

Re: Re: Re: Re: offtop

Возможно, что-то я напутал, и не для PDP-7, а для PDP-11. Но на 11 она работала уже совершенно точно.

parent From Andrey V. Stolyarov profile Wed Apr 16 14:31:56 2025 UTC pencil

userpic

Re: offtop

На PDP-7 Томпсон развлекался со своими игрушками, и типа "заодно операционку написал". Она к тому времени (начало семидесятых) была уже безнадёжно морально устаревшей, зато на конкретный экземпляр никто, кроме Томпсона, не претендовал. Ну, типа, тот самый первый Unix, который ещё Unics.

В PDP-11 верю, почему нет. Её и наштамповали экземпляров примерно в 5000 (прописью: пять тысяч) раз больше, и изрядно позднее сделали, и клонов у неё было — когда я на бейсике БК0010 свой стартрек писал, не подозревал, что эта штуковина у меня на столе где-то в глубине души таки тоже PDP11.

parent From Uff (unverified) Sat May 31 13:52:00 2025 UTC pencil

off

На самом первом IBM PC с Intel 8088 Xenix ещё как работал

На машине с 16-64 KB на системной плате и с одним-двумя односторонними дисководами на 160 KB (+ бытовая магнитофонная кассета на полмегабайта)? Как он там работал, когда и зачем?

From Саша (unverified) Mon Mar 3 18:39:24 2025 UTC pencil

Содержание

В новом издании «Содержание» подписано как (второе) «Оглавление». Интересно, как так вышло.

parent From Andrey V. Stolyarov profile Sat Mar 29 19:03:15 2025 UTC pencil

userpic

Re: Содержание

Очень просто вышло, закомментарил лишнего. Спасибо за сообщение.

From NorD (unverified) Mon Feb 17 08:00:08 2025 UTC pencil

Процедуры reset/rewrite

Здравствуйте, Андрей Викторович! Объясните, пожалуйста, следующий момент в Вашей книге: В 2.9.3 "Типизированные файлы" 1-го тома указано, что для режима "только запись" нужно в переменную filemode внести значение 1 и использовать процедуру reset. При этом выше по тексту книги написано, что переменная filemode влияет на процедуру reset, но не влияет на процедуру rewrite. Далее в главе 2.9.4 "Блочный ввод-вывод" в коде примера block_cp.pas перед открытием файла dest на запись мы заносим в переменную filemode 1 и используем процедуру rewrite, хотя это противоречит ранее изложенному. Правильно я понимаю, что в данном случае всё-таки должна применяться процедура reset? P.S. Спасибо Вам за книги и удачи в Ваших начинаниях.

parent From Andrey V. Stolyarov profile Mon Feb 17 09:29:31 2025 UTC pencil

userpic

Re: Процедуры reset/rewrite

Нет, там по смыслу нужна именно rewrite, а вот заносить какое-то значение в filemode перед её вызовом не нужно. Это должно было исчезнуть из примера при подготовке второго издания, но, как видим, не исчезло.

From G (unverified) Fri Feb 7 10:36:53 2025 UTC pencil

Файлы

А где файлы с примерами?

parent From Andrey V. Stolyarov profile Fri Feb 7 10:45:24 2025 UTC pencil

userpic

Re: Файлы

Законный вопрос.

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

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

parent From noanon (unverified) Fri Feb 14 11:32:31 2025 UTC pencil

Re: Re: Файлы

Редактирование в плане исправление опечаток и ошибок или какие-то примеры были основательно переработаны для большей наглядности?

parent From Andrey V. Stolyarov profile Fri Feb 14 16:09:16 2025 UTC pencil

userpic

Re: Re: Re: Файлы

В примерах конкретно к первому тому самое заметное изменение — в полноэкранных программах коды кнопок раньше (увы мне) присутствовали в виде чисел прямо в коде. Сейчас они вынесены в именованные константы.

В примерах к остальным двум томам, возможно, будут более серьёзные изменения; в частности, я планирую избавиться от идиотского (комитетского) sig_atomic_t.

From Руслан (unverified) Tue Jan 28 21:12:52 2025 UTC pencil

Задачник

Андрей Викторович, подскажите, задачник для второго издания учебника применим к новому изданию?

parent From Andrey V. Stolyarov profile Tue Jan 28 22:03:33 2025 UTC pencil

userpic

Re: Задачник

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

From a (unverified) Mon Jan 27 10:59:37 2025 UTC pencil

Errata

В издании 2.9 в 1 томе на странице 36 есть сноска номер 21. В ней слово "ps" должно быть напечатано другим шрифтом.

parent From Andrey V. Stolyarov profile Sat Mar 29 19:06:55 2025 UTC pencil

userpic

Re: Errata

Есть такое, благодарю

From Алексей Л. (unverified) Mon Jan 27 07:20:54 2025 UTC pencil

Печать издания 2.9

Издание 2.9 очень сложно распечатать, т.к. там что-то не то с размерами страниц :(

From Anonymous (unverified) Sat Jan 25 02:30:44 2025 UTC pencil

Том 1, стр 44

Я вас надеюсь не сильно заспамил комментариями? Комментарии/ошибки/неточности лучше в одном комменте или отдельно?

> При выполнении заданий практикума

Видно, что скопировано из методички без редактирования. Можно конечно так и оставить, но немного некрасиво.

Кстати и часть про логин в линуксе через putty или иксы где-то раньше тоже мне показалась странной, но я только сейчас осознал, что она тоже скопирована из какой-то методички без изменений. Там речь идёт о дисплейном классе, а в книге вроде как предполагается самостоятельно установленный линукс.

Ну и до кучи, echo "" "$3" "$2" "$1" можно было бы заменить на printf, чтобы избежать неаккуратного пробела, но я думаю то за ошибку не считается, так что я не стал писать сразу.

$ foo() { printf "%s\n" "$3 $2 $1"; }
$ foo 1 2 -3
-3 2 1

parent From Andrey V. Stolyarov profile Sat Mar 29 19:50:31 2025 UTC pencil

userpic

Re: Том 1, стр 44

> Комментарии/ошибки/неточности лучше в одном комменте или отдельно?

Лучше отдельно. Далеко не всегда есть достаточно времени, чтобы обработать целиком поступившую простыню.

> Видно, что скопировано из методички без редактирования.

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

> можно было бы заменить на printf

Простите, вы что, издеваетесь? Посмотрите внимательно на окрестности этого фрагмента и прикиньте, как будет выглядеть, если туда впендюрить ещё и рассказ про printf(1) (особенно учитывая, что текст ориентирован на людей, не имеющих никакого представления о Си).

From Anonymous (unverified) Fri Jan 24 22:02:21 2025 UTC pencil

Том 1, стр 38

VI — это шесть римскими цифрами, а редактор таки vi

parent From Andrey V. Stolyarov profile Sat Mar 29 19:42:57 2025 UTC pencil

userpic

Re: Том 1, стр 38

Согласен, спасибо.

From Anonymous (unverified) Thu Jan 23 01:22:16 2025 UTC pencil

Том 1, стр 27

> flash-брелке

По идее правильно будет с буквой о, flash-брелоке. Я тоже удивился, что оно так склоняется, но вот так.

parent From diesi (unverified) Sun Feb 9 16:42:53 2025 UTC pencil

Re: Том 1, стр 27

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

From anon (unverified) Tue Jan 21 19:22:48 2025 UTC pencil

Изменения в издании 2.9

Извините, а какие есть ключевые изменения в новом издании?

parent From Andrey V. Stolyarov profile Tue Jan 21 20:27:02 2025 UTC pencil

userpic

Re: Изменения в издании 2.9

"Ключевых" нет. В основном исправлены ошибки из эрраты. Из нового — доработаны некоторые параграфы про оформление кода, особенно 2.12.9 и 2.12.10. Ну и ещё много где есть по одному-два абзаца, всего не вспомнить.

parent From anon (unverified) Wed Jan 22 08:36:28 2025 UTC pencil

From Anonymous (unverified) Fri Jan 17 04:56:40 2025 UTC pencil

Стр 23, том 1

"без малого полвека" — уже не "без малого", а чуток больше полвека. Декабрь 1974 — появление Альтаира 8800, то есть ровно полвека - декабрь 2024.

parent From Недопредпенс (unverified) Sat Jan 18 05:24:13 2025 UTC pencil

Полвека ПК

Альтаир 8800 - ещё не привычный прибор, а нечто среднее между игрушечным однобитным Kenbak'ом и настольными миниЭВМ (в том числе и для "персонального", хоть и не домашнего, использования), которыми в 1970 уже никого не удивишь.

Изобретатель Kenbak'а со своим изобретением

Конечно, Альтаир запустил микрокомпьютерный хайп, который привёл в том числе и к взлёту бизнеса трёх корпораций на буквы A, D и М появлению ПК в привычном виде.

parent From Anonymous (unverified) Sat Jan 18 23:24:18 2025 UTC pencil

Re: Полвека ПК

Альтаир уже вполне себе ПК. Я довольно долго ковырялся на эмуляторе с ним. Хотя IMSAI 8080 пожалуй лучше.

parent From Недопредпенс (unverified) Fri May 2 12:37:14 2025 UTC pencil

Re: Полвека ПК

довольно долго ковырялся на эмуляторе с ним

Ковыряние с самим "Алтаиром" и ковыряние с симулятором "Альтаира" на линуксе, как Вы понимаете, это два существенно разных ковыряния.

From Anonymous (unverified) Thu Jan 16 16:57:24 2025 UTC pencil

Адресная арифметика в паскале

На странице 14 написано "за исключением разве что адресной арифметики" в отношении паскаля, но в гостевой книге есть примеры с таковой на паскале.

Интересно, адресная арифметика появилась только в Free Pascal или в TP и Delphi уже была?

parent From Andrey V. Stolyarov profile Thu Jan 16 17:05:40 2025 UTC pencil

userpic

Re: Адресная арифметика в паскале

Насколько я помню, в TP 7.0 честной адресной арифметики ещё не было, хотя, например, динамические массивы, от которых сишностью пасёт на километр, были уже в 5.0.

Так или иначе, на том этапе обучения, на который рассчитана паскалевская часть книги, адресная арифметика скорее вредоносна. Придумать такие задачи, которые невозможно было бы решить без списков, при этом имея динамические массивы (хоть в каком их варианте), и при этом достаточно простые для начинающих, лично я не возьмусь; следовательно, если обучаемому дать доступ хоть к адресной арифметике "по-честному", хоть к тем динамическим массивам, которые тянутся ещё с TP 5.0, если не раньше — то всё, нормально работать с указателями он никогда уже не научится.

parent From Anonymous (unverified) Thu Jan 16 21:36:14 2025 UTC pencil

Re: Re: Адресная арифметика в паскале

Проблема с динамическим массивом понятна - если массив может ресайзить сама RTL, то нет особой мотивации изучать, как это делать вручную, но с адресной арифметикой в чём проблема?

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

parent From Andrey V. Stolyarov profile Thu Jan 16 22:18:00 2025 UTC pencil

userpic

Re: Re: Re: Адресная арифметика в паскале

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

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

parent From Turbo (unverified) Thu Jan 23 12:47:29 2025 UTC pencil

Re: Адресная арифметика в паскале

Адресная арифметика с PChar появилась в TP/BP7 и TPW вместе с PChar, если мне не изменяет память.

Борландовский странноватый пример к StrEnd():

function StrEnd(Str: PChar): PChar;

uses Strings;
var
S: array[O .. 79] of Char;
begin
Readln(S);
Writeln('String length is', StrEnd(S) - S);
end.

TP7.0 Programmer's Reference (9.9M)

parent From Andrey V. Stolyarov profile Thu Jan 23 12:52:36 2025 UTC pencil

userpic

Re: Адресная арифметика в паскале

Тут да, я вполне могу ошибаться. Дело в том, что я TP осваивал на версии 5.5, активно писал (за деньги) на 6.0, "семёрка" у меня была, но я, скорее всего, не использовал от неё новые возможности, поскольку к моменту её появления (в смысле у меня, а не вообще в природе) все мои проекты на Паскале уже существовали, новых я не начинал. Поэтому если там что-то такое появилось, я мог просто не обратить внимания.

parent From Недопредпенс (unverified) Sat Jan 25 11:41:48 2025 UTC pencil

Re: Re: Адресная арифметика в паскале

Между 6.0 и 7.0 вышел такой "новый" продукт под названием Turbo Pascal for Windows 1.0(и 1.5)

В нём, похоже, и появилось это расширение для удобства прямого вызова функций 16-разрядного WinAPI. Вместе с фирменным борландовским стилем кнопочек, которые рисовала BWCC.DLL

Turbo Pascal for Windows. Version 1.5

From Anonymous (unverified) Wed Jan 15 13:52:47 2025 UTC pencil

Второе издание, которое вы держите в руках

На странице 17 в параграфе "Структура книги и используемые обозначения" во втором абзаце написано: "Второе издание, которые вы держите в руках...", хотя речь идёт про электронное издание 2.9.

From Anonymous (unverified) Wed Jan 15 11:49:08 2025 UTC pencil

Аннотация

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

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

parent From Andrey V. Stolyarov profile Wed Jan 15 12:07:16 2025 UTC pencil

userpic

Re: Аннотация

Есть такое, да. Чуть позже заведу страничку для эрраты.


pencil

пояснение


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

Если вы искали сайт замечательного писателя-фантаста Андрея Михайловича Столярова, то вам, к сожалению, не сюда.

Андрей Михайлович Столяров в библиотеке Мошкова

Авторские права © Андрей Викт. Столяров, 2009 — 2025