Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.08.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
6-1192552967
Matrex
2007-10-16 20:42
2008.08.31
Проверка существования URL


2-1215326275
Незнайка
2008-07-06 10:37
2008.08.31
EHLib и выпадающее меню


8-1184845330
Oberon
2007-07-19 15:42
2008.08.31
как разрезать картинку?


1-1197619669
Константин
2007-12-14 11:07
2008.08.31
uses необходимое


2-1216889323
Коля-Коля
2008-07-24 12:48
2008.08.31
Зависание





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