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

Вниз

TNotifyEvent   Найти похожие ветки 

 
YuRock ©   (2004-01-06 20:05) [40]

> Vuk © (06.01.04 20:00) [37]

Я имелл в виду классику ("классы состоят из методов (функций) и свойств (данных)")


 
jack128 ©   (2004-01-06 20:08) [41]

Вот код для строк
{$O-}

procedure SameProcValue(s: string);
begin
end;

procedure SameProcConst(const s: string);
begin
end;

procedure SameProcVar(var s: string);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
S := StringOfChar("A", 10);
SameProcValue(s); // здесь breakpoint и View CPU
SameProcConst(s);
SameProcVar(s);
end;

{$O+}
В твоем примере, как и в моем передается указатель на данные (указатель на первый символ строки или на первый элемент массива)


 
Тимохов ©   (2004-01-06 20:10) [42]

jack128 © (06.01.04 20:08) [41]
Да наверное, ты прав. Я еще посмотрю это на свежую голову.
Наверное, только перед SameProcValue делается копия s, причем не в стеке, и указатель на эту копию и передается.

Да будем изучать asm.


 
jack128 ©   (2004-01-06 20:10) [43]

ну то есть в моем примере отличие в SameProcVar.

tp = procedure ({const}S: sss) of object; - закоментировать const - не коментировать - результат один. Ты попробуй поэксперементировать с даными у которых SizeOf(MyType) = 4


 
YuRock ©   (2004-01-06 20:12) [44]

> Тимохов © (06.01.04 19:50) [33]

Нет. Затолкается в стек только когда вообще ничего не писать перед параметром.

А const - то же, что и var, но с одним отличием: дельфя не даст откомпилить код, в котором будет хоть какой-нибудь намек на изменения параметра, переданного с директивой const (т.е. используется только для скорости), а var наоборот - для изменения и предназначен (хотя способ передачи идентичен const).


 
Тимохов ©   (2004-01-06 20:13) [45]

jack128 © (06.01.04 20:10) [43]
с Byte, Integer, Double - все работает ОК.


 
Тимохов ©   (2004-01-06 20:14) [46]

YuRock © (06.01.04 20:12) [44]
Вот похоже что вы не правы в "Затолкается в стек только когда вообще ничего не писать перед параметром", т.к. если бы это было так, то мой пример не работал бы. Наверное затолкается в стек все тот указатель, только на копию строки, созданную не в стеке.

Буду асм смотреть.


 
jack128 ©   (2004-01-06 20:19) [47]


> Тимохов © (06.01.04 20:13) [45]
> jack128 © (06.01.04 20:10) [43]
> с Byte, Integer, Double - все работает ОК.
Да?? Странно.. Напиши сюда о результах своих иследований -)


 
YuRock ©   (2004-01-06 20:28) [48]

> Тимохов © (06.01.04 20:14) [46]
Нет. Он работает не по-этому. А потому, что в дельфях переменная типа стринг - это и есть указатель.
Правда, менять она его не дает, если var не написать :)


 
Тимохов ©   (2004-01-06 20:29) [49]

А что писать? Просто в примере замени последовательно на byte, integer, double. Все работает.

type
tc = class
public procedure Show(const a: ТИП);
end;

procedure tc.Show;
begin
showmessage(floattostr(a));
end;

type
tp = procedure ({const}S: ТИП) of object;

procedure TForm1.Button17Click(Sender: TObject);
var
p: tp;
c: tc;
i: ТИП;
begin
c := tc.create();
tmethod(p).code := @tc.SetS;
tmethod(p).data := c;
i := 1223424;
p(i);
end;


 
Тимохов ©   (2004-01-06 20:32) [50]

YuRock © (06.01.04 20:28) [48]
Вы не правы - если ничего не писать, то менять параметр можно.
Проверил.


 
YuRock ©   (2004-01-06 20:42) [51]

> Тимохов © (06.01.04 20:14) [46]

Да, действительно мистика какая-то происходит... Не только для стринга, а для любых типов так... Наверно, все параметры на самом деле по 4 байта, а что там - адрес или значение - придумывает компилятор в зависимости от кода... Хотя это бред...


 
jack128 ©   (2004-01-06 20:43) [52]


> А что писать? Просто в примере замени последовательно на
> byte, integer, double. Все работает.

Я имел ввиду, вот это

> Да будем изучать asm.
Я с асмом на вы.

Лично мои домыслы таковы.
по значению.
Для типов SizeOf(Type) <= 4 передают копию параметра с стек.
Для типов SizeOf(Type) > 4 передают адрес параметра с стек.

по ссылке.
Для всех типов передается адрес параметра в стек

по константной ссылке
Для типов SizeOf(Type) <= 4 передают копию параметра с стек.
Для типов SizeOf(Type) > 4 передают адрес параметра с стек.

Если скажите что означает lea eax, [тра - ля - ля] , то выскажусь точнее -)


 
YuRock ©   (2004-01-06 20:45) [53]

> Тимохов © (06.01.04 20:32) [50]

Ну, правильно, можно, только при выходе из функции он "вернется на место"... Хотя если это в примере [15], то я не удивлюсь уже ничему.


 
jack128 ©   (2004-01-06 20:53) [54]


> Наверно, все параметры на самом деле по 4 байта, а что там
> - адрес или значение - придумывает компилятор в зависимости
> от кода... Хотя это бред...
Почему бред?
Вот еще один пример
{$O-}

procedure SameProcValue(s: string);
begin
PByte(s)^ := 49;
end;

procedure SameProcConst(const s: string);
begin
PByte(s)^ := 49;
end;

procedure SameProcVar(var s: string);
begin
PByte(s)^ := 49;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
S := StringOfChar("A", 10);
SameProcValue(s);
ShowMessage(s); s[1] := "A";
SameProcConst(s);
ShowMessage(s); s[1] := "A";
SameProcVar(s);
ShowMessage(s);
end;

{$O+}
А теперь замените тип параметра на integer и в процедурах напишите PInteger(@s)^ := 10; и посмотрите на результат (после выхода из каждой процедуры обнуляйте переменную s)



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

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

Наверх




Память: 0.57 MB
Время: 0.035 c
3-63005
Alex-kosmonavt
2003-12-23 11:21
2004.01.20
Insert


3-63006
chtr
2003-12-23 08:05
2004.01.20
Cannot access field as type Variant


7-63413
Tik
2003-10-31 11:52
2004.01.20
получить иконку


3-63042
ish
2003-12-24 17:58
2004.01.20
Фильтрация в БД Access


6-63273
Signed
2003-11-16 01:24
2004.01.20
Программно определить в чём неисправность