请教如何将以下c语句转成delphi语句: (100分)

B

blacwet

Unregistered / Unconfirmed
GUEST, unregistred user!
请教如何将以下c语句转成delphi语句:
定义:
typedef struct {
int XSquares;
short Corner1;
short Corner2;
} HOR2_INFO;
typedef signed char schar;
static schar *EvalPtr;
static schar *ValList[61][10];
static int FeaturePos[10];
HOR2_INFO *Hor2Ptr1, *Hor2Ptr2;
int Eval,Index1;
schar *ValPtr;
schar *Value;

语句:
EvalPtr = ValList[9][0] - FeaturePos[0] + FeaturePos[2];

Hor2Ptr2 = &Hor2Ptr1[Index1];
Eval = ValPtr[Index1];

ValList[5][5] = &Value[4];
 
type
HOR2_INFO = record
XSquares: Integer;
Corner1: SmallInt;
Corner2: SmallInt;
end {HOR2_INFO};
type
schar = Char;
 
不对,delphi的char 是Unsigned char ;应该定义为ShortInt
再者,重要的是后面怎么改
 
我查了一下资料(delphi5 developer's guide)
c语言的char 和 delphi 的 char及shortint 都等价, 如果你想进行数学计算用ShortInt
否则用char.
对于静态指针,你可以考虑全局变量。
type
TArrayType = array[0..60, 0..9] of schar;
var
EvalPtr : ^schar;
ValList : ^TArrayType;
FeaturePos : array[0..9] of integer;
Hor2Ptr1, Hor2Ptr2 : ^HOR2_INFO;
Eval,Index1 : integer;
ValPtr : ^schar;
Value : ^schar;
 
那又怎么解释这些语句呢?
语句:
EvalPtr = ValList[9][0] - FeaturePos[0] + FeaturePos[2];
//这是些什么类型的操作?delphi如何实现?
Hor2Ptr2 = &Hor2Ptr1[Index1];//结构体哪来的下标?
Eval = ValPtr[Index1];
//这又是什么?
ValList[5][5] = &Value[4];//这又是什么?
 
这些语句实际上都是一些指针操作,具体功能和变量声明的次序有关,
我怀疑你的代码是作业题。
ValList[5,5] := Pointer(longInt(Value)+4);
Eval := Pointer(Longint(ValPtr)+Index1);
Hor2Ptr2 := Pointer(Longint(Hor2Ptr1)+Index1);
EvalPtr := Pointer(Longint(ValList[9,0])-FeaturePos[0]+FeaturePos[2]);
 
这句不对:Eval是整型,不是指针
Eval := Pointer(Longint(ValPtr)+Index1);
再有,这些不是作业题,是具体的程序
 
在Delphi中,当pchar型变量(必须是pchar型,不包括^char型及其他指针类型)和整型量
进行加减运算时,可以自动转换类型,最后表达式的值是pchar型。
这样,指针程序可以简化一些。
type
HOR2_INFO= record
XSquares: integer;
Corner1,Corner2: smallint
end;
pHOR2_INFO= ^HOR2_INFO;//要不是为了访问记录内部变量方便,用pchar更简单,不过
//访问记录变量时就要转换了
var
EvalPtr: pchar;
ValList: array[0..60,0..9] of pchar;
FeaturePos: array[0..9] of integer;
Hor2Ptr1, Hor2Ptr2: pHOR2_INFO;
Eval, Index1: integer;
ValPtr, Value: pchar;
begin
EvalPtr:= ValList[9,0]-FeaturePos[0]+FeaturePos[2];
Hor2Ptr2:= pHOR2_INFO(longint(Hor2Ptr1)+Index1);
Eval:= integer(ValPtr+Index1);
ValList[5,5]:= Value+4;
end.
 
好像不行哟
我的代码通不过:
procedure TForm1.Button1Click(Sender: TObject);
var
a,b:pchar;
begin
a:='abcdefg';
b:=Integer(a+2);
label1.Caption:=b;
end;

Integer(地址)如:Eval:= integer(ValPtr+Index1);
是得到地址中的内容吗?我试过,好像不是哟
如果是的话
ValList[MoveNo,I][-J] := -ValList[MoveNo,I][+J];
又如何转换呢?
 
当然不行了!
你的程序中要强制把integer型的值赋给pchar型变量怎么行?
只要 b:=a+2;就没问题了。
pchar型与整型运算的结果是pchar型的指针值(即它指向的对象的地址),
Integer(地址)得到的是这个地址的数值,而不是这个地址存放的内容。
如:
var
p: pchar;
a: array[1..2] of char;
begin
a[1]:='1';
a[2]:='2';
p:= @a;
end.
最后,如果a 的起始地址是$1000,则
integer(p)= $1000
integer(p+1)= $1001
p^= '1'
(p+1)^= '2'
 
最后一个问题
如果用pchar代替schar*的话,一下的语句就无法表示了
因为pchar是无符号类型,schar是有符号类型
static schar *ValList[61][10];
ValList[K][-J] = -ValList[K][+J];
 
大问题!
最近我用vc++6和bc++3.1都试了一下,好像他们都不支持
struct AStructType {
...;
};
struct AStructType *AStructVar;
定义后对AStructVar[AIntVar]的形式的调用,也就是不能在指针后加[下标],不知道你用的
是什么编译系统,你上述的那些c程序能编译通过吗?如果能编译通过,建议你查一下里面有
没有用“运算符重载”,就是找一找源程序中有没有类似AType operator [](SomeParameters)
或AType operator AClassType::[](SomeParameters)的句子。
另外,pchar不是char,它实际上存的是指针,占用4个字节,相当于schar*类型。
有符号类型可以用shortint,用的时候强制类型转换就是了。
 
[:p][:I][:p][:I][:p][:I][:p][:I][:p][:I][:p][:I][:p][:I][:p][:I][:p][:I]
刚刚翻了一下书,才发现我的C语言还是没学好啊!
前面的翻译有错,如下:
Hor2Ptr2:= pHOR2_INFO(longint(Hor2Ptr1)+Index1);
应改为
Hor2Ptr2:= pHOR2_INFO(longint(Hor2Ptr1)+Index1*sizeof(HOR2_INFO));
Eval:= integer(ValPtr+Index1);
应改为
Eval:= integer((ValPtr+Index1)^);
如果严格一点的话,整个语句部分应该改为:
begin
EvalPtr:= ValList[9,0]+(-FeaturePos[0]+FeaturePos[2])*sizeof(char);
Hor2Ptr2:= pHOR2_INFO(longint(Hor2Ptr1)+Index1*sizeof(HOR2_INFO));
Eval:= integer((ValPtr+Index1*sizeof(char))^);
ValList[5,5]:= Value+4*sizeof(char);
end.

另外,我上一篇帖子中的言论作废。
C语言中,如果 p 是一个指针,比如有
AType *p;
的定义,则
p[AIntVar]表示把p指向的地址开始的内存看作AType型的数组,p[AIntVar]代表其中的第AIntVar个数组
元素。
上面的Hor2Ptr1[Index1]表示把Hor2Ptr1指向的地址开始的内存看作struct HOR2_INFO型的数组,
Hor2Ptr1[Index1]代表其中的第Index1个元素,&Hor2Ptr1[Index1]则代表这个元素的首地址。
 
感谢!不好意思再问,毕竟分太少了:)
 
顶部