Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

Есть ли разница передавать указатель или var-параметр?   Найти похожие ветки 

 
Begining   (2007-05-26 06:38) [0]

В функции, в смысле.


 
TUser ©   (2007-05-26 06:42) [1]

Есть :)


 
Begining   (2007-05-26 06:45) [2]

Но вы не знаете какие? А если знаете, то не скажите, как Матроскин?


 
TUser ©   (2007-05-26 06:50) [3]

Компилятор будет по-разному котролировать типы. Например,
type
PInteger = ^Integer;

procedure A (var I: integer);
begin
 inc (I);
 ShowMessage (inttostr (I));
end;

procedure B (I: PInteger);
begin
 inc (I^);
 ShowMessage (inttostr (I^));
end;

procedure TForm1.Button1Click(Sender: TObject);
var s: string;
begin
 s := "100";
 A (s); // Вот это не скомпилируется
 B (@s); // А вот тут будет все ок, то есть ошибка на стадии исполнения
end;


 
Однокамушкин   (2007-05-26 07:37) [4]

Когда формальный параметр является указателем, можно передавать nil... а вот с var-параметром такое не пройдёт...

А кроме того, для var-параметров компилятор лучше контролирует соответствие типов... а то, например, Pointer совместим с любым указателем...


 
homm ©   (2007-05-26 07:42) [5]

> А кроме того, для var-параметров компилятор лучше контролирует
> соответствие типов... а то, например, Pointer совместим
> с любым указателем...

Помоему это какой-то опцией компиляции подкручивается. isn"t it?


 
begin...end ©   (2007-05-26 07:43) [6]

> Однокамушкин   (26.05.07 07:37) [4]
>  а вот с var-параметром такое не пройдёт...

Пройдёт, путём приведения типа и разыменования.


 
@!!ex ©   (2007-05-26 09:54) [7]

> Когда формальный параметр является указателем, можно передавать
> nil... а вот с var-параметром такое не пройдёт...

Ага. На тиыкался на такое...
В MSDN написано, если .... укажите пустой указатель... А в хедере var стоит... Хрена там пустой указатель передаш... ПРиходилось извращатся.

P.S.
С одной стороны эти const и var - удобно, с другой - зло, поскольку сбивает:
1) Те, кто знает как работаю указатели - оно нафиг не надо.
2) Кто не знает, так и не узнает.... А указатели - чуть ли не смаое главное что нужно хорошо понимать, чтобы AV не наделать.


 
palva ©   (2007-05-26 10:01) [8]

> В MSDN написано,...
Авторы MSDN ничего не знают о правилах передачи параметров в паскале.


 
Однокамушкин   (2007-05-26 10:48) [9]


> palva ©   (26.05.07 10:01) [8]
> Авторы MSDN ничего не знают о правилах передачи параметров
> в паскале.

А вот те, кто портировал заголовочные файлы в паскаль, по идее знали, где нужно передавать nil, а где - нет... и соответсвенно надо было выбирать, где делать var, а где указатель...


> begin...end ©   (26.05.07 07:43) [6]
>
> Пройдёт, путём приведения типа и разыменования.


Да, действительно... не знал раньше, спасибо!


 
@!!ex ©   (2007-05-26 11:33) [10]

> Авторы MSDN ничего не знают о правилах передачи параметров
> в паскале.

LOL.
Если вы не в курсе, за виндой до сих пор Паскалевое наследие плетется.(Во всяком случае до XP минимум)

Но я имел ввиду именно:

> А вот те, кто портировал заголовочные файлы в паскаль, по
> идее знали, где нужно передавать nil, а где - нет... и соответсвенно
> надо было выбирать, где делать var, а где указатель...


 
Anatoly Podgoretsky ©   (2007-05-26 15:06) [11]

> palva  (26.05.2007 10:01:08)  [8]

А авторы из Борланда знают?
Судя по различным заголовочным файлам, знают, но плохо.


 
Begining   (2007-05-27 03:55) [12]

 PMapArray = ^TMapArray;
 TMapArray = array of TMapA;


Почему если я передаю в функцию "aMapA : PMapArray;"
То когда пишу в ней Length(aMapA), мне выдаётся ошибка?

А когда передаю как var, то всё нормально работает?


 
VirEx ©   (2007-05-27 09:12) [13]


>  [12] Begining   (27.05.07 03:55)

поставь точку останова перед вызовом и смотри в окне CPU Debug


 
Romkin ©   (2007-05-27 13:16) [14]


> То когда пишу в ней Length(aMapA), мне выдаётся ошибка?

Потому что надо писать Length(aMapA^). Но это не очень: и так уже открытый массив - указатель, переменная типа TMapArray - указатель на указатель :)


 
b z   (2007-05-27 14:10) [15]

указатели - вред, но оч нужный :)


 
@!!ex ©   (2007-05-27 16:04) [16]

> [15] b z   (27.05.07 14:10)

Почему вред? Это основа работы компьюетра.


 
Piter ©   (2007-05-27 16:56) [17]

А вот вы расскажите лучше, есть ли разница между:

TSomeClass = class
...
end;


..........

procedure T1(var sc: TSomeClass);

procedure T2(sc: TSomeClass);


Есть ли разница в передаче параметров у процедур T1 и T2?
Тоже самое про динамические массивы сказать можно...


 
Однокамушкин   (2007-05-27 20:06) [18]


> Piter ©   (27.05.07 16:56) [17]
> А вот вы расскажите лучше, есть ли разница между:
> procedure T1(var sc: TSomeClass);
>
> procedure T2(sc: TSomeClass);
>
> Есть ли разница в передаче параметров у процедур T1 и T2?

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

> Тоже самое про динамические массивы сказать можно...

Да всё то же самое...


 
Мальчик из песочницы   (2007-05-28 09:25) [19]

Не надо const мешать в одну кучу с var. Было очень печально видеть массив без const и string без const среди параметров на сайте довольно продвинутого в остальном программиста. При этом эти параметры внутри процедуры не менялись.


 
@!!ex ©   (2007-05-28 09:53) [20]

> Мальчик из песочницы   (28.05.07 09:25)

Забыл. У меня иногда бывает, передаю стринги без конста, куда деватся.


 
DiamondShark ©   (2007-05-28 11:42) [21]


> Когда формальный параметр является указателем, можно передавать
> nil... а вот с var-параметром такое не пройдёт...

если очень хочется, то можно.

MyProc(PMyType(nil)^);


 
Однокамушкин   (2007-05-28 11:59) [22]


> DiamondShark ©   (28.05.07 11:42) [21]
> если очень хочется, то можно.
> MyProc(PMyType(nil)^);

Ветку до конца не читаем? begin..end об этом уже давным-давно написал...


> begin...end ©   (26.05.07 07:43) [6]
> > Однокамушкин   (26.05.07 07:37) [4]
> >  а вот с var-параметром такое не пройдёт...
>
> Пройдёт, путём приведения типа и разыменования.


 
@!!ex ©   (2007-05-28 11:59) [23]

> [21] DiamondShark ©   (28.05.07 11:42)

Да никто не спорит. Но это уже извращенство.


 
Суслик ©   (2007-05-28 12:20) [24]


>  [23] @!!ex ©   (28.05.07 11:59)
> > [21] DiamondShark ©   (28.05.07 11:42)
>
> Да никто не спорит. Но это уже извращенство.

в дельфи вапще полно извращений.
это одно из них.


 
ЮЮ ©   (2007-05-28 12:30) [25]

>в дельфи вапще полно извращений.

скорей, извращенцев :)



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
11-1162989060
heilong
2006-11-08 15:31
2007.06.24
layouts like QT в KOL


15-1180109668
ProgRAMmer Dimonych
2007-05-25 20:14
2007.06.24
Подкиньте, пожалуйста, ссылку


15-1180439083
Богдан1024
2007-05-29 15:44
2007.06.24
<META Name="keywords" Content="">


15-1179773449
Астроном
2007-05-21 22:50
2007.06.24
Фотография воды на Марсе...


3-1175160348
Asail
2007-03-29 13:25
2007.06.24
Field description