最近在研究一个用pascal写的源程序,要翻译成c的,由于是第一次看pascal 的代码,很多不是很清楚,请强人赐教啊。
p是个指针变量,
q:^word;
inc(dword(q),q^-2);  
我知道dword()是强制类型转换,那()里加指针类型代表什么意思啊?
还有第二行用c怎么写啊?

解决方案 »

  1.   

    (*(unsigned long*)p) -= 2;
      

  2.   

    q:^word;
    inc(dword(q),q^-2); ===================
    typedef Word u_short;Word *q;
    q+=(DWORD ((*q)-2));
      

  3.   

    对不起,上面写错了,应该是((unsigned long*)p) -= 2;也就是p -= 4;
      

  4.   

    还是错的,晕!
    ((unsigned long*)p) -= ((*(unsigned long*)p) - 2);
      

  5.   


    MD,还真是搞不定了!((unsigned long*)p) -= (*p - 2);
      

  6.   

    inc(dword(q),q^-2);
    是说将q地址增加长度:q^ - 2
    即:q地址是:1000, q指向值是10,则处理完后:q=1008c写法:
    q = (WORD*) ( (DWORD)(q) + (*q - 2) );
    楼上的写法步长搞错
      

  7.   

    INC处理中,注意第一参数的sizeof(步长,Offset, 是不是这样叫)即可,
    如果转换成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
      

  8.   


        今天好像被小孩闹昏头了,很简单的一句话,居然连续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)
      

  9.   

    真实没法见人了,貌似简单的问题,始终搞不定,让各位见笑了,可笑啊!pascal测试结果:procedure TForm1.Button1Click(Sender: TObject);
    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函数了解不透啊!
      

  10.   

    typedef __w64 unsigned long PTR;
    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);
      

  11.   

    真是谢谢各位了!ERR0RC0DE() 大哥真是仔细啊!
    如果转换成DWORD, Integer, Cardinal类型,则表明该参数是忽略步长。
    要害是这个吧!
    小弟以后还有很多问题请教啊,还要麻烦各位大哥啊!
    先谢过了!
      

  12.   

    _pname:=MemAlloc(byte(field_name[0])+2)
    field_name是个数组。
    这句得内存分配是怎么样的?是field_name[0]的值所占的字节再加2吗?MemAlloc的参数是分配的内存大小。
    procedure MemSet(p:pointer;Count:dword;C:byte);这个函数作用是什么?
      

  13.   

    _pname:=MemAlloc(byte(field_name[0])+2)
    分配field_name[0]第一个字节的值(比如'a',即为97)+2个字节.MemSet是对p开始的Count个字节使用C的值来填充。
      

  14.   

    终于看懂了这句了
    inc(dword(q),q^-2); 
    inc的第一个参数用指针,和数值效果是不一样的
    这个里面好像有个隐试的赋值
    inc(pointer,1)->这个是根据指针所指向的值的空间大小来计算的,也就是sizeof(pointer^)*1
    inc(dword(pointer),1)就是把地址转换成10进制数,经过计算后pointer的也就变了,指向的值也就变了