Помощь новичкам

  1. с подключённым CRT - никак :з

ставь // перед всеми строчками с методами из CRT, ну или если несколько строчек подрят - заноси в такую штуку

{
эта строчка сейчас коментарий, но если закрыть скобку на предыдущей то она станет обычной
ещё коментарий
ещё коментарий
{}

так же можно, если нужно найти где ошибка - к примеру ставить writeln(1);, writeln(2);, writeln(3); между разными строчками чтоб видеть куда программа успела дойти перед тем как вылететь, или если не вылетает а значения не правильные - то выводить все значения после каждого действия ну и если вылет то понадобится

try
  //код
except
  on e:System.Exception do
    writeln(e);
end;

ну а вообще в идеале проходишь по всем функциям из CRT которые используешь, нажимаешь ПКМ и Перейти к определению, ну или Перейти к реализации, смотришь как функция устроена и заменяешь её у себя в программе. К примеру если мне сильно надо отчищать консоль и при этом заниматься отладкой то пишу System.Console.Clear, а если надо оч чтоб программа не вылетала доходя до этой строчки то пишу свою процедуру

procedure ClrScr;
begin
  if System.Reflection.Assembly.GetExecutingAssembly.GetType('__RedirectIOMode.__RedirectIOMode')=nil then
    System.Console.Clear;
end;

всё нужное можно найти в самом CRT, как и написать свой CRT скопировав всё и удалив ненужное)

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

пишешь отдельную программу или делаешь так чтоб в той что уже есть программа просто не доходила ни до чего, к примеру readln; exit;(разумеется это будет работать только если все модули ничего не делают до выполнения основной программы) или создаёшь в той же папке файл test.pas, копируешь в него подпрограммы нужные для тестирования и вызываешь их… ну и так же будет работать writeln(1), writeln(2)… и т.п. описанные выше

а вообще мысль плохая, много времени в пустую уйдёт, дебаг и без того долгий и нудный процесс

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

Рекомендую найти в Интернет (я же нашел!) вот эту книгу и обратить внимание на её третью главу.

Спасибо большое.

А есть ли возможность в PABC.NET объявлять статические методы/поля? Ключевое слово static вроде есть, а использовать его не получается.

class function

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

var ss:array[1…12] of string; begin ss[1] :=‘январь’; ss[2] :=‘февраль’; ss[3] :=‘март’; ss[4] :=‘апрель’; ss[5] :=‘май’; ss[6] :=‘июнь’; ss[7] :=‘июль’; ss[8] :=‘август’; ss[9] :=‘сентябрь’; ss[10] :=‘октябрь’; ss[11] :=‘ноябрь’; ss[12] :=‘декабрь’;

end.

все работает

[code]var ss: array[1…12] of string;

begin ss[1] := ‘январь’; ss[2] := ‘февраль’; ss[3] := ‘март’; ss[4] := ‘апрель’; ss[5] := ‘май’; ss[6] := ‘июнь’; ss[7] := ‘июль’; ss[8] := ‘август’; ss[9] := ‘сентябрь’; ss[10] := ‘октябрь’; ss[11] := ‘ноябрь’; ss[12] := ‘декабрь’;

print(ss[12]); //декабрь end.[/code]

Спасибо.

Что за отвратительный код? Так нельзя было делать даже в ТР! Нужно, хотя бы так:

begin
  var ss : array [1..12] of String = ('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');
  WriteLn(ss);
end.

А лучше так:

begin
  var ss := arr('январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь');
  WriteLn(ss);
end.

Правда, в последнем случае индексация массива происходит от 0 до 11, но это легко решаемая проблема.

Человек вопрос задал, а не просил оценить его код. Каждый пишет, как может, а новичок может, как его учили.

4 лайка

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

Это невозможно. Пользуйтесь процедурными переменными. Красивый способ.

Как сделать класс который нельзя наследовать? Добавьте пожалуйста это в справку.

type
  t1=class
    a:t2;
  end;
  t2=class
    a:t1;
  end;

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

type
  t2 = class;
  t1=class
    a:t2;
  end;
  t2=class
    a:t1;
  end;
1 лайк

И я снова пропустил очень полезное нововведение… Когда я последний раз пробовал - ; после class вызывало ошибку компиляции… Я видел на основном сайте где ссылка на скачивание краткий список нововведений, но он слишком уж краткий, есть место с нормальным списком и описанием?

Это полный список. Предописание классов было с самого начала - Вы как-то не так пробовали

Как сделать программу для чтения файлов определённого расширения и програмно забить как стандарт для этого расширения?

Как к примеру блокнот по умолчанию используется для чтения txt файлов.