Помощь - Поиск - Пользователи - Календарь
Полная версия: динамические массивы, непонятное поведение
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
klem4
есть 2 практически идентичных программы, суть - вывести на экран все варианты перестановок элементов массива
Первая работает со статическим массивом, вторая с динамическим и вот вторая почему-то отрабатывает не верно((

1-я

uses crt;

const
  n = 3;

type
  tarr = array [1..n] of integer;

procedure pr(const arr: tarr);
var
  i: integer;
begin
  writeln;
  for i := 1 to n do write(arr[i]:3);
end;

procedure sw(var arr: tarr; const p, q: integer);
var
  T: integer;
begin
  T := arr[p];
  arr[p] := arr[q];
  arr[q] := T;
end;

procedure nx(arr: tarr; i: integer);
var
  j: integer;
begin
  for j := i to n do begin
    if i <> j then begin
      sw(arr, i, j);
      pr(arr);
    end;
    nx(arr, i + 1);
  end;
end;

var
  a: tarr = (1, 2, 3);

begin
  clrscr;
    pr(a);
    nx(a, 1);
  readln;
end.


2-я
{$R-}
uses crt;

const
  n = 3;

type
  parr = ^tarr;
  tarr = array [1..1] of integer;

procedure pr(const arr: parr);
var
  i: integer;
begin
  writeln;
  for i := 1 to n do write(arr^[i]:3);
end;

procedure sw(var arr: parr; const p, q: integer);
var
  T: integer;
begin
  T := arr^[p];
  arr^[p] := arr^[q];
  arr^[q] := T;
end;

procedure nx(arr: parr; i: integer);
var
  j: integer;
begin
  for j := i to n do begin
    if i <> j then begin
      sw(arr, i, j);
      pr(arr);
    end;
    nx(arr, i + 1);
  end;
end;

var
  a: parr;
  i: integer;

begin
  clrscr;

    GetMem(a, n * sizeof(tarr));
    for i := 1 to n do a^[i] := i;

    pr(a);
    nx(a, 1);

    FreeMem(a, n * sizeof(tarr));
  readln;
end.
volvo
Цитата
и вот вторая почему-то отрабатывает не верно
Потому что в случае статического массива у тебя в стеке хранится копия массива (в NX), а в случае динамического - указатель на область памяти, следовательно содержимое самого массива может (и будет) меняться...
klem4
точняк ... спасибо
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.