@VanBer

Почему появляется сдвиг индексации массива при передачи в функцию?

Хоть через параметр-переменную, хоть по значению. В главной программе все работает в соответствии с правилами массивов в паскале: индексация с единицы. Передаем в функцию - индексация с нуля(первый символ). С какого перепугу функция языка ломает правила массивов этого же языка? Что происходит? Free Pascal. Код прикрепляю ниже:
program example;
function isTagCode(var source: array of char): boolean;
var
    n, m: integer;
    try: array [1..6] of char;
    tag: array [1..6] of char = '{CODE}';
begin
    writeln(source[0]);
    for n := 0 to length(source) do
        if(source[n] = '{') then
        begin
            try[1] := source[n];
            for m := 1 to length(tag) do
                try[m] := source[n + m - 1];
            if(try = tag) then
                isTagCode := true
        end
end;
var
    source: array [1..100] of char;
begin
    readln(source);
    writeln(source[1]);
    if(isTagCode(source)) then
        writeln('ok');
end.
  • Вопрос задан
  • 43 просмотра
Решения вопроса 1
@zedxxx
в соответствии с правилами массивов в паскале: индексация с единицы

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

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

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

for n := Low(source) to High(source) do
  writeln(source[n]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bormant
Что-то мудрёно...
Отчего не тривиальное:
const
  tag = '{CODE}';
var
  src: String;
begin
  ReadLn(src);
  WriteLn(src[1]);
  if Pos(tag,src)>0 then
    WriteLn('ok');
end.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы