Ответы пользователя по тегу Free Pascal
  • Почему при ненулевой строке ее длина - 0?

    @zedxxx
    Если отвечать на вопрос из заголовка, то:
    1. При отсутствии директивы {$H+} тип string является алиасом на тип ShortString, который хранит длину строки в символе с индексом ноль. Максимальная длина для ShortString равна 255.
    2. Для того, чтобы функция Length правильно работала для ShortString, длину строки нужно задавать функцией SetLength - в самом начале процедуры добавьте вызов setlength(template, 255);

    Что касается приведенного кода, то тут возможно несколько вариантов исправления:
    • количество символов в строке у вас равно n-1 - можно использовать это значение;
    • можно включить директиву {H+} или объявить строку как AnsiString и увеличивать длину строки динамически. Перед записью в строку на каждой итерации дабавьте: setlength(template, length(template) + 1); - тогда вызов length(template) вернёт нужное значение.
    Ответ написан
    Комментировать
  • Почему появляется сдвиг индексации массива при передачи в функцию?

    @zedxxx
    в соответствии с правилами массивов в паскале: индексация с единицы

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

    Да и для статических массивов лучше придерживаться этого правила (если только нет какого-то специфического требования в конкретном случае).

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

    for n := Low(source) to High(source) do
      writeln(source[n]);
    Ответ написан
    5 комментариев
  • Как разделить строку на масив по пробелу?

    @zedxxx
    Используйте свойство Split:

    uses 
      ...
      SysUtils;
         
    var
      I: Integer;
      VStr: string;
      VArr: TStringArray;
    begin
      VStr := 'Произвольная строка';
      VArr := VStr.Split(' ');
    
      for I := 0 to Length(VArr) - 1 do begin
        WriteLn(VArr[I]);
      end;
    end;
    Ответ написан
    Комментировать