Ошибка времени выполнения при <имя строки>.chars[] и не только

program lang;
var
  inp,out:array[0..67]of char;
  f1,f2:text;
  nin,nout,t1,t2:string;//names for from and to filrs respectively
  n:char;
  text:array of char;

begin
while true do
begin
  t1:='';
  t2:='';
  writeln('file with lang to translate from: ');
  readln(nin);
  writeln('file with lang to translate to: ');
  readln(nout);
  Assign(f1,nin+'.txt');
  reset(f1);
  for var i:integer :=0 to 67 do
  begin 
  readln(f1,n);
  inp[i]:=n;
  end;
  close(f1);
  Assign(f2,nout+'.txt');
  reset(f2);
  for var i:integer :=0 to 67 do begin readln(f2,n);out[i]:=n;end;
  close(f2);
  writeln('text to translate: ');
  readln(t1);

Первый вариант:

  text:=new char[t1.Length-1];
  for var i:integer :=0 to t1.Length-1 do
  begin
    text[i]:=t1.Substring(i,1).ToCharArray[0];
  end;
  for var i:integer :=0 to t1.Length-1 do
  begin
    for var j:integer :=0 to 67 do
    begin
      if text[i] = inp[j] then 
      begin
      t2:=t2+out[i];
      end
      else if text[i] = ' ' then 
      begin
        t2:=t2 + ' ';
      end;
   end;
end;
writeln(t2);
end;
end.

Второй вариант:

  for var i:integer :=0 to t1.Length-1 do
  begin
    for var j:integer :=0 to 67 do
    begin
      if t1.chars[i] = inp[j] then 
      begin
      t2:=t2+out[i];
      end
      else if t1.chars[i] = ' ' then 
      begin
        t2:=t2 + ' ';
      end;
   end;
end;
writeln(t2);
end;
end.

Оба выдают ошибку. Буду рад любой помощи.

Ради совместимости со старыми паскалями все строки индексируются с 1. Это можно отключить директивой $string_nullbased.

Ошибка осталась

Как то пробовал - не отключило.

Вы бы исходную задачу привели. Потому что решение средствами полувековой давности. Возможно, это решается значительно проще в PascalАВС.NЕТ. А если нужен именно старый код - Вам не сюда.

В чём суть программы: Возможно у Вас часто была следующая ситуация: вы набираете какой-то текст, но забываете переключить раскладку, и теперь всё нужно писать заново. Эта программа берёт порядок символов разных языков из текстовых документов, и в соответствии с ним делает текст «нормальным».

Как можно улучшить?

Не понял. Речь о замене символа на символ путем подстановки по таблице?

Понятно. А как определяется, что надо именно такую замену проводить?

Да. Они грузятся из текстовых файлов.

В одном файле единственная строка строка йцукен, во втором querty?

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

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

Я понимаю, речь о том, что символы просто в строку записаны, любой длины. Не проще сделать две строки в одном файле? Найденный в первой строке символ заменяется тем, который под ним записан во второй строке.

Видимо, трудный вопрос задал… )))) Но как бы хочется решение проблемы к паре строчек кода свести.

Что если нужно больше чем 2 языка?

Да не проблема, я о принципе замены спросил.

Да, замена по сути подстановкой по таблице

function TR(Self,sOld,sNew:string):string; extensionmethod;
begin
  Result:='';
  var n:=Min(sOld.Length,sNew.Length);
  for var i:=1 to Self.Length do begin
    var fnd:=false;
    for var j:=1 to n do
      if Self[i]=sOld[j] then begin
        Result+=sNew[j];
        fnd:=true;
        break
        end;
    if not fnd then Result+=Self[i]
    end
end;

begin
  var s1 := ReadAllText('Файл со старой кодировкой.txt');
  var s2 := ReadAllText('Файл с новой кодировкой.txt');
  var s := ReadlnString('Что перекодировать?');
  s.Tr(s1,s2).Print
end.

Пробуйте…

Это как? Вы точно правильно применили директиву?

{$string_nullbased+}

begin
  'abc'[0].Print;
end.

У меня многие модули, много напрямую работающие со строками по средствам .SubString и т.п. всегда имеют эту директиву, чтоб не путаться в индексах. И всегда всё работало.

@Noob

{$string_nullbased+}

begin
  // Откуда брать эти строки - ваше дело, как из файла заружать в 1 строку RAlex уже показал
  //Внимание: 2 символа ' потому что посреди строки в программе, если сувать в файл - надо 1 копию удалить
  var enc1 := 'qwertyuiop[]asdfghjkl;''\zxcvbnm,./';
  var enc2 := 'йцукенгшщзхъфывапролджэ\ячсмитьбю.';
  
  ReadString('Строка для перевода:')
  .Select(ch->
  begin
    var ind := enc1.IndexOf(ch);
    Result := ind=-1 ? ch : enc2[ind];
  end).Print;
  
end.
1 лайк