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

Вниз

С -> D   Найти похожие ветки 

 
Сергей М. ©   (2006-10-12 15:47) [0]

Имеется С-код:


DWORD p = SomePointer1;
DWORD q = SomePointer2;
...
if (*(DWORD *)(p) != *(DWORD *)(q) || *(DWORD *)(p+4) != *(DWORD *)(q+4)) {...


Транслирую его в D-код нижеслед.образом:


type
 HL_DATABLOCK = Int64;
 PHL_DATABLOCK = ^HL_DATABLOCK;
...
var  
 p, q: PHL_DATABLOCK;
...
 p := SomePointer1;
 q := SomePointer2;
..
 if p^ <> q^ then ...


Прав ли я в дан.случае ?


 
[wl] ©   (2006-10-12 15:51) [1]

мне кажется, должно быть так:
if (p[0]<>q[0])or(p[1]<>q[1]) then


 
[wl] ©   (2006-10-12 15:53) [2]

ой, стормозил, тип int64, тогда:
if (p[0]<>q[0]) then


 
default ©   (2006-10-12 15:54) [3]

а разве могут быть сомнения?
только SomePointer-ы в первом варианте типа DWORD, а у тебя они типа укащатель


 
Сергей М. ©   (2006-10-12 15:54) [4]


> [wl] ©   (12.10.06 15:51) [1]


Ты вник в D-декларацию p и q ? Это же не массивы ..


 
Сергей М. ©   (2006-10-12 15:56) [5]


> default ©   (12.10.06 15:54) [3]
> разве могут быть сомнения?


У меня могут)

Смысл идиотских С-выкрутасов а-ля *(DWORD *)(p) забываются с годами работы искл-но в D


 
[wl] ©   (2006-10-12 15:57) [6]

да, точно... давно делфи не занимался (с++ только в основном), забыл уже все


 
default ©   (2006-10-12 15:57) [7]

Сергей М. ©   (12.10.06 15:56) [5]
по-моему всё более чем прозрачно


 
default ©   (2006-10-12 15:58) [8]


> Смысл идиотских С-выкрутасов а-ля *(DWORD *)(p)

в Delphi тоже подобное можно делать, поэтому в сторону C плевать тут не стоит


 
Сергей М. ©   (2006-10-12 16:01) [9]


> default ©   (12.10.06 15:58) [8]


Плюю не в сторону С, а в сторону автора С-кода, по-идиотски манипулирующего типами, пользуясь либеральностью языка С в части манипуляций с приведениями типов


 
default ©   (2006-10-12 16:02) [10]

"DWORD p = SomePointer1;
DWORD q = SomePointer2;
...
if (*(DWORD *)(p) != *(DWORD *)(q) || *(DWORD *)(p+4) != *(DWORD *)(q+4)) {..." -->
....
var
p, q: DWORD;
begin
....
p := SomePointer1;
q := SomePointer2;
...
if PInt64(p)^ <> PInt64(q)^ then begin

вот аналог примерный


 
Сергей М. ©   (2006-10-12 16:04) [11]


> default ©   (12.10.06 16:02) [10]


Т.е. похоже что я прав..


 
default ©   (2006-10-12 16:07) [12]

Сергей М. ©   (12.10.06 16:04) [11]
ну да


 
Сергей М. ©   (2006-10-12 16:08) [13]


> default ©   (12.10.06 16:07) [12]


Благодарю


 
default ©   (2006-10-12 16:10) [14]

я в [3] под "а разве могут быть сомнения?" и имел ввиду что правильно


 
palva ©   (2006-10-12 16:26) [15]

А почему int64 ? Ведь это 8 байтов. А DWORD это 4 байта.


 
Axis_of_Evil ©   (2006-10-12 16:33) [16]

palva ©   (12.10.06 16:26) [15]
А почему int64 ? Ведь это 8 байтов. А DWORD это 4 байта.


тому щто вот (не в курсе, знакомы ли вы с С)
 if (*(DWORD *)(p) != *(DWORD *)(q) || ...
означает
привести р к типу "указатель на DWORD"  и взять значение по етому адресу
(соотв. значение типа DWORD, 4 bytes).
далее идет
 *(DWORD *)(p+4) != *(DWORD *)(q+4)
"+4" = +4 байта к адресу, который хранится в р, т.е. суммарно надо сравнить p и q, каждая по 8 байт.


 
palva ©   (2006-10-12 17:09) [17]

А, теперь увидел.



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

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

Наверх




Память: 0.5 MB
Время: 0.055 c
15-1160683005
PHPDeveloper
2006-10-12 23:56
2006.11.05
Yandex


2-1161235080
pathfinder
2006-10-19 09:18
2006.11.05
TMemIniFile...


15-1160645496
TohaNik
2006-10-12 13:31
2006.11.05
Как определить нигерийскую фамилию:) или продолжение будет...?


15-1160933449
Гарри Поттер
2006-10-15 21:30
2006.11.05
Тест на логику для взрослых и очень умных детей


2-1161276226
Чародей
2006-10-19 20:43
2006.11.05
Потоки