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

Вниз

Си => Паскаль   Найти похожие ветки 

 
kernel ©   (2008-07-24 11:11) [0]

Доброго времени суток. Не могу перевести простой Си`шный код на Паскаль :"(
Если кто может, помогите, пожалуйста, перевести на 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 {...};
Какие будут отличия, если перевести это на Паскаль?

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


 
МистерТ   (2008-07-24 11:24) [1]

по поводу "чистого си", не уверен, т.к. учил только уже приплюснутую версию, да и судя по коду программист сам был "еще тот", но рискну предположить:
> unsigned char BADDR[512];
> unsigned char *sccBuffer = (unsigned char *) BADDR;

PBaddr = ^TBaddr;
TBaddr = array[0..511] of Byte;
...
BADDR     : TBaddr;
sccBuffer : PBaddr;
...
sccBuffer := @BADDR;

> struct direntry {
> unsigned char deName[8];
> #define   SLOT_EMPTY       0x00
> ....
> }

const
 SLOT_EMPTY = 0;
type
 TDirEntry = record
   deName : array[0..7] of Byte;
   ...
 end;

> И чем отличается
> typedef struct{...}TChtoNibud;
> от
> struct ChtoNibud {...};
> Какие будут отличия, если перевести это на Паскаль?

При переводе на паскаль - это равнозначные конструкции...
а так, первый вариант - plain-c, второй - более С++


 
Игорь Шевченко ©   (2008-07-24 11:27) [2]


> 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;?!


var
 sccBuffer: PBYTE;
...
 sccBuffer := PBYTE(BADDR);
...

> struct direntry {
> unsigned char deName[8];
> #define   SLOT_EMPTY       0x00
> ....
> }

const
 SLOT_EMPTY = 0;

type
 direntry = packed record
   deName: array[0..7] of Byte;
 ...
 end;


 
kernel ©   (2008-07-24 12:28) [3]

Спасибо большое.

> Игорь Шевченко ©   (24.07.08 11:27) [2]

А если PBYTE нет, можно написать так:

var
sccBuffer: ^BYTE;
...
sccBuffer := ^BYTE(BADDR);
...


?


 
Игорь Шевченко ©   (2008-07-24 12:34) [4]


> А если PBYTE нет, можно написать так:


PBYTE есть.

Если нет, то
type
 PByte = ^Byte;


 
kernel ©   (2008-07-24 12:56) [5]

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

sccBuffer := PBYTE(BADDR);

sccBuffer - это же 1 байт, а BADDR - это 512 байт.
Ведь 512 байт нельзя же присвоить 1 байту?!


 
clickmaker ©   (2008-07-24 13:02) [6]

> sccBuffer - это же 1 байт

вообще-то это 4 байта - указатель


 
Игорь Шевченко ©   (2008-07-24 14:59) [7]


>  sccBuffer := PBYTE(BADDR);


Тогда еще проще

sccBuffer := @BADDR


 
kernel ©   (2008-07-24 15:19) [8]

Спасибо еще раз :)

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


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

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


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

Pfscal:( -> Pascal


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


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


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


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

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


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


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

Ой ли


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

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

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

?


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


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


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

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


 
Palladin ©   (2008-07-25 14:26) [16]


> _Name_   (24.07.08 23:09) [13]

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


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


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


мало данных

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

(WORD(clust) * 2) mod 512

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


 
kernel ©   (2008-07-25 14:41) [18]


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

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

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

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


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

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


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


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


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


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


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


 
kernel ©   (2008-07-25 15:04) [20]


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

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

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

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


 
guav ©   (2008-07-25 15:11) [21]

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


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


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


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


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


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


 
clickmaker ©   (2008-07-25 15:15) [23]

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

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


 
kernel ©   (2008-07-25 15:57) [24]


> А я не увидел 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)<<8)|(WORD)*(volatile BYTE*)(ptr))
#define LD_DWORD(ptr)  (DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr))
#define ST_WORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
#define ST_DWORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>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)<<8)|(WORD)*(volatile BYTE*)(ptr))
#define LD_DWORD(ptr)  (DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr))
#define ST_WORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
#define ST_DWORD(ptr,val) *(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)
#else
#error Do not forget to set _MU_ENDIAN properly!
#endif



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

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

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


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

> [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 17:29) [26]

Уже голова пухнет от этих строк 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;


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


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

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


 
clickmaker ©   (2008-07-25 19:58) [28]

> function LD_DWORD(ptr: pointer): pointer;

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



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

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

Наверх




Память: 0.54 MB
Время: 0.013 c
2-1216898754
Dimich1978
2008-07-24 15:25
2008.08.31
Работа с бордюрами Word -таблица


15-1215409345
Rouse_
2008-07-07 09:42
2008.08.31
Приветствуем новых Мастеров


2-1216929349
mephisto
2008-07-24 23:55
2008.08.31
Динамические фреймы


1-1197664790
tvolf
2007-12-14 23:39
2008.08.31
Изменение ширины ячеек TDrawGrid в run-time


15-1215669236
Slider007
2008-07-10 09:53
2008.08.31
С днем рождения ! 10 июля 2008 четверг