Комментарии 56
Я также хотел бы найти баг в первом томе «Фундаментальные алгоритмы». Может, и нашёл бы, но в местной библиотеке по какой-то причине имеются только тома 2, 3 и 4A.ИМХО автору нужно купить у Кнута 1й том в электронном виде за свои шестнадцатеричные доллары ;)
Даже если все ошибки будут исправлены, особой пользы от этого не будет. Это примерно как при выявлении некоторых ошибок в коде статическим анализатором, по факту потом оказывается, что этот кусок кода в рантайме вообще никогда не вызывается.
потом оказывается, что этот кусок кода в рантайме вообще никогда не вызывается.Что само по себе ИМХО уже является ошибкой («мертвый код») ;)
Код может не вызываться в runtime по разным причинам. Например, это может быть обработка исключительной ситуации, которая не происходит, но может произойти. Для анализатора это не «мертвый код».
этот кусок кода в рантайме вообще никогда не вызывается.
:)))
Пример 1:
read (n);
if n<>0 then
x:=y/n
else
write ('Error: invalid input');
Пример 2:
n := 3.14314;
if n<>0 then
x:=y/n
else
write ('Error: invalid input');
В примере 1 при внимательном пользователе код write ('Error: invalid input') не вызывается, но м.б. вызван, если пользователь промажет по клавише или нарочно введет ноль. В примере 2 код write ('Error: invalid input') не м.б. вызван.
Поэтому он мертвый и должен быть удален:
n := 3.14314;
x:=y/n
#define true false
Видимо, тоже военными придуман ;D
Оператор <> (!=) вполне себе может быть переопределёнВ стандартном Паскале, на котором пример, не может)
Позвольте не согласиться. Тут важен контекст.
Кнут, судя по текстам и интервью, перфекционист и дотошный зануда (это не оскорбление, а комплимент), причем с высокой самооценкой с определённым высокомерным снобизмом (оправданно). При всём перфекционизме он умудрился написать 4,5 тома, причем по полноте охвата темы аналогов нет. В качестве учебного пособия я могу этот четырёхтомник сравнить только с монументальным Ландау-Лившицем, но он не настолько пропитан занудством и перфекционизмом. Кнут, понимая, что он перфекционист и дотошный зануда пишет труд, который заведомо его переживёт. Несмотря на как бы "стремительное развитие" CS, он выделил тот слой, который будет устаревать очень-очень долго.
Предложение о поиске опечаток, мне кажется, несёт 3 идеи:
- Обещание, что ошибок немного.
- Шлифовка текста до состояния "оставить потомкам". Здесь есть добрая доля здорового тщеславия, но если капелька тщеславия помогла написать "Искусство программирования", то это оправданная цена.
- Ещё тема про опечатки — она не совсем про деньги, и, даже, возможно, не совсем про ошибки. Понимая, что книга не простая для чтения, но требует внимательного чтения Д. Кнут добавил элемент геймификации — ачивку за внимательность.
Из этой статьи (автору спасибо), я узнал, что Дональд Кнут написал 4,5 тома.
Я всегда, называл сей труд «трехтомник Кнута», и у меня на полке 3 тома стоят :)
И, да, когда я его первый раз читал, то он тоже был трёхтомник, а в книге «Язык программирования C++» Страуструпа шаблоны еще считались свежей фичей («Однако, шаблоны типа и обработка особых ситуаций относятся к самым последним расширениям языка, и возможно, что ваш транслятор их не содержит.»)
Там Кнут пишет: «Любопытно, что эту идею обнаружили только в 1962 году»
habr.com/ru/post/451860
А если в памяти, сразу за искомым массивом начинается новый блок данных, который кем-то используется.
если в памяти, сразу за искомым массивом начинается новый блок данных
- Проверьте последний элемент массива. Запомните результат проверки.
- Запомните последний элемент массива. Замените последний элемент массива на искомый.
- Проверьте, является ли текущий элемент искомым. Если так,
3a. если указатель находится на последнем элементе массива, восстанавливаем последний элемент массива из запомненного и возвращаем запомненный на шаге 1 результат
3b. если указатель находится не на последнем элементе массива, восстанавливаем последний элемент массива из запомненного и возвращаем ответ - Увеличьте указатель и продолжайте.
1. Проверьте, является ли текущий элемент желаемым. Если так, возвращаем ответ, если указатель находится в пределах массива, или ошибку, если это не так. В противном случае
2. Увеличьте указатель и продолжайте.
Если массив не содержит искомого элемента, алгоритм вернет добавленный нами элемент. Наверное должно быть «возвращаем ответ, если указатель находится в пределах массива и не указывает на последний (добавленный нами) элемент».
Поскольку, чем больше ошибок, тем больше вероятность рассмотрения, предлагаю объединить усилия и поделить награду:)
Так или иначе, элемент гарантированно будет найден, а проверка границ выполняется только один раз, когда это произошло
В качестве теоретического упражнения — интересная мысль.
На практике- так себе оптимизация. Добавление элемента чревато тем, что придётся просить ещё памяти у ОС (системный вызов — очень дорогая штука) и, скорей всего, копировать старый массив в новый за O(n). На избавлении от проверки границы много не сэкономить — процессор неплохо умеет предсказывать ветвления.
Так надо только для элемента выделять память, или для примитивных типов обойтись регистрами вообще.
- Проверьте, является ли текущий элемент желаемым. Если так, возвращаем его; в противном случае
- Проверьте, находится ли указатель за границей массива. Если так, возвращаем ошибку; в противном случае
- Увеличьте указатель и продолжайте.
Что-то не верится что у Кнута может быть такой детский 0-дейчик.
1. Сначала мы лезем по адресу, а потом внезапно спохватываемся и
2. Проверяем не лазили ли мы, случайно, за границу…
Вот нет у нас искомого в массиве, просканировали мы его весь, ничего не нашли
3. Увеличили указатель (вылезли за границу), продолжаем
1. Ээээ, что-что мы сейчас собираемся проверить? Что именно нам бог послал за границей массива?
Я получил от Кнута чек на 0x$3,00