Текущий архив: 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