![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Си => Паскаль
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