Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.039 c
2-1161531049
n0name
2006-10-22 19:30
2006.11.05
Delphi + DLL + printf = magic?


1-1159387946
Servelat
2006-09-28 00:12
2006.11.05
поймать SIGINT


2-1161170827
pkm
2006-10-18 15:27
2006.11.05
Объясните смысл ошибки.


15-1161142045
Kair+
2006-10-18 07:27
2006.11.05
Задача с подготовки ACM


2-1161268969
LBP
2006-10-19 18:42
2006.11.05
DBGRID и удаленные записи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский