Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.05 c
15-1197724641
Tirael
2007-12-15 16:17
2008.01.20
как умирают компы?


15-1197736931
Dmitry S
2007-12-15 19:42
2008.01.20
Вопрос про шашки.


15-1197380220
312kbps
2007-12-11 16:37
2008.01.20
Подбор массива по заданным параметрам


15-1197744595
@!!ex
2007-12-15 21:49
2008.01.20
Охлаждение материнской платы.


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





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский