|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передача в процедуру параметров
Всем привет. Давайте подискупируем на следующую тему. Вот не пойму почему так происходит.
Например мы передаем строку для обработки в процедуру, и для обработки в нашей процедуре она сперва копируется в стек а потом производятся над ней действия. причем это не отображается на переменной которую передаем а только на его копии в процедуре. В этом случае будет передоваться информации ровно столько сколько занимает строка в памяти. Код:
procedure GetS(Str: string); ... Код:
procedure GetS(PStr: ^string); ... Код:
procedure GetS(PStr: Pointer); var str: ^string; begin str := PStr; ... Тогда как себя ведет вот такая передача? Код:
procedure GetS(var Str: string); ... Но если передавать объект в процедуру вот так Код:
procedure GetBtn(btn: TButton); ... Если у кого есть ссылки на статьи или свои домыслы очень интересное выслушать. Спасибо за уделенное время. Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит Прапор: вы не попали ни один раз. Программист: Пули вылетели, проблемы у вас. |
#2
|
|||
|
|||
1. Печедача var параметра - фпктически это и есть передача по указателю. Только компилятор скрывает от тебя всю математику этого.
2. Передача объектов (т.е. экземпляров классов) есть передача по указателю, т.к. любой объект есть указатель. Опять же, компилятор просто скрывает от тебя механизм разрешения ссылок в объектах. |
#3
|
|||
|
|||
Цитата:
вот например два варианта. вариант 1: dll Код:
library Lib1; users SysUtils; procedure Remark(pstr: pointer);stdcall; var str : ^string; begin str := pstr; str := str + 'String from DLL'; end; { или вот так procedure Remark(pstr: ^string);stdcall; begin ^pstr := ^pstr + 'String from DLL'; end; } export Remark; name 'Remark'; Код:
//подключаем procedure Remark(pstr: pointer);stdcall;external 'lib1.dll'; ... var sprog : string; .... procedure TForm1.BtnClick(...); begin s:= 'Program'; ShowMessage(s); Remark(s); ShowMessage(s); end; вариант 2: dll Код:
library Lib1; users SysUtils; procedure Remark(var pstr: string);stdcall; begin str := str + 'String from DLL'; end; export Remark; name 'Remark'; Код:
//подключаем procedure Remark(var pstr: string);stdcall;external 'lib1.dll'; ... var sprog : string; .... procedure TForm1.BtnClick(...); begin s:= 'Program'; Remark(s); ShowMessage(s); end; получается что var все таки как то по иному делает? Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит Прапор: вы не попали ни один раз. Программист: Пули вылетели, проблемы у вас. |
#4
|
|||
|
|||
Да, он делает это (внутри) подругому.
Вообще, кстати, передача паскалевских строк в/из dll не есть правильно. Лучше так не делать. Но если очень хочется, то подключай модуль ShareMem (кажется так). В нем реализован специальный менеджер памяти. Но тогда к твоей проге надо прикладывать borlandmm.dll. |
#5
|
|||
|
|||
Цитата:
Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит Прапор: вы не попали ни один раз. Программист: Пули вылетели, проблемы у вас. |
#6
|
|||
|
|||
кстати туже тему обсуждаю на другом форуме. http://www.sql.ru/forum/actualthread.aspx?tid=626534
Програмист приходит на стрельбище. Стреляет. Прапор смотрит на мешень и говорит Прапор: вы не попали ни один раз. Программист: Пули вылетели, проблемы у вас. |