Форум: "Прочее";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
ВнизС -> 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.047 c