Ответы пользователя по тегу Pascal
  • Как правильно компилировать Pascal код?

    OCTAGRAM
    @OCTAGRAM
    Это расширение ищет Free Pascal в PATH. Может быть, он установлен, но его нет в PATH. Нужно либо в настройках расширения указать полный путь к fpc, либо отредактировать переменную окружения PATH вручную ....

    Также можно другой транслятор пробовать. Для Delphi (с регистрацией можно получать бесплатную лицензию) нужно в настройках расширения указать транслятор dcc64.exe или dcc32.exe
    Ответ написан
    Комментировать
  • Почему все так ненавидят паскаль?

    OCTAGRAM
    @OCTAGRAM
    Ответ написан
    Комментировать
  • Какой учебник по Turbo Pascal лучший?

    OCTAGRAM
    @OCTAGRAM
    Этот объявленный устаревшим ООП зачем так нужен? Мне кажется, что времена, когда писатели дорвались до инфраструктуры коммерческого книгопечатания и платёжеспособного спроса, были временами, когда было достоверно известно, что развитие в дальнейшем (в Delphi) пошло по другому пути. Имело смысл писать о вечном, о записях и массивах, но не об ООП заброшенном. В Delphi 7, если написать object, это warning.

    Можно делать задания на ООП для Delphi в старом синтаксисе.

    Имена старых классов имеют семантику значения, а если нужно работать с указателем, то нужно явно указывать указатель в имени типа. Где в Delphi TList, там в TP7 PList = ^TList. New для обычных указателей было расширено для объектов вызовом конструктора. И у Dispose аналогичное расширение было. Это вместо Create и Destroy. Указатель на метод обратного вызова взять нельзя. У объектов нет принудительного общего корня вроде TObject, поэтому полиморфные штуки типа TList работают с Pointer. Неявные метаклассы отсутствуют, так что никаких TClass и class of. Свойств нет.

    Extended syntax {$X+}, насколько я помню, позволяет не разыменовывать указатели на записи при обращении к их полям, и это распространяется и на методы тоже, так что кареток дополнительных в тексте будет не так уж много.

    Отсутствие исключений в языке накладывает такой отпечаток, что конструктор без исключений писать тяжело, и чтоб это побороть, добавлена псевдопроцедура Fail, про которую надо почитать.
    Ответ написан
    Комментировать
  • Чем отличаются друг от друга функции, процедуры и операторы(на примере FreePascal)?

    OCTAGRAM
    @OCTAGRAM
    Процедуры не возвращают результат, функции — возвращают.

    $X (eXtended syntax)
    Эта разница осложняется тем, что Паскаль после Вирта чаще портят, чем делают лучше. И, например, сделали возможным выбрасывать результат функции и вызывать функцию как процедуру. В Delphi это регулируется директивой $X (eXtended syntax), который паровозом меняет сразу много всего, и нельзя по отдельности только запретить выбрасывать результат. Паровозом становится нельзя образаться к результату по имени переменной Result. Казалось бы, можно пользоваться Exit(значение), но компилятор начинает глючить, когда тип значения record с управлением владением. И буфер символов array[0 .. 1023] of Char становится сложнее превратить в строку. Также становится обязательно использовать каретку для разыменования указателей. Смешались в кучу кони, люди. Куча синтаксических отличий переключается одной директивой, и сделано так, что с выключенной директивой толком жить не получается. Может быть, в FPC иначе, там свои глюки.


    Что касается операторов, в русском языке есть путаница переводов слов, которые в английском языке сильно не похожи. Хорошие переводчики разрешили эту путаницу таким образом, что statement = оператоР, а operator = операЦИЯ. Но не все переводчики согласовали глоссарий.

    Оператор (statement) — это:
    • пустой оператор
    • присваивание
    • вызов процедуры
    • составной оператор begin оператор; оператор; … end;
    • прочие операторы, как goto, raise, try, if, for, while, repeat


    Операция (operator) — это:
    • сложение, вычитание, умножение, деление
    • сравнения
    • логические и побитовые операции and, xor, or, not
    • битовые сдвиги shl, shr
    • явные и неявные приведения типов


    В Delphi 2006 и выше для объявления собственных операторов используется синтаксис class operator. У Free Pascal тоже был свой синтаксис собственных операторов.

    Здесь может быть путаница, потому что в Pascal не все операторы являются честными операторами, как должно быть. Например, Exit, Break и Continue не являются синтаксически простыми операторами, а являются операторами-вызовами процедуры, и расположены эти специальные процедуры в модуле System, так что полное имя System.Exit тоже сработает.

    Автор учебника, наверное, думает, что Read и ReadLn, наоборот, являются простыми операторами. Но нет. Это процедуры из модуля System, на которые навешана магия компилятора, чтоб они принимали разные параметры, но эта магия не делает из них операторы. Хотя вызов процедуры — это формально оператор.
    Ответ написан
    Комментировать
  • В чем разница halt(0) и halt(1)?

    OCTAGRAM
    @OCTAGRAM
    Если запустить из bash:

    ./MyProgram && echo True || echo False

    То для Halt(0) сработает echo True, а для Halt(1) сработает echo False

    Ещё так можно в bash писать:

    set -e
    ./Generate_ORM ...
    gprbuild ...
    7z a ...
    sftp ...
    ssh ...


    Здесь set -e устанавливает режим нетерпимости к ошибкам. Каждый перенос строки или точка с запятой работают как два амперсанда. В этой цепочке если что-то не отработало нормально, дальше исполнение не продолжается. Если исходники не сгенерились, нет смысла их компилировать, а если не скомпилировались, то нет смысла упаковывать скомпилированное, а не если не упаковалось, то нет смысла заливать на сервер, а если не залилось на сервер, то нет смысла удалённо перезапускать сервер. Как правило, кодом завершения процесса программа сообщает, что она не справилась.
    Ответ написан
    Комментировать
  • Возможна ли работа с файлами в pascal онлайн?

    OCTAGRAM
    @OCTAGRAM
    Я бы посмотрел в сторону Oxygene и Fire:

    https://www.elementscompiler.com/elements/oxygene/

    Можно ещё School Pak вспомнить
    Ответ написан
    Комментировать
  • Как исправить ошибку E2066?

    OCTAGRAM
    @OCTAGRAM
    TSet = (Sorted, Reversed, Random);

    Это объявление сделало Random константой с более высоким приоритетом видимости, чем System.Random.

    Варианты решения:

    В новых Delphi можно написать (в начале кода)

    {$SCOPEDENUMS ON}

    и заменить

    if ArrType = TSet.Sorted then
    // …
    else if ArrType = TSet.Reversed then


    Тогда TSet.Random не сможет пересекаться с System.Random

    Можно, наоборот, при использовании System.Random указывать полностью квалифицированный идентификатор:

    ArrI[i] := System.Random(Row);

    Либо можно просто переименовать TSet.Random во что-то, что не в точности Random
    Ответ написан
    Комментировать