Страница 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));