Форум: "Потрепаться";
Текущий архив: 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.5 MB
Время: 0.047 c