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

Вниз

Преобразование типов! (Вопрос второй)   Найти похожие ветки 

 
White   (2004-03-10 23:13) [0]

Спасибо ребята огромное часть проблемы вы мне помогли решить я конечно очень удивился что и в Delphi есть подобное

преобразование типов что и в C. Отдельное спасибо WebErr ©, Digitman, PVOzerski и Тимохов ©( за добрый совет про скорость).
НО ЕСТЬ ОДИН ВАЖНЫЙ МОМЕНТ, как вы и говорили это работает в том случаи если типы не вещественные, А КАК БЫТЬ С

ПРЕОБРАЗОВАНИЕМ например из типа DWORD в REAL (с услолвием того что в данных 4х байтах храниться именно значение типа

REAL),  я конечно помню что REAL занимает 8байт но всё же, или наприммер DWORD в SINGLE (здесь уже есть побайтовая

совместимость).
Надеюсь что вы с таким же интересом ответите и на этот вопрос.
Спасибо за помощь!
Александр.


 
default ©   (2004-03-10 23:26) [1]

об чём вопрос не понятно
окно CPU даст ответ на всё...


 
jack128 ©   (2004-03-10 23:40) [2]

из вещ в целое - Trunc (округление вниз)
из целого в вещ присваиванием..


 
Defunct ©   (2004-03-11 01:14) [3]

Можно через указатели, только нужно понимать, что при этом происходит и учитывать размер типов и/или расположение в памяти.

Var PR : ^Real;
   D1,D2: Dword;

Begin
 D1:=0;
 D2:=0;
 PR := @D1;
 Format("%f",[Pr^]);
End;


 
Digitman ©   (2004-03-11 08:07) [4]


> из типа DWORD в REAL (с услолвием того что в данных 4х байтах
> храниться именно значение типа


vReal: Real;
vDWord: DWord;

..

vReal := PSingle(@vDWord)^; // type PSingle = ^Single;


 
Юрий Зотов ©   (2004-03-11 08:45) [5]

> White   (10.03.04 23:13)  

> я конечно очень удивился что и в Delphi есть подобное
> преобразование типов что и в C.

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

> или наприммер DWORD в SINGLE (здесь уже есть побайтовая
> совместимость).

1. В Паскале (как и в очень многих других языках), в смешанных выражениях младшие типы автоматически преобразуются к старшим. То есть, можно совершенно спокойно написать так:
RealVarOfAnySize := IntegerVarOfAnySize;
или, например, так:
RealVarOfAnySize := IntegerVarOfAnySize / 3e-8;

2. Никто не запрещает трактовать одну и ту же область памяти каким угодно способом. Путем явного приведения типов, путем наложения адресов (директива absolute), через указатели... в общем, как угодно. Например:

var
 I: integer; // signed
 D: DWORD absolute I; // unsigned
 R: single absolute I;
 P: pointer absolute I;
 S: string[3] absolute I;
 A: array[1..4] of byte absolute I;
 С: array[12..15] of char absolute I;
// и т.д. Все эти переменные - это одна и та же область памяти
// длиной 4 байта. В любом месте программы можно обращаться к
// этой области по любому из этих имен, в зависимости от того,
// как мы хотим проинтерпретировать ее содержимое. Более того,
// при таком наложении равенство длины совершенно не требуется и
// мы имеем полное право добавить сюда же вот такие объявления:
 B: byte absolute I;
 W: word absolute I;
 E: extended absolute I;
 L: array[1...365] of double absolute I;
 R: TSearchRec absolute I; // record

И т.д. Суть, надеюсь понятна - у Вас есть некая область памяти, а как уж там Вы собираетесь интерпретировать ее содержимое - дело Ваше. Вы должны лишь любым синтаксически допустимым способом явно сообщить компилятору, что в этом месте Вы не ошиблись, а действуете осознанно. Тогда он не будет ругаться и все пройдет ОК.

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

Вот реальный пример из моей практики (язык PL/1, компилятор которого, в отличие от Паскаля, автоматически и без всяких предупреждений преобразовывал любые типы в любые другие типы).

DECLARE // это аналог паскалевского предложения var
 I DECIMAL FIXED(1); // переменная I - одна десятичная цифра
...
DO I=0,9 ... // это аналог цикла for i := 0 to 9 do...

И все, большой привет - получили бесконечный цикл. Ошибку я искал несколько дней (естественно, программа была большая, а не только эти две строки, поэтому поискать было где).

Вот после подобных штучек и начинаешь ценить Паскаль. Именно за его строгость. Потому что она не мешает, а помогает, причем помогает очень здорово.



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

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

Наверх




Память: 0.49 MB
Время: 0.029 c
14-1077981348
TButton
2004-02-28 18:15
2004.03.28
TServerSocket+TClientSocket


7-1073100778
Linuxoid
2004-01-03 06:32
2004.03.28
Com port


1-1078391917
AlexanderSK
2004-03-04 12:18
2004.03.28
Доступ к объекту из нескольких потоков


1-1078919039
Шурик Ш
2004-03-10 14:43
2004.03.28
Как получить текущий системый разделитель целой и дробной частей?


3-1074854049
VolanD2002
2004-01-23 13:34
2004.03.28
Index is ReadOnly