Форум: "Прочее";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
ВнизРезультат трехчасовых поисков ошибки в проекте :) Найти похожие ветки
← →
DiamondShark © (2007-12-10 23:09) [120]Кстати, интересно. Люди, посмотрите, кто может, как компилит выражения Дельфи для НЕТ.
Всё-таки, там стековая машина, значит кодогенератор будет отличаться от нативного х86.
← →
Mystic © (2007-12-11 16:40) [121]
> О каких операндах ты говоришь
> ShowMessage(IntToStr(Funct1(Param) + Funct2(Param)));Когда
> у Funct1, Funct2 и у IntToStr по одному операнду.
У "+" есть два операнда Funct1(Param) и Funct2(Param). Где указано, в каком порядке они будут вычисляться?
Понятно, что в случае выражений
a + b * c вначале будет выполняться *, а потом + (приоритет)
a + b - c вначале будет выполняться +, а потом - (левоассоциативность)
похожие правила есть в любом языке программирования.
Но порядок вычисления операндов a, b, c не фиксирован.
← →
Anatoly Podgoretsky © (2007-12-11 18:34) [122]> Mystic (11.12.2007 16:40:01) [121]
> a + b - c вначале будет выполняться +, а потом - (левоассоциативность)
> похожие правила есть в любом языке программирования.
Из справки
> Because functions return a value, function calls are expressions.
← →
guav © (2007-12-11 21:40) [123]> [122] Anatoly Podgoretsky © (11.12.07 18:34)
Угадайте что напишет программа:program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
function F1(): string;
begin
Write("First ");
Result := "Third ";
end;
function F2(): string;
begin
Write("Second ");
Result := "Fourth";
end;
procedure F3(X1: string; X2: string = "");
begin
WriteLn;
end;
begin
WriteLn(F1(), F2());
F3(F1(), F2());
F3(F1() + F2());
ReadLn;
end.
← →
tesseract © (2007-12-11 22:30) [124]
> Кстати, интересно. Люди, посмотрите, кто может, как компилит
> выражения Дельфи для НЕТ
В CLR компилит. Исполнение обеспечивает именно CLR. Ее прикол.
> Результат выполнения машинного кода должен быть один и тот
> же независимо от того, как процессор его выполняет. Так
> что какой бы он супер-пупер не был, семантика не должна
> меняться иначе не будет совместимости с предыдущими поколениями
> процессоров этого семейства, а она есть.То есть в случае
> x86 всё зависит от компилятора, а нет от процессора.
Вторая фукнция может выполниться раньше первой. Хотя черт знает - скорее всего ты прав, хотя NTVDM запросто искажает результат.
← →
Мазут Береговой © (2007-12-11 23:06) [125]Кстати, я не спец в Delphi, но вопрос, есть ли указание по передаче параметров в функцию/процедуру в Delphi - по ссылке или по значению? Вот как в C# если ref то по ссылке и значение внешней переменной меняется. Если нет ref, то по значению... А как в Delphi?
← →
DVM © (2007-12-11 23:08) [126]
> А как в Delphi?
var
← →
Мазут Береговой © (2007-12-11 23:13) [127]Понял! :-) Спасибо.
← →
Anatoly Podgoretsky © (2007-12-11 23:30) [128]> Мазут Береговой (11.12.2007 23:06:05) [125]
В Дельфи три метода передаче, по значению (без модификатора), по ссылке с возможностью изменения (модификатор var) и по ссылке без возможности изменения (модификатор const) .
← →
DVM © (2007-12-11 23:53) [129]
> Anatoly Podgoretsky © (11.12.07 23:30) [128]
Еще out есть. Тоже вроде по ссылке с возможностью изменения.
procedure p(out a: integer);
begin
inc(a);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
b: integer;
begin
b:= 1;
p(b);
caption := inttostr(b);
end;
← →
Anatoly Podgoretsky © (2007-12-11 23:55) [130]> DVM (11.12.2007 23:53:09) [129]
IN/OUT это разновидности var/const
← →
DVM © (2007-12-11 23:57) [131]
> IN
Что это?
← →
Мазут Береговой © (2007-12-11 23:58) [132]Спасибо. :-)
← →
Anatoly Podgoretsky © (2007-12-12 00:02) [133]> DVM (11.12.2007 23:57:11) [131]
Параметр только для чтения, не помню есть ли этот модификатор. Аналогично const
← →
DVM © (2007-12-12 00:07) [134]
> не помню есть ли этот модификатор
В D7 нет точно. Ругается на него. Точнее зарезервированное слово есть, но оно для другого.
← →
guav © (2007-12-12 00:21) [135]> [128] Anatoly Podgoretsky © (11.12.07 23:30)
> и по ссылке без возможности изменения (модификатор const).
const передаёт по значению, кроме нетипизированых параметров и параметров которые и без модификатора идут по ссылке.
← →
Anatoly Podgoretsky © (2007-12-12 00:31) [136]> guav (12.12.2007 00:21:15) [135]
Разница есть.
Например для string var это указатель на указатель, а const это указатель или непосредственное значения (для простых типов) без возможности изменения. Без модификатора это то же просто указатель для string или временная копия для некоторых типов, например статических массивов.
← →
guav © (2007-12-12 00:36) [137]> Разница есть.
Согласен. но всегда когда const значение без модификатора тоже значение, а когда const ссылка без модификатора тоже ссылка (кроме случая нетипизивоанного когда без модификатора не компилится).
Const это ссылка, это такой же миф как и определённый порядок F1 и F2 в F1() + F2()
Вот кстати код, в котором в D7 сначала вторая вызывается:program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
function F1(): Integer;
begin
Write("First ");
Result := 0;
end;
function F2(X, Y: Integer): Integer;
begin
Write("Second ");
Result := 0;
end;
procedure F3(X: Integer);
begin
end;
begin
F3(F1() + F2(1, 2));
ReadLn;
end.
Страницы: 1 2 3 4 вся ветка
Форум: "Прочее";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];
Память: 0.75 MB
Время: 0.048 c