powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не работает простая фунция
21 сообщений из 21, страница 1 из 1
Не работает простая фунция
    #39472785
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
procedure TForm1.Button1Click(Sender: TObject);

function bujhm (str1,str2: string) : string;
begin
    result:=str1+str2;
end;

var
str1,str2,str3: string;
begin
    edit1.Text := str1;
    edit2.Text := str2;
    str3 := bujhm(str1, str2);
    memo1.lines.add('проверка '+ str3 + ' !');
    edit2.Text := str3 + '  !';
end;
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472803
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

так и говорит, не буду работать? откуда уверенность, что не работает? У меня работает. D2006.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472804
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button1Click(Sender: TObject);

function bujhm (str1,str2: string) : string;
begin
    result:=str1+str2;
end;

var
str1,str2,str3: string;
begin
//    edit1.Text := str1;
//    edit2.Text := str2;
    str1 := edit1.Text;
    str2 := edit2.Text;

    str3 := bujhm(str1, str2);
    memo1.lines.add('проверка '+ str3 + ' !');
    edit2.Text := str3 + '  !';
end;
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472806
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr, спасибо
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472880
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar
Код: pascal
1.
2.
3.
4.
function bujhm (str1,str2: string) : string;
begin
    result:=str1+str2;
end;


Не делайте так! Всегда типы, которые не укладываются в регистр (string, array, record, возможно Int64 и т.п.) передавайте только как const или var, в противном случае у вас при вызове процедуры/функции происходит копирование этих данных в отдельные переменные (передача ByVal, а не ByRef).

Код: pascal
1.
2.
3.
4.
function bujhm(>>const<< str1, str2: string): string;
begin
    result := str1 + str2;
end;
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472899
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,cgfcb,j
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472900
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,спасибо
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472947
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpGallemar
Код: pascal
1.
2.
3.
4.
function bujhm (str1,str2: string) : string;
begin
    result:=str1+str2;
end;


Не делайте так! Всегда типы, которые не укладываются в регистр (string, array, record, возможно Int64 и т.п.) передавайте только как const или var, в противном случае у вас при вызове процедуры/функции происходит копирование этих данных в отдельные переменные (передача ByVal, а не ByRef).

Код: pascal
1.
2.
3.
4.
function bujhm(>>const<< str1, str2: string): string;
begin
    result := str1 + str2;
end;



"Вы, сударь, ерунду говорите. И хуже всего то, что говорите безапеляционно и уверенно"
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472974
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi"Вы, сударь, ерунду говорите. И хуже всего то, что говорите безапеляционно и уверенно"
Мда, сейчас на XE2 проверил - действительно, вызовы ничем не отличаются, хотя в своё время (на какой-то древней версии) я когда искал из-за чего медленно работает код, то натыкался на такое поведение и с тех пор привык везде писать const.
Мой косяк.

Но, есть нюанс. Простой код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
program sstrparam;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

function WoC(a, b: string): string;
begin
  result := a + b;
end;

function WC(const a, b: string): string;
begin
  result := a + b;
end;

var
  a, b, c: string;
begin
  a := 'this is a';
  b := ' and this is b';
  c := WoC(a, b);
  WriteLn(c);
  c := WC(a, b);
  WriteLn(c);
end.


А теперь смотрим на код одинаковых с виду процедур:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
sstrparam.dpr.11: begin
00419A58 55               push ebp
00419A59 8BEC             mov ebp,esp
00419A5B 83C4F4           add esp,-$0c
00419A5E 894DF4           mov [ebp-$0c],ecx
00419A61 8955F8           mov [ebp-$08],edx
00419A64 8945FC           mov [ebp-$04],eax
00419A67 8B45FC           mov eax,[ebp-$04]
00419A6A E855C4FEFF       call @UStrAddRef
00419A6F 8B45F8           mov eax,[ebp-$08]
00419A72 E84DC4FEFF       call @UStrAddRef
00419A77 33C0             xor eax,eax
00419A79 55               push ebp
00419A7A 68AE9A4100       push $00419aae
00419A7F 64FF30           push dword ptr fs:[eax]
00419A82 648920           mov fs:[eax],esp
sstrparam.dpr.12: result := a + b;
00419A85 8B45F4           mov eax,[ebp-$0c]
00419A88 8B4DF8           mov ecx,[ebp-$08]
00419A8B 8B55FC           mov edx,[ebp-$04]
00419A8E E861CBFEFF       call @UStrCat3
sstrparam.dpr.13: end;
00419A93 33C0             xor eax,eax
00419A95 5A               pop edx
00419A96 59               pop ecx
00419A97 59               pop ecx
00419A98 648910           mov fs:[eax],edx
00419A9B 68B59A4100       push $00419ab5
00419AA0 8D45F8           lea eax,[ebp-$08]
00419AA3 BA02000000       mov edx,$00000002
00419AA8 E893C3FEFF       call @UStrArrayClr
00419AAD C3               ret 
00419AAE E981BAFEFF       jmp @HandleFinally
00419AB3 EBEB             jmp $00419aa0
00419AB5 8BE5             mov esp,ebp
00419AB7 5D               pop ebp
00419AB8 C3               ret 

sstrparam.dpr.16: begin
00419ABC 55               push ebp
00419ABD 8BEC             mov ebp,esp
00419ABF 83C4F4           add esp,-$0c
00419AC2 894DF4           mov [ebp-$0c],ecx
00419AC5 8955F8           mov [ebp-$08],edx
00419AC8 8945FC           mov [ebp-$04],eax
sstrparam.dpr.17: result := a + b;
00419ACB 8B45F4           mov eax,[ebp-$0c]
00419ACE 8B4DF8           mov ecx,[ebp-$08]
00419AD1 8B55FC           mov edx,[ebp-$04]
00419AD4 E81BCBFEFF       call @UStrCat3
sstrparam.dpr.18: end;
00419AD9 8BE5             mov esp,ebp
00419ADB 5D               pop ebp
00419ADC C3               ret 



Т.е. первую (без const) компилятор ещё и в try / finally обернул. Поэтому, если вы переданные строки в процедуре не модифицируете, лучше всё-таки с const.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472978
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpТ.е. первую (без const) компилятор ещё и в try / finally обернул. Поэтому, если вы переданные строки в процедуре не модифицируете, лучше всё-таки с const.
Потому что по умолчанию var. См. опции компилятора.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472982
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanalekcvpТ.е. первую (без const) компилятор ещё и в try / finally обернул. Поэтому, если вы переданные строки в процедуре не модифицируете, лучше всё-таки с const.
Потому что по умолчанию var. См. опции компилятора.wadman, это касается только ShortString
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39472993
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А теперь попробуем с массивом:
Код: pascal
1.
2.
3.
4.
function WoC(a: array of char): string;
begin
  result := a;
end;



Оппа! Копирование!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
sstrparam.dpr.11: begin
00419A58 55               push ebp
00419A59 8BEC             mov ebp,esp
00419A5B 83C4F4           add esp,-$0c
00419A5E 53               push ebx
00419A5F 56               push esi
00419A60 8BDA             mov ebx,edx
00419A62 03DB             add ebx,ebx
00419A64 43               inc ebx
00419A65 85DB             test ebx,ebx
00419A67 780A             js $00419a73
00419A69 C1EB02           shr ebx,$02
00419A6C 8B3498           mov esi,[eax+ebx*4] <----
00419A6F 4B               dec ebx
00419A70 56               push esi                        
00419A71 79F9             jns $00419a6c <-----
00419A73 8BC4             mov eax,esp
00419A75 894DF4           mov [ebp-$0c],ecx
00419A78 8955F8           mov [ebp-$08],edx
00419A7B 8945FC           mov [ebp-$04],eax
sstrparam.dpr.12: result := a;
00419A7E 8B45F4           mov eax,[ebp-$0c]
00419A81 8B55FC           mov edx,[ebp-$04]
00419A84 8B4DF8           mov ecx,[ebp-$08]
00419A87 41               inc ecx
00419A88 E837CAFEFF       call @UStrFromWArray
sstrparam.dpr.13: end;
00419A8D 8B75EC           mov esi,[ebp-$14]
00419A90 8B5DF0           mov ebx,[ebp-$10]
00419A93 8BE5             mov esp,ebp
00419A95 5D               pop ebp
00419A96 C3               ret 
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473009
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpОппа! Копирование!
Что логично. У строк есть COW, именно поэтому дельфя рулит счётчиком при передаче строки по значению. У массивов COW нет, поэтому защититься от изменения можно только копированием. Кстати, вот полезная ссылка на тему ByRef vs. ByVal.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473022
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyalekcvpОппа! Копирование!
Что логично. У строк есть COW, именно поэтому дельфя рулит счётчиком при передаче строки по значению. У массивов COW нет, поэтому защититься от изменения можно только копированием.
Ну так о чём и речь - если вам в процедуре нужны только значения, передавайте параметры как const - будет быстрее и короче.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473028
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpесли вам в процедуре нужны только значения, передавайте параметры как const - будет быстрее и короче
Это, кстати, относится уже и к объектам. NEXTGEN неотвратим, как смерть.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473043
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЭто, кстати, относится уже и к объектам. NEXTGEN неотвратим, как смерть.
Хм, а можно ссылку где почитать про объекты? Они же вроде как указатели всегда были?
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473056
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeyalekcvpесли вам в процедуре нужны только значения, передавайте параметры как const - будет быстрее и короче
Это, кстати, относится уже и к объектам. NEXTGEN неотвратим, как смерть.Я не понял прикола. Объект всегда передается как указатель на его инстанс в куче, какая разница, с const или без ?
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473069
Gerasimenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure TForm1.Button1Click(Sender: TObject);

function bujhm (str1,str2: string) : string;
begin
    result:=str1+str2;
end;

var
str1,str2,str3: string;
begin
//    edit1.Text := str1;
//    edit2.Text := str2;
    str1 := edit1.Text;
    str2 := edit2.Text;

    str3 := bujhm(str1, str2);
    memo1.lines.add('проверка '+ str3 + ' !');
    edit2.Text := str3 + '  !';
end;



Код: pascal
1.
2.
3.
4.
 begin
  memo1.lines.add('Проверка: '+ bujhm(Edit1.Text, Edit2.Text) + ' !');
  Edit2.Text:=memo1.lines[memo1.Lines.Count-1]+'!';
end;
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473071
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpХм, а можно ссылку где почитать про объекты?
http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Automatic_Reference_Counting_in_Delphi_Mobile_Compilers
alekcvpОни же вроде как указатели всегда были?
Ну так и строки с динамическими массивами тоже указатели :) В некстгене у объектов появился счётчик ссылок, т.ч. там они тоже управляемые и разница между ref и val есть. А если учесть, что методы модифицирующие счётчик являются ещё и виртуальными...
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473074
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КвейдОбъект всегда передается как указатель на его инстанс в куче, какая разница, с const или без ?
И интерфейс, например, всегда. А разница есть. В одном случае счётчик дёргается в другом нет.
...
Рейтинг: 0 / 0
Не работает простая фунция
    #39473099
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Но, есть нюанс. Простой код:
...


Строки (и интерфейсы) не копируются, у них меняется счетчик ссылок. Строка будет копироваться (если не указано const или var) только перед ее реальным изменением внутри процедуры. Нет изменения - только расходуются команды на пролог/эпилог процедуры.

record, object копируются (что в общем-то логично, так как передаются по ссылке, а семантика языка требует, чтобы переданный параметр не менялся, если это явно не указано).
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не работает простая фунция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]