Страница 1 из 1
Помогите склеротику: передача параметра-записи по зна
Добавлено:
11.08.2008 23:09:08
Cheb
Не использовал этот изврат со времён Турбо Паскаля, сейчас понадобилось - и понял, что напрочь забыл синтаксис! А в гугле что-то "крокодил не ловится". Помогите слабоумному, подскажите что надо писать в таком случае:
- Код: Выделить всё
type TMyRecord = record
b: TSomeEnum;
c: TSomeOtherEnum;
d: integer;
end;
procedure proc(v: TMyRecord);
....
//вызов:
proc(????);
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
11.08.2008 23:37:54
FedeX
Я наверно немного не понял вопрос...
но если совсем просто, то:
1.обьявить переменную
var rec:TMyRecord;
2. передать в процедуру:
proc(rec);
или (чтоб не переполнять стёк например):
procedure proc(const[var] v: TMyRecord);
....
//вызов:
proc(rec);
или ещё так:
procedure proc(v: PMyRecord);// PMyRecord=^TMyRecord;
....
//вызов:
proc(@rec);
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
12.08.2008 02:05:06
Cheb
Короче, я изменил архитектуру и обошёлся без извращения.
Но вопрос остаётся открытым. Вроде бы, можно было как-то передавать записи по значению без создания промежуточной переменной.
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
12.08.2008 02:25:17
wavebvg
При работе с объектами (в частности с классами), можно передавать только ссылку на сам объект - см 2 пример вышеизложенного поста
Может имелся в виду рекурсивный вызов процедуры?
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
12.08.2008 10:42:50
Cheb
Нет, имелась в виду именно передача записи, и именно по значению.
То есть, я должен так понимать, что ОП мудрит, и вместо передачи по значению втихую устраивает передачу по ссылке?
Тогда понятно, почему об этом нигде нет.
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
12.08.2008 11:22:36
Sergei I. Gorelkin
Передача чего бы то ни было по значению - это создание копии, т.к. подразумевает возможность изменения переданного значения, не затрагивая оригинал. В случае записи копирование может быть как путем запихивания в стек на вызывающей стороне, так и путем создания локальной переменной на вызываемой. Первый вариант, возможно, применялся во времена TurboPascal, и до сих пор применяется в ABI некоторых систем (пример - Darwin), но с ним все становится очень интересно, когда в записи появляются всякие ansistring. Кроме того, второй вариант короче в байтах, т.к. код копирования находится только в начале вызываемой ф-ции.
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
19.08.2008 18:27:32
Михаил Крамер
Не догнал, в чём проблема
- Код: Выделить всё
type
rt = record
a,b: Integer;
end;
var
rv: rt;
procedure v(pr: rt);
begin
pr.a:= pr.b;
end;
begin
rv.a:= 15;
v(rv);
writeln(rv.a);
end.
Вывод программы - 15, т.е. всё сработало
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
20.08.2008 01:43:12
Sergei I. Gorelkin
Присвоил поле "а" и его же вывел - естественно, сработало
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
20.08.2008 16:04:32
Михаил Крамер
Я имел в виду, что изменения, произведнные внутри процедуры, не повлияли на глобальную переменную, как и должно было произойти при передаче параметра по значению - т. е. записи передавать по значению возможно, и не понятно, о чём собственно вопрос.
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
20.08.2008 16:42:02
Sergei I. Gorelkin
Мда, по ходу я сам запутался и других запутал... Я имел в виду промежуточную переменную, создаваемую компилятором для хранения локальной копии записи, и пытался показать, что она так или иначе создается.
Cheb, похоже, имел в виду создание записи непосредственно при вызове ф-ции, не объявляя переменную - вроде того, как это можно делать с массивами:
- Код: Выделить всё
procedure foo(const a: array of integer);
...
foo([12, 23, 34]);
Этот номер с записями не работает (увы).
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
20.08.2008 20:54:18
Михаил Крамер
Сергей, Ваш то пост я понял. Но тут некоторые писали, что типа записи вообще передаются исключительно по ссылке, а не позначению...
Re: Помогите склеротику: передача параметра-записи по з
Добавлено:
20.08.2008 23:23:01
FedeX
>Первый вариант, возможно, применялся во времена TurboPascal
ну вродь если процедура stdcall то и сейчас параметр запихиваеться в стёк. вроде так..
>Но вопрос остаётся открытым. Вроде бы, можно было как-то передавать записи по значению без создания промежуточной переменной.
вродь никак.
хотя можно наварганить что-то вроде:
- Код: Выделить всё
TPoint=record
x,y:integer;
end;
function Point(x,y):TPoint;
begin result.x:=x;result.y:=y; end;
//и использовать так
SetPoint(Point(10,20));