Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.01 c
3-63012
BlackCat
2003-12-23 04:17
2004.01.20
Как отфильтровать таблицу по указанному полю (MS Access + ADO)


4-63450
tim
2003-10-15 12:06
2004.01.20
сеть не видно в сервисе


1-63079
Skipidar
2004-01-10 06:26
2004.01.20
Информация о зарегистрированном типе файла


1-63233
Zeon
2004-01-05 00:36
2004.01.20
Проги под Linux


1-63089
andrey__
2003-12-30 13:57
2004.01.20
TServiceApplication





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский