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

Вниз

Приведение типов   Найти похожие ветки 

 
Servelat   (2007-11-24 16:06) [0]

Здраствуйте. Наверное я сегодня туплю (=. Почему нельзя:

var
 Size: LongInt;
 E: Extended;
begin
 Size := 50000;
 E := Extended(Size);


явно привести Integer к Extended?

В приведенном примере это не критично, потому как можно просто убрать приведение типа, и все заработает. Однако, меня интересует сам факт, почему это Invalid typecast? Обнаружилось случайно при попытке сделать примерно такое выражение:

TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;


 
TUser ©   (2007-11-24 16:30) [1]

> TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;

А здесь ты зачем приведение типов делаешь?


 
Anatoly Podgoretsky ©   (2007-11-24 16:44) [2]

> Servelat  (24.11.2007 16:06:00)  [0]

Потому что размер разный.
Но это и не нужно.


 
TUser ©   (2007-11-24 16:47) [3]

Более того, приведенный "длинный" пример не должен компилироваться также  и потому, что к extended"у нельзя применять операцию div.


 
PASZLIB   (2007-11-24 17:25) [4]

С++ умеет


 
Anatoly Podgoretsky ©   (2007-11-24 17:33) [5]

> PASZLIB  (24.11.2007 17:25:04)  [4]

Форум по С++ где то рядом.


 
Servelat   (2007-11-24 17:43) [6]

> Потому что размер разный.
У Boolean и Integer размер тоже не одинаковый, однако приводится ;).


> А здесь ты зачем приведение типов делаешь?


Этот кусок кода кинул мне в аську один товарищ, сишник. Просил объяснить, почему Invalid Typecast. После чего я написал короткий тест из [0], который показал, что действительно нельзя. Но мне не понятно, почему нельзя, ведь какой-то смысл в этом должен быть. Простое присваивание можно, а с приведением типа нельзя.

Вообще, проблема
TempExtended := ((((8 * Extended(FileSize(Input)) - L + 1) * L) div 8) div 4) * 4 + 8;
разумеется разрешима как минимум 2мя способами. Можно объявить дополнительную переменную типа Extended и присвоить ей FileSize, после чего использовать указанную формулу (вместо div - / есс-но). Либо использовать Int64.

Однако, меня интересует, из каких побуждений нельзя напрямую привести к типу Extended, не нагородив забор вроде

function GetExtended(const I: Integer): Extended;
begin
 Result := I;
end;


 
Servelat   (2007-11-24 17:47) [7]

> Этот кусок кода кинул мне в аську один товарищ, сишник.


Приведение типов было им задумано во благо, так как FileSize * 8 в общем случае не влезет в Integer, а Int64 на Delphi3, которую он использовал, отсутствует (=.


 
Anatoly Podgoretsky ©   (2007-11-24 19:46) [8]

> Servelat  (24.11.2007 17:43:06)  [6]

Присваиваение не простое, а с преобразованием.


 
Германн ©   (2007-11-24 19:54) [9]


> Однако, меня интересует, из каких побуждений нельзя напрямую
> привести к типу Extended

Приведение типов есть не что иное, как указание компилятору рассматривать область памяти занимаемой одной переменной как переменную другого типа. Но вещественное число 100 и целое число 100 хранятся в памяти совершенно по разному.


 
TUser ©   (2007-11-24 19:56) [10]


> Приведение типов есть не что иное, как указание компилятору
> рассматривать область памяти занимаемой одной переменной
> как переменную другого типа.

Пиведения типа string() для переменной типа PChar и boolean() к интегеру допустимы :)


 
Германн ©   (2007-11-24 20:02) [11]


> TUser ©   (24.11.07 19:56) [10]
>
>

Епстепственно :-)


 
Anatoly Podgoretsky ©   (2007-11-24 20:07) [12]

> TUser  (24.11.2007 19:56:10)  [10]

Приведение одного указателя к другому типу совместимому типу допустимо, приведение PChar к string не является приведение, а является присвоением, с преобразованием.



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

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

Наверх




Память: 0.49 MB
Время: 0.017 c
2-1196107164
cyber
2007-11-26 22:59
2007.12.23
Проблема с DBGid


4-1181467494
lyberzon
2007-06-10 13:24
2007.12.23
Системные курсоры


3-1187081960
АндрейК
2007-08-14 12:59
2007.12.23
Через ADO цепляю FoxPro


15-1195650597
Cyrax
2007-11-21 16:09
2007.12.23
PHP5: Как считать без "бонусов" массив из переменной $_REQUEST


6-1176402933
redlord
2007-04-12 22:35
2007.12.23
TIDHTTPserver в каком потоке выполняется IdHTTPServer1CommandGet