Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1078492564
Samtron
2004-03-05 16:16
2004.03.28
GetFileType


14-1077878488
Laymer
2004-02-27 13:41
2004.03.28
Экспертные системы


9-1062855848
G A M E R
2003-09-06 17:44
2004.03.28
Как добавить сюда (на дельфи мастера) файл?


1-1079044735
Kneaz
2004-03-12 01:38
2004.03.28
dobaviti svojstvo CheckBox v komponent TreeView


7-1073402144
KILLMAN
2004-01-06 18:15
2004.03.28
Открыть с помощью...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский