Вниз
Скачать: CL | DM;

Результат трехчасовых поисков ошибки в проекте :)   Найти похожие ветки 

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.75 MB
Время: 0.018 c
15-1197341960
Превед
2007-12-11 05:59
2008.01.20
А вернёт ли Медвед Путину власть?


2-1197912005
TroikA
2007-12-17 20:20
2008.01.20
Функции


4-1182186323
A.L.E.X.A.N.D.E.R
2007-06-18 21:05
2008.01.20
Ввод данных в консольное приложение


2-1197947467
mrFreeman2007
2007-12-18 06:11
2008.01.20
Воспроизведение видео в отдельном окне


2-1198404022
Blind Guardian
2007-12-23 13:00
2008.01.20
timer:longint absolute $0000:$046C;




   Наверх