Форум: "Начинающим";
Текущий архив: 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? Не писать же в recordconst 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.53 MB
Время: 0.005 c