Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приведение типов


Servelat ©   (2007-11-24 16:06:00) 

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

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;


Anatoly Podgoretsky   (2007-11-24 20:07:00) [1]

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

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


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


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

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


TUser   (2007-11-24 19:56:00) [3]


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

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


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


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

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


Anatoly Podgoretsky   (2007-11-24 19:46:00) [5]

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

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


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

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


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


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

> Потому что размер разный.
У 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;


Anatoly Podgoretsky   (2007-11-24 17:33:00) [8]

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

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


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

С++ умеет


TUser   (2007-11-24 16:47:00) [10]

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


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

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

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


TUser   (2007-11-24 16:30:00) [12]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо