Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

Небольшая задачка для разминки:   Найти похожие ветки 

 
Mystic ©   (2004-12-23 18:14) [0]

Приведите пример исходника (Delphi), в котором если поменять местами два сомножителя (проверял на пятой версии), то получаем ошибку компиляции (Identifier redeclareted)?


 
VMcL ©   (2004-12-23 20:03) [1]

>>Mystic ©  (23.12.04 18:14)

Дык, это не задачка, а загадка прям какая-то.


 
Mystic ©   (2004-12-23 20:29) [2]

Пусть будет загадка, я не возражаю... ;)


 
iZEN ©   (2004-12-23 21:06) [3]

Небольшая разминка.
program TestRound;
{$APPTYPE CONSOLE}
var
 X: Integer;
 Y: Real;
begin
 X := -11;
 while (X <= 11) do begin
   Y := X + 0.5;
   WriteLn(Y, "~=",  Round(Y));
   X := X + 1;
 end;
end.

выдаёт:
-1.05000000000000E+0001~=-10
-9.50000000000000E+0000~=-10
-8.50000000000000E+0000~=-8
-7.50000000000000E+0000~=-8
-6.50000000000000E+0000~=-6
-5.50000000000000E+0000~=-6
-4.50000000000000E+0000~=-4
-3.50000000000000E+0000~=-4
-2.50000000000000E+0000~=-2
-1.50000000000000E+0000~=-2
-5.00000000000000E-0001~=0
5.00000000000000E-0001~=0
1.50000000000000E+0000~=2
2.50000000000000E+0000~=2
3.50000000000000E+0000~=4
4.50000000000000E+0000~=4
5.50000000000000E+0000~=6
6.50000000000000E+0000~=6
7.50000000000000E+0000~=8
8.50000000000000E+0000~=8
9.50000000000000E+0000~=10
1.05000000000000E+0001~=10
1.15000000000000E+0001~=12


Программа на java:
public class TestRound {
   public static void main(String[] args) {
       int x;
       float y;
       x = -11;
       while (x <= 11) {
           y = x + 0.5f;
           System.out.println(y + "~=" + Math.round(y));
           x = x + 1;
       }
   }
}

выдаёт:
-10.5~=-10
-9.5~=-9
-8.5~=-8
-7.5~=-7
-6.5~=-6
-5.5~=-5
-4.5~=-4
-3.5~=-3
-2.5~=-2
-1.5~=-1
-0.5~=0
0.5~=1
1.5~=2
2.5~=3
3.5~=4
4.5~=5
5.5~=6
6.5~=7
7.5~=8
8.5~=9
9.5~=10
10.5~=11
11.5~=12


 
iZEN ©   (2004-12-23 21:08) [4]

Почему нет нечётных чисел при округлении в Delphi? ;)


 
Mystic ©   (2004-12-23 21:19) [5]

Почему нет нечётных чисел при округлении в Delphi? ;)

Round производит округление по "банковским" правилам, а именно, число, у которого дробная часть равна точно "0.5" округляется до ближайшего четного числа. Аналогично работает соответствующая команда сопроцессора.


 
vecna ©   (2004-12-24 14:02) [6]

2Mystic
заинтриговал.... рассказывай ответ уже!


 
VictorT ©   (2004-12-24 15:12) [7]


> Mystic ©   (23.12.04 18:14)

Основано на особенностях компилятора, или языка?


 
Суслик ©   (2004-12-24 15:17) [8]

да мало ли багов в компиляторе

Или речь не про баг?


 
Sandman25 ©   (2004-12-24 15:34) [9]

Пытался найти решение. Пока добрался до

procedure TForm1.FormCreate(Sender: TObject);
type
 private = integer;
const
 public = private(1);
class procedure protected(private: private = public);
begin
end;
var
 published: TObject;
 TObject: private;
begin
 protected(private(public));
end;
CODE>

Нормально компилируется, только hints о неиспользованности переменных выдает :)


 
TUser ©   (2004-12-24 15:34) [10]


> Или речь не про баг?

В [3] речь нре о баге. Просто есть разные правила округления, компилятор работает по вот таким. Об этом в справке написано. Если надо как-нибудь по-другому - свою функцию написать совсем не сложно.


 
pasha_golub ©   (2004-12-24 15:40) [11]

Удалено модератором


 
Sandman25 ©   (2004-12-24 15:51) [12]

[11] pasha_golub ©   (24.12.04 15:40)

Точно. D6


 
pasha_golub ©   (2004-12-24 15:55) [13]

Sandman25 ©   (24.12.04 15:51) [12]
Ужас. :0) Я думал на такое мракобесие то Сишники способны.


 
Sandman25 ©   (2004-12-24 15:57) [14]

[13] pasha_golub ©   (24.12.04 15:55)

При желании написать гадость никакой язык не сдержит :)


 
DiamondShark ©   (2004-12-24 16:00) [15]

D5 тоже компилит.

Просто некоторые зарезервированные слова не совсем зарезервированные.

такое тоже компилит:

var
 external: integer;
 far: integer;
 override: integer;
 overload: integer;
 public: integer;


 
MrCorp1   (2004-12-24 16:01) [16]


> Приведите пример исходника (Delphi), в котором если
> поменять местами два сомножителя (проверял на пятой
> версии), то получаем ошибку компиляции (Identifier
> redeclareted)?


На этапе компиляции не знаю как сделать. А вот во время выполнения программы легко.

var
 Form1: TForm1;
 c:integer;

implementation

{$R *.dfm}

function a:integer;
begin
 Result:=1 div c;
 c:=0;
end;

function b:integer;
begin
 c:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 c:=1;
 c:=a*b;
end;
...


Если поменять местами a и b, то программа выдаст ошибку.


 
Sandman25 ©   (2004-12-24 16:03) [17]

[15] DiamondShark ©   (24.12.04 16:00)

Я вот только не понял, почему разрешен модификатор class для вложенной процедуры???


 
vecna ©   (2004-12-24 16:40) [18]

2Sandman25 [9],
где вы такую траву берете ? =)

2MrCorp1
Кажется, у вас случится деление на ноль, а не Identifier redeclarete


 
Sandman25 ©   (2004-12-24 16:43) [19]

[18] vecna ©   (24.12.04 16:40)

Почему сразу траву? Я логично предположил, что какое-то служебное слово в некотором контексте выполняет отличную функцию. Попытлася это дело исследовать.


 
VMcL ©   (2004-12-24 18:30) [20]

>>Sandman25 ©  (24.12.04 16:03) [17]

Хм... действительно. Интересно, каков глубинный смысл такой конструкции.
:-)

procedure TForm1.FormCreate(Sender: TObject);
 class procedure Test;
 begin
   ShowMessage("Test");
 end;
begin
 Test;
end;


 
Mystic ©   (2004-12-24 19:21) [21]

Речь идет не о баге ;) Вот две программы:

program Test;

const A=3;

type B = array[2*(A-1)..100] of Integer;

begin end.


и

program Test;

const A=3;

type B = array[(A-1)*2..100] of Integer;

begin end.


Тут собака несколько завуаливарона, пример можно сократить ;)


 
DiamondShark ©   (2004-12-24 19:39) [22]


> Тут собака несколько завуаливарона, пример можно сократить
> ;)

А я знаю в чём собака!

(A воспринимается компилятором как начало описания перечислимого типа:

program Test;

type B = array[(A, C, D, E, F)] of Integer;

begin end.

Бо по формальной грамматике:


ArrayType   ::= "array" "[" IndexType {"," IndexType} "]" "of" Type
IndexType   ::= OrdinalType;
OrdinalType ::= TypeIdent | RangeType | EnumType
RangeType   ::= Const ".." Const
EnumType    ::= "(" Ident {"," Ident} ")"


 
default ©   (2004-12-24 19:40) [23]

Mystic ©   (24.12.04 19:21) [21]
хм...
так работает
type B = array[1*(A-1)*2..100] of Integer;
и так
type B = array[-(1-A)*2..100] of Integer;


 
vuk ©   (2004-12-24 19:42) [24]

to Mystic ©   (24.12.04 19:21) [21]:
Кстати, в Help описано... :o)


 
Mystic ©   (2004-12-24 19:45) [25]

> DiamondShark

Правильно. Замечу только, что более простой пример

const A=3;

type B = 2*(A+1)..100;


Хотя на самом деле легко добиться того, чтобы указаная конструкция все же рассматривалась правильно. Когда я строил грамматику, конфликт сдвиг/свертка у меня возникал только на закрывающей скобке, т. е. в выражениях вида:

type B = (A)..100; //Тут конфликт
type B = (A+1)..100; //А тут его нет



Страницы: 1 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.076 c
1-1104652605
Cheguevara
2005-01-02 10:56
2005.01.16
Как отменить последнее действие над картинкой


4-1101642831
Ralf
2004-11-28 14:53
2005.01.16
Командная строка


1-1104310242
Mr.V
2004-12-29 11:50
2005.01.16
TEdit


14-1104244028
syte_ser78
2004-12-28 17:27
2005.01.16
номер активного элемента treeview


8-1096998213
Klopan
2004-10-05 21:43
2005.01.16
Уровень звука