Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Передача через нетипизированный параметр как динам


Автор: Hvatit 11.11.2013, 22:15
Необходимо написать процедуру, способную выводить двумерные динамические и статические массивы разной длины.

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

Начнём, пожалуй, с передачи динамического.
Код
program Project1;

var
  mas2 : array of integer;
  i : byte;

procedure outmas(var omas; size : byte);
  var
    outm : array of integer absolute omas;
    n : byte;
  begin
    setlength(outm,size);
    for n := low(outm) to high(outm) do
      write(outm[n]:3)
  end;

begin
  setlength(mas2,10);
  for i := low(mas2) to high(mas2) do
    begin
      randomize;
      mas2[i] := random(100)
    end;
  outmas(mas2,length(mas2));
  readln
end.

Эта программа работает безупречно.

Что же, идём дальше. А дальше нас ждут статические массивы.
Код
program Project1;

var
  mas1 : array[0..9] of integer;
  i : byte;

procedure outmas(var omas; size : byte);
  var
    outm : array of integer absolute omas;
    n : byte;
  begin
    setlength(outm,size);
    for n := low(outm) to high(outm) do
      write(outm[n]:3)
  end;

begin
  for i := low(mas1) to high(mas1) do
    begin
      randomize;
      mas1[i] := random(100)
    end;
  outmas(mas1,length(mas1));
  readln
end.

По моим представлениям это и должно было оказаться решением, но… оказалось, что программа просто-напросто вылетает. Путём проб и ошибок было выяснено, что если передавать ещё не забитый массив, то программа не вылетит. Пример:
Код
program Project1;

var
  mas1 : array[0..9] of integer;
  i : byte;

procedure outmas(var omas; size : byte);
  var
    outm : array of integer absolute omas;
    n : byte;
  begin
    setlength(outm,size);
    for n := low(outm) to high(outm) do
      write(outm[n]:3)
  end;

begin
  outmas(mas1,length(mas1));
  readln
end.

В чём же здесь секрет? Как мне построить правильнее процедуру?

Автор: PointerToNil 12.11.2013, 05:35
Код

  procedure outmas(omas: array of integer);
  var n : integer;
  begin
    for n := low(omas) to high(omas) do
      write(omas[n]:3)
  end;

Автор: Hvatit 12.11.2013, 16:02
Цитата(PointerToNil @  12.11.2013,  05:35 Найти цитируемый пост)
  
Код
procedure outmas(omas: array of integer);
  var n : integer;
  begin
    for n := low(omas) to high(omas) do
      write(omas[n]:3)
  end;


С открытым массивом всё понятно. Это я знаю.
Я ведь писал в начале темы, что двумерный открытый массив не существует, поэтому по аналогии с этой подпрограммой у меня не получится создать подпрограмму для двумерных (и более) массивов.

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

И встаёт закономерный вопрос, как же нам его так передать?
Чтобы было проще могу так сказать: перед вами стоит задача написать подпрограмму для вывода двумерных статических и динамических массивов, то есть неважно какой массив (адрес, размер или ещё что-то) вы передаёте. Главное, чтобы он выводился.

Жду ещё предложений.

Автор: PointerToNil 12.11.2013, 20:05
Код

program Project1;

{$APPTYPE CONSOLE}

var
  mas1 : array[0..9] of integer;
  mas2 : array of integer;
  i : byte;

procedure outmas(omas: pointer; size : byte);
type
  arr1 = array [0..268435456] of integer;
var
  outm: ^arr1 absolute omas;
  n : byte;
begin
  for n := 0 to size-1 do
    write(outm[n]:3)
end;

begin
  randomize;

  for i := low(mas1) to high(mas1) do
      mas1[i] := random(100);

  setlength(mas2,10);
  for i := low(mas2) to high(mas2) do
      mas2[i] := random(100);

  outmas(@mas1, length(mas1));
  outmas(mas2, length(mas2));
  readln;
end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)