Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизПреобразование типов! (Вопрос второй) Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.033 c