Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Си => Паскаль


Страницы:   1 2

kernel ©   (2008-07-24 11:11:00) 

Доброго времени суток. Не могу перевести простой Си`шный код на Паскаль :'(
Если кто может, помогите, пожалуйста, перевести на Pascal следующее:

unsigned char *sccBuffer = (unsigned char *) BADDR;
где-то в .h файле увидел
unsigned char BADDR[512];
Пишу на "нашем" языке так:
sccBuffer: ^Byte;
Но что делать с куском = (unsigned char *) BADDR;не понимаю.
Далее,
struct direntry {
unsigned char deName[8];
#define   SLOT_EMPTY       0x00
....
}

Пишу так:
type = record // а может быть надо packed record?!
 deName: array [8] of Byte;

Но что делать с #define SLOT_EMPTY 0x00? Не писать же в record
const SLOT_EMPTY = $00;?!
И чем отличается
typedef struct{...}TChtoNibud;
от
struct ChtoNibud {...};
Какие будут отличия, если перевести это на Паскаль?

ЗЫ: извиняюсь, если ветку создал где-то не там


clickmaker   (2008-07-25 19:58:00) [1]

> function LD_DWORD(ptr: pointer): pointer;

а чего надо-то? разыменовать указатель?
PDWORD(ptr)^ не проще ли?


_Name_   (2008-07-25 19:52:00) [2]


> Palladin ©   (25.07.08 14:26) [16]

Есть. В уровне знаний человека, такое написавшего.


kernel   (2008-07-25 17:29:00) [3]

Уже голова пухнет от этих строк 8(
Хотя бы LD_WORD и LD_DWORD правильно "составлены"? Вот:

function LD_WORD(ptr: pointer): pointer;
begin
 result:= WORD(^WORD(^BYTE(ptr)));
end;

function LD_DWORD(ptr: pointer): pointer;
begin
 result:= DWORD(^DWORD(^BYTE(ptr)));
end;


guav   (2008-07-25 16:11:00) [4]

> [23] clickmaker ©   (25.07.08 15:15)
> fs.win[(WORD(clust) shl 1) mod 512]

А ещё можно:
fs.win[(WORD(clust) shl 1) and 511]
Но зачем выделываться ?


> Как переводить #define LD_WORD(ptr)    (WORD)(*(WORD*)(BYTE*)
> (ptr)) и т.п. я не представляю :'(

LD_WORD/LD_DWORD читают значение WORD и DWORD по указателю ptr, ST_WORD и ST_DWORD пишут значение val по указателю ptr.
При _MU_ENDIAN == 1 значение остаётся как есть, при _MU_ENDIAN == 2 меняются старшие и млашие байты.
Если эндианность известна и она совпадает с эндианностью FAT (а у FAT little endian, т.е. интеловский порядок), то это можно выкинуть.


kernel   (2008-07-25 15:57:00) [5]


> А я не увидел pointer-а. Увидел слово запись...


Бррр... Что-то я сам уже запутался :)

Похоже, я не с того места начал переводить.

Есть такие строчки на Си:

#if _MU_ENDIAN == 1 /* Use word access */
#define LD_WORD(ptr)  (WORD)(*(WORD*)(BYTE*)(ptr))
#define LD_DWORD(ptr)  (DWORD)(*(DWORD*)(BYTE*)(ptr))
#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val)
#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
#elif _MU_ENDIAN == 2 /* Use byte-by-byte access */
#define LD_WORD(ptr)  (WORD)(((WORD)*(volatile BYTE*)((ptr)+1)24)
#else
#error Do not forget to set _MU_ENDIAN properly!
#endif


Т.е. какие-то функции (если перевести на pas), внутри которых есть параметр типа pointer (вроде бы).

Есть запись такого рода:

type tFS = record
...
win: array [0..511] of BYTE;
end;

var
fs: ^tFS;


И в каком-то месте есть такая запись:


> return LD_WORD(&fs->win[((WORD)clust * 2) % 512U]);


Я так понял, что &fs->win[((WORD)clust * 2) % 512U]должно быть типа pointer, чтобы влезть в ф-ию LD_WORD.

Как переводить #define LD_WORD(ptr)    (WORD)(*(WORD*)(BYTE*)(ptr))и т.п. я не представляю :'( Если кого не затруднит, переведите, пжлста, на pas эти строчки
#if _MU_ENDIAN == 1 /* Use word access */
#define LD_WORD(ptr)  (WORD)(*(WORD*)(BYTE*)(ptr))
#define LD_DWORD(ptr)  (DWORD)(*(DWORD*)(BYTE*)(ptr))
#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val)
#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
#elif _MU_ENDIAN == 2 /* Use byte-by-byte access */
#define LD_WORD(ptr)  (WORD)(((WORD)*(volatile BYTE*)((ptr)+1)24)
#else
#error Do not forget to set _MU_ENDIAN properly!
#endif



> guav ©   (25.07.08 15:11) [21]

Да, это работа с FAT. Пользователей ПК этот продукт не коснется :)

PS: на этом месте всем помогающим хочу сказать спасибо :)


clickmaker   (2008-07-25 15:15:00) [6]

> fs.win[(WORD(clust) * 2) mod 512]

fs.win[(WORD(clust) shl 1) mod 512]
:)


Игорь Шевченко   (2008-07-25 15:11:00) [7]


> А разве ничего (@ ^) ставить не надо для pointer`а?


А я не увидел pointer-а. Увидел слово запись. Если мы дальше будем продолжать играть в игру "партизаны и гестаповцы", то я из темы удаляюсь.


> сишников != знакомых


На все воля Аллаха


guav   (2008-07-25 15:11:00) [8]

Работа с FAT ? С такими вопросами ? Скажи что за продукт, чтобы его избегать.


kernel   (2008-07-25 15:04:00) [9]


> Игорь Шевченко ©   (25.07.08 14:58) [19]
>fs.win[(WORD(clust) * 2) mod 512]

А разве ничего (@ ^) ставить не надо для pointer`а?

> А сишников знакомых поискать ?

сишников != знакомых


Игорь Шевченко   (2008-07-25 14:58:00) [10]


> fs - это record, внутри которого есть массив win из 512
> байт :)


fs.win[(WORD(clust) * 2) mod 512]


> Оно мне необходимо. Другого пути нет :)


А сишников знакомых поискать ?


kernel   (2008-07-25 14:41:00) [11]


> Игорь Шевченко ©   (25.07.08 14:29) [17]
> ...
> мало данных
> ...

(&fs->win[((WORD)clust * 2) % 512U]) - должно быть типа pointer
fs - это record, внутри которого есть массив winиз 512 байт :)

Я вот не могу понять, мне бобика ("@") или "^" ставить перед fs?

ЗЫ: признаюсь, с указателями работать на Delphi не приходилось :)


> оно тебе не рано переводом заниматься ?

Оно мне необходимо. Другого пути нет :)


Игорь Шевченко   (2008-07-25 14:29:00) [12]


> &fs->win[((WORD)clust * 2) % 512U]


мало данных

вот это ((WORD)clust * 2) % 512U будет

(WORD(clust) * 2) mod 512

оно тебе не рано переводом заниматься ?


Palladin   (2008-07-25 14:26:00) [13]


> _Name_   (24.07.08 23:09) [13]

у тебя есть сомнения?


kernel   (2008-07-25 14:14:00) [14]


> kernel ©   (25.07.08 14:08) [14]


Там в конце не дописал квадратную скобку. Т.е. должно быть так:

&fs->win[((WORD)clust * 2) % 512U]


kernel   (2008-07-25 14:08:00) [15]

А как будет на паскале

&fs->win[((WORD)clust * 2) % 512U

?


_Name_   (2008-07-24 23:09:00) [16]


> просто record - это внутри паскаля, а для взаимодействия
> с внешним миром - packed record

Ой ли


kernel   (2008-07-24 20:12:00) [17]

Milk, спасибо за инструмент, действительно, не плохо переводит :)


Игорь Шевченко   (2008-07-24 15:31:00) [18]


> А почему direntry = packed record ? Как определить просто
> "record" или "packed record"?


просто record - это внутри паскаля, а для взаимодействия с внешним миром - packed record


Milk   (2008-07-24 15:25:00) [19]

Pfscal:( -> Pascal


Milk   (2008-07-24 15:23:00) [20]

Довольно прилично переводит на Pfscal
http://www.delphi.int.ru/files/programs/programs_c/c2pas32_09b.exe


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо