Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.032 c
1-1104340572
Kh v Pa
2004-12-29 20:16
2005.01.16
RichEdit98


14-1104241784
syte_ser78
2004-12-28 16:49
2005.01.16
выход из цикла


14-1103875670
ALexA
2004-12-24 11:07
2005.01.16
окраска DbMemo1


1-1104369733
MagaSoft(1)
2004-12-30 04:22
2005.01.16
Тулбар в IE.


6-1098889352
Vyacheslav
2004-10-27 19:02
2005.01.16
Как проверить прочитано ли письмо





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