Книга «Экспресс курс программирования в Lazarus»

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение MylnikovDm » 29.07.2014 00:43:23

Глянул на спех ваше творение.

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

Во-вторых, я вам настоятельно рекомендую при работе над своей книгой использовать фирменную документацию.
http://www.freepascal.org/docs-html/ref/ref.html

Тогда не будет ляпов как у вас вышло с вешественными типами!
Тип Real хотя и зависит от платформы, имеет размер 4 или 8 байт, а для 64х платформы вообще не поддерживается.
Тип Single всю жизнь был 4 байта, а тип Double во всех языках был 8 байт! Почему у вас они стали 2 и 4 байта?
И, наконец, тип Currency является типом с фиксированной, а не плавяющей точкой!

Вот описание в документации http://www.freepascal.org/docs-html/ref/refsu6.html#x28-310003.1.2

Далее, очень мало примеров, практически нет. Если лень придумывать самому, то просто скопируйте из документации.
При описании синтаксиса обычно принято либо использовать форму Бэкуса-Наура, лучше расширенную
http://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D1%81%D1%88%D0%B8%D1%80%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%84%D0%BE%D1%80%D0%BC%D0%B0_%D0%91%D1%8D%D0%BA%D1%83%D1%81%D0%B0_%E2%80%94_%D0%9D%D0%B0%D1%83%D1%80%D0%B0
либо схематические диаграммы, как в документации, либо, в крайнем случае, перенести их на отдлеьные строки и выделить другим шрифтом (обфчно используют моноширинный шрифт Courier).

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

При описании оператора for..in..do у вас сказано, что оператор выполняет код, пока переменная принадлежит множеству. Более правильно написать, что цикл выполняется для всех элементов множества. При этом за ключевым словом in может быть указан перечислимый тип, переменная типа set, которая включает некое подмножество из перечеслимого типа (в том чсиле пустое), массив, строка символов.

При описании функции для возвращения значения можно использовать имя функции, псевдопеременную Result (только в режиме компилятора ObjFPC или Delphi), а также вариант с ключевым словом exit('возвращаемое значение').
При этом только Result можно использовать как полноценную переменную, то есть, и в левой, и в правой части выражения (хотя, честно скажу, не проверял в FreePascal возможность использовать справа имя функции, может они там что изменили, по крайней мере в документации про это ничего не сказано).

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

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

Перезагрузка подпрограмм

Одно имя может соответствовать нескольким подпрограммам. Это называется перезагрузкой. Перезагрузка является практической реализацией полиморфизма.

Перезагрузка, это когда вы клавишу reset нажимаете, а в данном случае ресь идёт о "перегрузке".
Кстати, у вас ничего не сказано про возможность перегрузки стандартных операторов (или я плохо смотрел и не увидел?).

В описании динмаических массивов вы описываете функцию SetLength, которая служит для установки длинны массива, но ничего не говорите про функцию Lenght, которая служит для определения длины массива.

Это пока то, что успел посмотреть.

Но ещё раз повторюсь, что главное замечание в том, что не понятно назначение вашей книги, кому она адресована?
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 29.07.2014 07:00:34

MylnikovDm, Большое спасибо за отзывы. Во введении сказано, что книга представляет собой краткий справочник. Перезагрузке операторов посвящена двадцатая глава первой части. Термин "перезагрузка " по отношению к подпрограммам давно применяется в технической литературе. БНФ мне кажется неудобной для восприятия. Функция Length упоминается в главе посвященной строкам. Что касается остальных замечаний, то постараюсь исправить найденные вами ошибки.
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение MylnikovDm » 30.07.2014 00:55:03

tuzik87@inbox.ru писал(а):Термин "перезагрузка " по отношению к подпрограммам давно применяется в технической литературе.


overload во всех словарях преводится как "перегрузка". Я не поленился, поспрашивал Гугла, но он мне ни одного варианта использования слова "перезагрузка" в данном контексте, кроме вашего, не выдал. А слово "переЗАгузка" переводится либо как reset, либо как reboot, или в крайнем случае reload.

tuzik87@inbox.ru писал(а):Функция Length упоминается в главе посвященной строкам.


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

Кстати, у функции Setlenght есть вариант для многомерных массивов.

tuzik87@inbox.ru писал(а): БНФ мне кажется неудобной для восприятия.


!!! Отлично! Вы меня порадовали! Вы считаете, что ваша форма записи более удобна для полноценного описания синтаксиса конструкций?!
А то, что используются английские слова для ключевых конструкций языка вам не кажется неудобным для восприятия? :)
В мире программирования уже давно есть определённые стандарты, которые придуманы были, я вас уверяю, весьма не глупыми людьми. Может быть, конечно, вы сможете удивить мир программистов и придумать что-то более удобное и эффектвиное, чем БНФ, може быть, но пока, увы, этого не наблюдается.
Открывая справочник по языку программирования я лично ожидаю увидеть полноценное описание синтаксиса конструкций языка. Например такое, как в родной документации на Delphi или FreePascal. А если этого исчерпывающего описания нет, то зачем тогда такой "справочник"?

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

Добавлено спустя 10 часов 20 минут 6 секунд:
Продолжим.

Глава 10. Инкремент и декремент

Инкрементом называется увеличение значения на единицу. Декремент выполняет обратное действие. Для этих операций предусмотрены две подпрограммы. Подпрограмма Inc выполняет инкремент. Подпрограмма Dec выполняет декремент. Они берут имя переменной как аргумент.

inc и dec в языке pascal позволяют изенять только целочисленные переменные или перечислимые типы, например Char, причём не только на единицу. Если указать вторым параметром приращение, то значение будет увеличено или уменьшено на это значение.
При этом у данных функций есть особенность при работе с типизированными указателями. При вызове inc для типизированного указателя приращение происходит на величину SizeOf(type). Пример:
Код: Выделить всё
type
  TPoint = record
    x: integer;
    y: integer;
  end;
  PPoint = ^TPoint;

var
  MyPoint: PPoint;
  ArrPoint: array[1..10] of TPoint;
begin
...
  MyPoint := @ArrPoint[1];  //переменная MyPoint указывает на ArrPoint[1]
...
  inc(MyPoint);                   //теперь MyPoint указывает на ArrPoint[2], то есть указатель сместился
                                         //на величину SizeOf(TPoint)
...
end;


Глава 11. Работа с консолью

тут нужно сказать о том, что при выводе русского текста на консоль необходимо использовать функцию UTF8ToConsole для перекодировки символов.
Причём рекомендуется именно этот вариант, а не UTF8ToANSI, поскольку он является кроссплатформенным, а UTF8ToANSI будет работать только на Win32.

Добавлено спустя 1 час 56 минут 12 секунд:
Да, из общих замечаний, было бы неплохо изменить нумерацю глав, чтобы она содержала не только порядковый номер, но и номер части. То есть, не 1. 2. 3., а 1.1. 1.2 1.3 и т.д. Тогда будет проще на них делать сноски по тексту, а также ориентироваться по тексту. А то открываешь где нибудь в середине и не понятно "Глава 6. Макросы" это какая часть?

Типизированные указатели и массивы как аргументы подпрограмм

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

Только благодаря тому, что у меня достаточно большой стаж программирования, я кое как понял, что вы тут пытались сказать. Вообще, такое ощущение, что это какой-то гулг-перевод с английского, слегка правленный вами, как-то уж слишком не по русски написано. В данном случае речь идёт не о псевдониме типизированного указателя, а об использовании типа, являющегося псевдонимом указателя на некий тип данных. То есть, приведённый выше в примере тип PPoint как раз и есть псевдоним указателя на тип TPoint.
Но аргументом процедуры или функции будет не PPoint, а параметр типа PPoint, то есть: procedure MyPoc(aPoint: PPoint);
При этом нужно указать, что использование aPoint: PPoint будет аналогично использованию var aPoint: TPoint, то есть, при изменении значения aPoint^, когда она передаётся через указатель, будут изменены данные в вызывающем модуле.

Да, и когда вы говорите об указателях, то нигде не говорите о том, какой размер занимает переменная типа Point и все прочие типизированные указатели обычных типов (не классов и не объектов). Для х86 это будет 4 байта, для х64 это будет 8 байт, а для всяческих других платформ нужно смотреть документацию по данной платформе (теоретически могут быть и 16 разрядные микроконтроллеры и 16 разрядная архитектура х86).

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

На самом деле форма FreeMem(p: pointer; Size: ptruint), которая имеет два параметра, введена исключительно для совместимости со старым кодом. При работе стандартный менеджер памяти второй параметр не использует и всегда освобождает то количество памяти, которое запрашивалось при вызове GetMem. Этот размер хранится в памяти перед областью данных, которая выделяется при вызове GetMem. Это означает, что если вы запрашиваете область данных размером один байт, реально выделится как минимум 1 + 4 байта для режима x86 (DWord) или 1 + 8 байт для режима х64 (+QWord).

Добавлено спустя 2 часа 17 минут 11 секунд:
Глава 16. Множества
...
Операция объединения возвращает новое множество, состоящее из элементов входящих в обе пары множеств. Пересечение состоит из элементов входящих в обе пары множеств.

И чем же в вашем объяснении операция объединения отличается от операции пересечения? В первом случае: "из элементов входящих в обе пары множеств", во втором случае: "из элементов входящих в обе пары множеств". Мне одному кажется, что эти варианты совпадают дословно? :D
Симметричная разность дает множество состоящие из элементов, которые не входят ни в одно из исходных множеств.

???!!! Вообще-то "симметричная разность", то бишь "symmetric difference" содержит все элементы, кроме входящих в оба множества. А ваш вариант может быть лишь пустым множеством (ну либо бесконечным, за исключением входящих в одно из исходных множеств, смотря как мы будем рассматривать пространство элементов, замкнутым или открытым).

Полное описание операций со множествами тут: http://freepascal.org/docs-html/ref/refsu45.html#x139-14900012.8.5
include и exclude повторяют + и -.
Там же есть очень хорошие примеры, которые помогают понять как это работает.

Добавлено спустя 1 час 14 минут 29 секунд:
Глава 17. Обработка строк
...
AnsiString - Строка с текстом в кодировке UTF-8

Ничего подобного! AnsiString содержит строку из символов Char, длина которых 1 байт, и не более того. А уж какую кодировку вы выберите для своих строк, это ваше дело. При этом в Lazarus для среды разработки по умолчанию выбрана кодировка UTF-8, но это не означает, что в переменную AnsiString нельзя положить строку в кодировке cp1251, OEM866 или KOI8.

String - В зависимости от настроек компилятора может быть синонимом ShortString или AnsiString

Ну так и опишите где нибудь диррективу компилятора для этих целей:
{$H-} - все строки, объявленные как string, рассматриваются как ShortString[255],
{$H+} - как ShortString рассматриваются только строки, у которых явно задаётся длина строки в квадратных скобках. Остальные как AnsiString с нулём на конце.

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

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

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

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

А равзе такой вариант не будет работать:
Код: Выделить всё
const
  sc = 'TEST';
var
   s: string;
   с: Char;
begin
  c := '!';
  s := sc + chr(32) + c + #10#13;
end.

?

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

Преобразования кодировок

Функция AnsiToUtf8 преобразует строку из текущей системной кодировки в UTF-8. Функция Utf8ToAnsi выполняет обратное преобразование.

И это всё? А как же UTF8ToUnicode, UTF8ToSys, UTF8ToConsole и обратные им?
Правда, для последних двух требуется подключение модуля LazUTF8, зато они обеспечивают кроссплатформенность приложения.

Кстати, весьма интересно, как реализована функция UTF8ToAnsi. Вначале строка UTF8 декодируется в строку Unicode, то бишь WideString, а после этого присваивается строке AnsiString. То есть, дальше задействуется штатный механизм компилятора по преобразованию WideString в AnsiString. В обратную сторону точно так же.
Интересно, а движок FreePascal поддерживает сохранение текущей кодовой таблицы для AnsiString перед самой строкой, как это сделано в Delphi или нет? Я что-то пока про это ничего не нашёл.

Переменным типа Variant можно присваивать целочисленные и дробные переменные, а так же строки и интерфейсы.

А также значениz varNull и varEmpty, то не одно и тоже. Для проверки на эти значения используются функции function VarIsNull(v: variant): boolean и function VarIsEmpty(v: variant): boolean. Только нужно не забывать подлкючать модуль variants для их использования.
И вообще, про тип variant как-то мало написано, хотя тема эта достаточно большая и сложная.

Добавлено спустя 7 часов 55 минут 48 секунд:
продолжаем...
Глава 18. Записи

А где описание записи с вариантами с использованием ключевого слова case?
Код: Выделить всё
type
  BetterRPoint = Record 
    Case UsePolar : Boolean of 
      False : (X,Y,Z : Real); 
      True : (R,theta,phi : Real); 
  end;


Файлы бывают следующих типов: текстовые, типизированные и двоичные. Типизированные файлы состоят из записей блоков типа.

Опять гугл-переводчик?
Типизированные файлы хранят набор записей указанного типа. Если тип будет integer, то в файле будет набор целых чисел. Если укажем тип record, например TPoint, то в файле будут записи экземпляров TPoint.

И справочник по функциям как-то бедноват.
Тут полный список функций для работы с файлами в модуле system http://freepascal.org/docs-html/rtl/system/filefunctions.html
Тут набор функций для работы с файловой системой из модуля dos http://freepascal.org/docs-html/rtl/dos/filehandling.html
Тут набор функций для работы с дисками и файлами из модуля Sysutils http://freepascal.org/docs-html/rtl/sysutils/filenameroutines.html

Глава23. Структура программы

В отличие от первых редакций языка Pascal, современыне редакции, что в Delphi, что в FreePascal не стаят жёстких условий на порядок следования секций в программе или модуле.

Любоая программа может иметь следующие необязательные секции, некоторые из которых выделяются ключевыми словами:
uses - подключение внешних модулей, используемых в программе;
const - сеция объявления глобальных констант;
type - секция объявления глобальных типов;
var - секция объявления глобальных переменных;
- секция определения процедур и функций.

Секции const, type, var и определения процедур и функций может быть столько, сколько нужно и они могут следовать в произвольном порядке.
После всех объявлений и определений идёт собственно основное тело программы:
Код: Выделить всё
begin
  {операторы}
end.

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

При чередовании секций с объявлениями нужно помнить следующие правила:
1. То что вы собираетесь использовать в правой части ваших определений констант, типов, переменных или параметров процедур и функций, должно быть объявлено либо выше по тексту, либо в модулях, которые вы подключаете к программе в секции uses.
2. При предварительном объявлении типов или классов окончательное определение класса дожно быть сделано в той же секции type, что и предварительное объявление. Между предварительным объявлением и окончательным не должны вставляться другие секции, например const.

В отличе от некоторых других языков, например C или C++, язык Pascal позволяет писать вложенные процедуры и функции. В принципе, любая процедура или функция может после своего заголовка содержать свой набор секций const, type, var, а также вложеные процедуры и функции, которые описываются до блока begin...end; в котором определяется действие самой процедуры или функции. При этом вложенные процедуры и функции, в свою очередь, могут содержать собственные внутренние секции и процедуры и функции. В описании FreePascal я с ходу не нашёл, но для старых компиляторов фирмы Borland максимальный уровень вложенности равнялся семи (7). Кстати, максимальная рамзеность массивов и уровень вложенности выражений со скобками тоже была равна 7, видимо это какое-то магическое число :).

Теперь что касается области видимости констант, типов и переменных.
Если мы определяем вложенные процедуры и фукнции внутри других процедур и функций, то для них будут видны все определения и переменные, которые объявлены в сециях const, type и var, которые находятся выше определения вложенной процедуры или функции. При этом ничто не мешает нам добавить другие секции const, type и var уже после определения вложенной процеудуры или функции. Соответственно, в этой вложенной процедуре или функции данные определения использовать нельзя, а в основной процедуре или функции они будут работать.

Если имеется несколько определений констант, типов или переменных с одинаковыми именами в разных областях видимости, то действует то, которое к данному блоку begin...end ближе, если смотреть по коду снизу вверх. То есть, если мы объявили глобальную переменную i:integer в самой программе, а потом ещё две переменных i: integer в процедуре и вложенной в неё функции, то мы фактически получим три разных переменных i, действующих какждая в своей части кода (в своём блоке begin...end).

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

Отдельное замечание по области видимости опредлений при использовании модулей. Разные модули могут содержать определения сущностей с совпадающими именами. Действующим будет считаться то описание, которое компилятор "видел" последним. То есть, если у вас есть несколько определений типа TPoint, одно с целочисленными полями в мдуле А, а другое с веществеными в модуле B, то всё будет зависит какой из модулей в секции uses стоит последним. Для варианта uses A, B; в вашё программе или модуле будет действовать тип с вещественными полями из модуля В. Если же вы всё таки захотите использовать TPoint с цеыми полями из модуля А, то вам придётся явно указывать имя модуля перед указаением типа:
Код: Выделить всё
unit A;
type
  TPoint = record
     x, y: integer;
  end;
....
unit B;
type
  TPoint = record
    x, y: double;
  end;
...

uses A, B;

var
  DoublePoint: TPoint;
  IntPoint: A.TPoint;

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

Глава 3. Параметры командной строки

Параметры передаются в командной строке и разделяются пробелами. Строковая константа в двойных кавычках считается одним параметром и может внутри содежать пробелы. Именно так передаются длинные имена файлов, которые содержат пробел.
Даже если пользователь не задал ни одного парамтера при запуске программы, всегда существует параметр ParamStr[0], коорый содержит имя исполняемого файла данной программы. Если каталог запуска программы отличается от текущего или рабочего каталога, то данный параметр будет кроме имени содержать ещё и полный путь к исполняемому файлу в файловой системе.
Если вы свяжете какое либо расширение файлов с вашей программой в проводнике Windows, то при двойном клике на файле с таким расширением будет запускаться ваша программа, а в ParamStr[1] будет находится полное имя этого файла.

Глава 4. Обработка ошибок

При использовании конструкций try .. except .. end; или try .. finally .. end; они перехватывают только те ошибки, которые происходят после слова try, в том числе во время выполнения процедур и функций, которые вызываются внутри этого блока. У вас написано так, что можно подумать, будто перехватываются любые ошибки в программе.

При возникновении ошибки внутри секции try .. except .. end; после входа в секцию except и выполнения находящихся там операторов, состояние ошибки сбрасывается.
При возникновении ошибки внутри секции try .. finally .. end; выполняются операторы из секции finally, но состояние ошибки остаётся.
Соответственно, если у нас имеется несколько вложенных друг в друга секций try, то в случае с finally мы пройжём по всем из них и в конечном итоге получим на экране сообщение об ошибке для пользователя. В случае с except программа будет считать, что вы решили проблему и ошибка устранена.
То есть, конструкция except применяется в тех случаях, когда мы считаем, что можем исправить ошибочную ситуацию и продолжить нормальную работу программы.
Конструкция finally применяется в тех случаях, когда требуется обязательно выполнить какие-то действия, не взирая на возникновение ошибки, например, освободить память или закрыть открытый на чтение или запись файл данных.

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

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

Также внутри секций except и finally мжно обращаться к служебной переменной E являющейся экземпляром класса Exception или его наследником, которая содержит свойства E.HelpContext и E.Message. Последнее содержит текст, который будет выведен пользователю в сообщении об ошибке. Оно же задаётся в конструкторе при генерации исключительной ситуации оператором raise.
MylnikovDm
постоялец
 
Сообщения: 103
Зарегистрирован: 15.02.2007 21:26:10
Откуда: Челябинск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 01.08.2014 10:19:22

Вышел новый вариант книги. Из изменений множественные исправления и дополнения почти по всему тексту книги для исправления ошибок и устранения неточностей. Буду рад конструктивной критики. Рекомендуется полностью прочесть книгу чтобы критика была более точной. Ссылка на скачивание, http://freepascal.ru/download/book/express_course_Lazarus_v19.pdf
Отдельное спасибо MylnikovDm за ценные замечания и подробный разбор недочетов. Вы мне очень помогли уделив книге немного вашего времени
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 21.10.2014 15:12:25

Выкладываю новый вариант книги с исправлениями и дополнениями существующего материала. Жду отзывов.
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 11.12.2014 23:07:21

Обновил двадцатое издание до финальной версии.
Ссылка: http://freepascal.ru/download/book/expr ... us_v20.pdf
Жду отзывов
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение SSerge » 12.12.2014 09:00:54

Хотели отзывов - имейте их :D

стр.6
Логические типы.

Что есть критерий истинности? Для самого языка для типа boolean, это несомненно значение true. Что такое критерий истинности в таблице? Двоичное представление? может так и написать «представление значения true на двоичном уровне”?

стр. 7
Таблица целых типов.

По тому что там написано, смею предположить, что Cardinal является абсолютным тождеством типа LongWord, а Integer на большинстве платформ является синонимом LongInt. может быть, этому стоит уделить внимание в примечании?

Вещественные типы

ладно, Real и Comp поддерживаются не на всех платформах, нормальное примечание. Относительно Real, наверно, стоит добавить обязательно, что двоичные данные этого типа из Turbo/Borland Pascal имели длину 6 байт, и сейчас их читать нечем; Более того, следует избегать использования типа Real в программах, как отображаемого неизвестно на что.
Нет никаких сведений о Comp и Currency. А это весьма необычные вещественные типы с достаточно ограниченным применением.

стр. 8

Списки констант
Множество констант удобно объединить в список, называемый перечислением.

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

стр. 9
комбинированные операторы

Раз уж учебник, может быть, стоит внести в таблицу расшифровку аналога, что этот оператор делает. Для большей понятности, типа аналогом var/=10 будет var:=var/10;

стр. 17
перезагрузка подпрограмм

так все таки перегрузка или перезагрузка? В тексте абзаца и то и другое употребляется в том же самом смысле )) имхо, по семантике русского языка overloading скорее по смыслу стоит трактовать как «переназначение».

стр18 глава 8
Стандартные математические …

Что же они не все тогда? Где обратная тригонометрия? Мало ли что, она не из модуля System. Нигде не сказано, что аргументами тригонометрии должны быть числа в радианах. Где перечисление функций перевода из радиан в градусы и обратно? Где операция округдения Trunc (если тут есть round)?

стр 21, Глава 11

синтаксически правильные inc(a,10) и dec(a,20) недопустимы по имеющемуся описанию операций инкремента / декремента

стр. 22
Массивы

«Часто используют двумерные массивы. Они представляют собой матрицы. С
матрицами вы можете быть знакомы из курса математики. Математики называют
таблицу чисел матрицей.»

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

Инициализация массивов при объявлении

Здесь учебник или описание? Нет примера - ничего непонятно. Чтобы что-то понять, нужно знать о чем идет речь.

Чем у открытые массивы отличаются от динамических? Зачем называть разными терминами одно и то же. Может быть, дело в последовательности изложения - и сначала стоит упомянуть о том, что де есть массивы неопределенной длины, которую можно задать во время исполнения программы, и такие штуки можно использовать в качестве аргументов подпрограмм, где они ведут себя [далее то что написано про open parameters]?


стр 23.
«Вызов подпрограммы SetLength»
А она не подпрограмма на самом деле. Это синтаксическая операция языка, производящая действия по изменению длины массива, и обрабатываемая компилятором. Там их много таких, в частности, среди строковых «функций/процедур». Тех, у которых в типах аргументов в справке например, написано aSomeString

Границы массивов

Выход за границу массива приводит к повреждению данных. Он отнюдь не беременен (чреват).

стр. 24
«Лучше обнулять указатель перед
использованием, чтобы избежать повреждения данных.»
и чем это поможет? И в каких случаях. Раз утверждается, может быть, есть смысл пояснить?

стр. 25
подпрограммы для работы с памятью
у вас там GetMem и FreeMem, а в таблице вдруг появляется New/Dispose, по модели применения совсем из другой оперы.

Операция Addr(variable) и @variable одно и то же? Если одно и тоже, нафига два варианта записи одного и того же, если нет - то...

Глава 18. Обработка строк

Следующие подпрограммы работают с символами и короткими строками.

SetLength(строка,длина)

Опять же, это не подпрограмма, а инструкция комплятору. И работает не только с короткими строками.

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

Описание записей (глава 19)
Я бы рекомендовал внести особое примечание (1) относительно элементов записей, являющихся на самом деле указателями - это Ansi/Wide/Unicode strings и array of; Ибо - первые грабли на которую наступит newbie при попытке такую запись куда-то сохранить. А также именно в описании записей надо ткнуть в то, что их поля выравниваются компилятором, и sizeof(record) не равна сумме sizeof() ее элементов, где сослаться на дальнейшие абзацы.

стр. 35
«Многострочный комментарий заключается в круглые или фигурные скобки»

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


стр. 40
Статистические поля

СТАТИЧЕСКИЕ

стр. 41
Конструкторы и деструкторы

ничего не сказано о том, что хоть и объектная модель freepascalя предполагает определенный бардак «на усмотрение программиста», но если мы имеем дело с конструкторами и деструкторами класса, порожденного от какого то другого, то программисту нужно вызвать конструктор/деструктор родительского класса вручную, сам компилятор этого не сделает в отличии от большинства оффтопиков

стр. 55
ALLIGN - должно быть ALIGN

BITPAKING - скорее всего BITPACKING (проверьте, пожалуйста)

раздел про лазарус пролистал по диагонали

Добавлено спустя 9 минут 54 секунды:
Кстати, далеко не все поправлено в соответствие с замечаниями от 30.07
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение Vapaamies » 12.12.2014 10:33:29

SSerge писал(а):Относительно Real, наверно, стоит добавить обязательно, что двоичные данные этого типа из Turbo/Borland Pascal имели длину 6 байт, и сейчас их читать нечем; Более того, следует избегать использования типа Real в программах, как отображаемого неизвестно на что.

С выходом первой версии Delphi тип Real приобрел смысл виртуального типа, как Integer или Cardinal, только для вещественных чисел. В Delphi и FPC под x86 он отображается в Double, который, в свою очередь, являетя реализацией типа IEEE 754, то есть его внутреннее представление регулируется официальным стандартом, который соблюдается на многих платформах. На ARM вроде бы тоже, насколько знаю.

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

А вот для старого типа Real из Turbo Pascal, реализованного программной библиотекой Borland, используется обозначение Real48. Он действительно занимает 6 байт, его внутреннее представление не регулируется никаким официальным стандартом, ограниченно поддерживается для обратной совместимости в Delphi (под x64 уже вроде бы нет) и совсем (?) не поддерживается FPC.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение SSerge » 12.12.2014 11:32:51

Vapaamies писал(а):его лишь нужно использовать с оглядкой


А зачем? Хоть один аргумент в пользу этого.
Старый код? Ну так любым редактором search and replace - и вперед.
В turbo pascal он имел смысл - для машин, на которых не было сопроцессора, считался в разы быстрее, чем типы IEEE. И, к сожалению, :D Turbo Pascal все еще жив... в некоторых учебных заведениях - реально жив :D. Научившийся там использовать тип real будет ожидать от него что? Именно: двоичной совместимости, которую не получит. В стандартном паскале, емнип, real к тому же мапится на single
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение Vapaamies » 12.12.2014 11:52:33

SSerge писал(а):Научившийся там использовать тип real будет ожидать от него что? Именно: двоичной совместимости, которую не получит.

Да ну! Доучившийся до осознания двоичной совместимости и остальное как-нибудь докумекает. :mrgreen:

SSerge писал(а):В стандартном паскале, емнип, real к тому же мапится на single

В стандартном -- это в каком?
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение PapaNT » 12.12.2014 22:16:30

По ссылке http://tuzik87.ru54.com/download/book/Lazarus.zip ничего нет.
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 12.12.2014 22:37:33

На данный момент новые варианты книги публикуются только тут: http://www.freepascal.ru/article/books/20140518000000/
После появления стабильного варианта с минимальным количеством ошибок, он будет размещен на моей домашней странице. Зеркало книги по прежнему будет тут.
Ваши замечания и уточнения ускоряют появление стабильного варианта. Выражаю свою благодарность всем участникам форума.
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение PapaNT » 13.12.2014 06:03:00

чень мало примеров кода... Перепутаны понятия процедур и функций.
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 18.12.2014 22:27:29

PapaNT, процедура это частный случай функции
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Re: Книга «Экспресс курс программирования в Lazarus»

Сообщение tuzik87@inbox.ru » 27.12.2014 18:12:28

Обновил книгу с учетом обнаруженных замечаний.
Ссылка: freepascal.ru/download/book/express_course_Lazarus_v21.pdf
Жду от вас новых поправок. Заранее благодарю
tuzik87@inbox.ru
постоялец
 
Сообщения: 149
Зарегистрирован: 25.12.2012 15:05:28
Откуда: Россия, Новосибирск

Пред.След.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru