Delphi передача массива в функцию и процедуру

В статье рассматриваются следующие вопросы:

  1. delphi передача переменных по ссылке.
  2. delphi передача в процедуру записей.
  3. delphi передача в процедуру массива.
  4. delphi открытый массив.

Delphi 7. Занятие 2_6. Часть 2.

Вернуться к Delphi 7. Занятие 2_6. Часть 1.

Для начала подготовим форму для рассмотрения разных вариантов передачи массивов в процедуры или функции.

delphi передача в процедуру массива

В первом примере будем передавать в процедуру запись через параметр-переменную и массив через параметр-значение (кнопка button1).

Во втором примере будем передавать в процедуру массив через параметр-переменную (кнопка button2).

В третьем примере будем передавать в функцию массив через параметр-значение. Функция будет возвращать массив, в элементах которого строковые значения будут переведены в верхний регистр (строчные буквы в прописные) (кнопка button3).

В четвёртую процедуру будем передавать открытый массив (кнопка button4).

В первой части занятия мы рассмотрели различные типа параметров, передаваемых в процедуры.

Теперь более подробно остановимся на параметре-переменной.

При использовании параметра такого типа в процедуру передаётся адрес, по которому хранится передаваемая переменная. По другому это называется передачей ссылки на переменную.

Delphi параметры переменные

Передача в процедуру записей.

Непосредственно объявить переменную типа «запись» в шапке самой процедуры нельзя.

Чтобы процедура получила возможность работать с полями записи, в процедуру передаётся ссылка на запись (параметр-переменная).

Таким образом, необходимо написать:

implementation
type tRec=record s:string; i:integer; end;
tArr=array[1..2,1..3] of string;
var vArray:tArr;

procedure pr(var vRec:tRec; vArr:tArr);//передача записи по ссылке. Параметр-переменная vRec в шапке процедуры и vvRec в обработчике клика по кнопке ссылаются на одну и ту же область памяти. Меняя vRec, мы тем самым меняем vvRec. vArr — параметр-значение для передачи данных массива.
begin
vRec.s:=vRec.s+vArr[1,vRec.i];
end;

В итоге в процедуре формируется поле записи.

procedure TForm1.Button1Click(Sender: TObject);
var vAr1:tArr; vvRec:tRec;
begin
vvRec.s:=’000000′; //формируем первое поле записи
vAr1[1,1]:=’111111′; //заполняем первую ячейку массива
vAr1[1,2]:=’222222′; //заполняем вторую ячейку массива
vvRec.i:=1; //формируем второе поле записи
pr(vvRec,vAr1); //вызываем процедуру
vvRec.i:=2; //изменяем второе поле записи
pr(vvRec,vAr1); //снова вызываем процедуру
edit1.Text:=vvRec.s; //отображаем результат
end;

Результат работы программы после нажатия на button1:

Если, наоборот, поля записи не должны изменяться в теле процедуры, то ключевое слово var в шапке процедуры заменяется на ключевое слово const.

В этом случае поля записи используются только как источник значений.

Передача в процедуру массива по ссылке.

В delphi передача в процедуру массива может осуществляться двумя способами.

Первый способ — через парамерт-значение. При этом связь между значениями передаваемого массива и массива в процедуре разрывается. Эти массивы оказываются изолированными друг от друга.

Второй способ — через параметр-переменную. При этом изменения в массиве, расположенном в процедуре, сразу вызывают изменения в самом передаваемом массиве.

Рассмотрим вариант процедуры, возвращающий массив, значения элементов которого будут модифицированы в процедуре.

Этот вариант следует применять тогда, когда размер массива значителен.

Ведь при передаче массива как параметра-значения он целиком переписывается в стек. Если процедура вызывается часто, а массив велик, то время на это становится заметным и скорость работы программы уменьшается.

При передаче массива как var-параметра передаётся только ссылка на массив.

procedure prAr(var vArr:tArr); //массив передаётся по ссылке
begin
vArr[1,1]:= ‘$$$$$$$$$$’; //модифицируем первый элемент массива
vArr[1,2]:= ‘@@@@@@@@@@’; //модифицируем второй элемент массива
end;

И вызов процедуры:

procedure TForm1.Button2Click(Sender: TObject);
var vAr1:tArr;
begin
prAr(vAr1); //вызываем процедуру, передаём ссылку на массив
edit3.Text:=vAr1[1,1]; //выводим первый элемент массива
edit4.Text:=vAr1[1,2]; //выводим второй элемент массива
end;

Delphi передача массива в функцию по значению.

Функция, возвращающая массив.

Создадим функцию, в которую массив передаётся через параметр-значение.

implementation
type tRec=record s:string; i:integer; end;
tArr=array[1..2,1..3] of string;
var vArray:tArr;


function fr(vArr:tArr; n,k:integer):tArr; //функция возвращает массив
//k – номер элемента в массиве; n- число символов в строке, которая содержится в элементе массива.
var s:string; i:integer;
begin
for i:=1 to n do //цикл по всем символам строки
begin
//воспользуемся тем свойством строки s, что символ, стоящий на i-ой позиции в строке s, можно прочитать как элемент массива: s[i]
//так как vArr[1,k] возвращает строку, то vArr[1,k][i] возвращает символ строки из i-той позиции.
vArr[1,k][i] :=upCase(vArr[1,k][i]); //превращения i-го символа строки из строчной буквы в прописную.
end;
fr:=vArr; //возвращаем результат работы функции (другой вариант возвращения результата — result:=vArr;)
end;

Вызовем функцию на выполнение:

procedure TForm1.Button3Click(Sender: TObject);
var vAr1:tArr; n:integer;
begin
vAr1[1,1]:=’aaaaa’; //заполним первый элемент массива
n:=length(vAr1[1,1]); //первый элемент массива хранит строку. Определяем её длину.
form1.Edit1.Text:=vAr1[1,1]; //отображаем исходное значение первого элемента массива
form1.Edit2.Text:=fr(vAr1,n,1)[1,1];//отображаем содержимое элемента массива после преобразования.
vArray[1,1]:= fr(vAr1,n,1)[1,1]; //сохраняем элемент массива в глобальном массиве (считаем, что преобразованные значения будут нужны далее в других частях программы)
//если посмотреть объявление функции, то видно, что она возвращает массив. Поэтому fr(vAr1,n,1) — это ссылка на массив
//аналогично для второй ячейки массива
vAr1[1,2]:=’bbbbbbbbb’;
n:=length(vAr1[1,2]);
form1.Edit3.Text:=vAr1[1,2];
form1.Edit4.Text:=fr(vAr1,n,2)[1,2];
vArray[1,1]:= fr(vAr1,n,1)[1,1];
//отображаем новые (преобразованные) значения элементов массива
form1.Edit5.Text:=vArray[1,1]+’ ‘+vArray[1,2];
end;

В результате получим:

delphi передача в процедуру массива

Передача массива в процедуру через параметр «открытый массив»

Объявление так называемого «открытого» массива отличается от объявления обычного массива тем, что не указывается размерность массива: vArr:array of string.

В delphi открытый массив может быть только одномерным.

По сути, в функцию передаётся указатель на начало массива.

Количество элементов массива (высшая граница массива) определяется с помощью функции high().

Ценность открытых массивов неочевидна. Но в сложных программах они оказываются очень полезны.

Рассмотрим пример.

type tAr2=array[1..2] of string;
function fOpen(vArr:array of string):string;
var s:string; i,n:integer;
begin
i:=0; s:=’ ‘;
n:=high(vArr);//определение верхнего индекса массива (нижний индекс открытого массива всегда 0)
repeat
s:=s+’элемент массива №’+intToStr(i)+’ ‘+vArr[i];
inc(i);//процедура увеличения целого числа на 1
until i>n; цикл будет повторяться до тех пор, пока i не станет больше n.
result:=s; //возвращаем результат
end;

Вызываем функцию.

procedure TForm1.Button4Click(Sender: TObject);
var vAr2:tAr2;
begin
vAr2[1]:=’11111′;
vAr2[2]:=’22222′;
form1.edit1.Width:=400;//устанавливаем новую ширину поля компонента edit1
form1.edit1.Text:=fOpen(vAr2);//передаём в функцию ссылку на массив и получаем результат
end;

Результат работы программы:

delphi передача в процедуру массива

Обновлено: 24.09.2021 — 21:17

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *