Страница 4 из 4

Re: Си или Паскаль. Что можно и что нет.

СообщениеДобавлено: 07.11.2016 09:07:37
runewalsh
У меня и другой пример есть, чуть менее очевидный (и менее реальный тоже, это да, но не сильно; если работает — увеличить N):
Код: Выделить всё
{$mode objfpc} {$h+}
uses
  heaptrc, SysUtils;

var
  list: array of string;

  function ListIndex(index: integer): integer;
  const
    N = 4;
  var
    i: integer;
  begin
    SetLength(list, length(list) + N);
    for i := 1 to N do
      list[High(list) - N + i] := '(ListIndex ' + IntToStr(i) + '/' + IntToStr(N) + ')';
    result := index;
  end;

var
  i: integer;

begin
  SetLength(list, 1);
  list[ListIndex(0)] := '(test)';

  for i := 0 to High(list) do
    write(list[i], ' '); // ожидается: (test) (ListIndex 1/N) (ListIndex 2/N) ... (ListIndex N/N)
  writeln;
end.

Re: Си или Паскаль. Что можно и что нет.

СообщениеДобавлено: 07.11.2016 09:18:01
bormant
Подобные штуки называются "функции с побочным эффектом", собственно эффект везде одинаков, да и рецепт стандартный -- избегать побочных эффектов, не смешивать адресацию до и после побочного эффекта.