Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача через нетипизированный параметр как динам, намических, так и статических массивов 
:(
    Опции темы
Hvatit
Дата 11.11.2013, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.11.2013

Репутация: нет
Всего: нет



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

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

Начнём, пожалуй, с передачи динамического.
Код
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.

В чём же здесь секрет? Как мне построить правильнее процедуру?
PM MAIL   Вверх
PointerToNil
Дата 12.11.2013, 05:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 2
Всего: 6



Код

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

PM MAIL   Вверх
Hvatit
Дата 12.11.2013, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.11.2013

Репутация: нет
Всего: нет



Цитата(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;


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

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

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

Жду ещё предложений.
PM MAIL   Вверх
PointerToNil
Дата 12.11.2013, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



*


Профиль
Группа: Участник
Сообщений: 108
Регистрация: 17.6.2013

Репутация: 2
Всего: 6



Код

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.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.