最近在研究一个用pascal写的源程序,要翻译成c的,由于是第一次看pascal 的代码,很多不是很清楚,请强人赐教啊。
p是个指针变量,
q:^word;
inc(dword(q),q^-2);
我知道dword()是强制类型转换,那()里加指针类型代表什么意思啊?
还有第二行用c怎么写啊?
p是个指针变量,
q:^word;
inc(dword(q),q^-2);
我知道dword()是强制类型转换,那()里加指针类型代表什么意思啊?
还有第二行用c怎么写啊?
inc(dword(q),q^-2); ===================
typedef Word u_short;Word *q;
q+=(DWORD ((*q)-2));
((unsigned long*)p) -= ((*(unsigned long*)p) - 2);
MD,还真是搞不定了!((unsigned long*)p) -= (*p - 2);
是说将q地址增加长度:q^ - 2
即:q地址是:1000, q指向值是10,则处理完后:q=1008c写法:
q = (WORD*) ( (DWORD)(q) + (*q - 2) );
楼上的写法步长搞错
如果转换成DWORD, Integer, Cardinal类型,则表明该参数是忽略步长。
如下:
var
PC: PChar;
PB: PByte;
PW: PWord;
PD: PCardinal; // ==> PDWORD;Inc(PC, 10) // == PC: 1000 + (10 * sizeof(char)) ==> PC=1010
Inc(PB, 10) // == PB: 1000 + (10 * sizeof(byte)) ==> PB=1010
Inc(PC, 10) // == PW: 1000 + (10 * sizeof(WORD)) ==> PW=1020
Inc(PD, 10) // == PD: 1000 + (10 * sizeof(DWORD)) ==> PD=1040以下写法相同:
Inc(Integer(PD), 10) // == PD: 1000 + (10) ==> PD=1010
Inc(Cardinal(PD), 10) // == PD: 1000 + (10) ==> PD=1010
Inc(DWORD(PD), 10) // == PD: 1000 + (10) ==> PD=1010
今天好像被小孩闹昏头了,很简单的一句话,居然连续4次都错的,被一个强制转换符搞糊涂了, 特此致歉,免误导!unsigned(僵哥(发站内消息,请附上链接或问题说明,否则不予回)的回答是正确的,不过后边也没必要强制转换, ERR0RC0DE()也是正确的,但是也复杂化了,其实就这么简单的一句,因为上面连回3次,没法改正,所以本人还另发一贴致歉:http://community.csdn.net/Expert/topic/5681/5681566.xml?temp=3.341311E-02
========================================================
q:^word;
inc(dword(q),q^-2);
========================================================
unsigned short *q;
q += (*q - 2)
const
v:array[0..5] of word = (1, 2, 3, 4, 5, 6);
var
q: ^word;
begin
q := @v[3]; // q^ = 4
Inc(dword(q), q^ - 2); // q 地址只移动了2字节,指向v[4]
ShowMessage(IntToStr(q^)); // 显示5
end;再看C/C++:void __fastcall TForm1::Button1Click(TObject *Sender)
{
WORD v[] = {1, 2, 3, 4, 5, 6};
WORD *q = &v[3];
// q += (*q - 2); // 我最后的解答,结果为6
// q+=(DWORD ((*q)-2)); // unsigned(僵哥解答,结果为6
// q = (WORD*) ( (DWORD)(q) + (*q - 2) );// ERR0RC0DE()解答,结果为5
ShowMessage(*q);
}ERR0RC0DE()解答正确,看来马虎不得一点!ERR0RC0DE()自号“错误代码”,写得却是正确的!
看来我对Inc函数了解不透啊!
WORD v = 10, *p1 = &v, *p2, *p3 = p1;
p2 = (WORD*) ( (ULONG_PTR)(p1) + (*p1 - 2) );
p3 += (*p1 - 2);
printf("p1: %X, p2: %X, p3: %X\n", (PTR)p1, (PTR)p2, (PTR)p3);
printf("p2 - p1 = %d/%d, p3 - p1 = %d/%d", p2 - p1, (PTR)p2 - (PTR)p1, p3 - p1, (PTR)p3 - (PTR)p1);
如果转换成DWORD, Integer, Cardinal类型,则表明该参数是忽略步长。
要害是这个吧!
小弟以后还有很多问题请教啊,还要麻烦各位大哥啊!
先谢过了!
field_name是个数组。
这句得内存分配是怎么样的?是field_name[0]的值所占的字节再加2吗?MemAlloc的参数是分配的内存大小。
procedure MemSet(p:pointer;Count:dword;C:byte);这个函数作用是什么?
分配field_name[0]第一个字节的值(比如'a',即为97)+2个字节.MemSet是对p开始的Count个字节使用C的值来填充。
inc(dword(q),q^-2);
inc的第一个参数用指针,和数值效果是不一样的
这个里面好像有个隐试的赋值
inc(pointer,1)->这个是根据指针所指向的值的空间大小来计算的,也就是sizeof(pointer^)*1
inc(dword(pointer),1)就是把地址转换成10进制数,经过计算后pointer的也就变了,指向的值也就变了