基础知识(100分)

  • 主题发起人 主题发起人 weimaoan
  • 开始时间 开始时间
W

weimaoan

Unregistered / Unconfirmed
GUEST, unregistred user!
我在使用SPCOM编程时,发送成批数据时,要求提供数据缓冲区的pchar指针,及数据的长度,而我要发送的数据包括字符串,浮点数,整形数等,请问:
1.如果我用纪录包含发送的数据,纪录的执政如何转换为pchar指针,纪录的长度,又如何将POINTER指针转换为纪录的指针,如何计算?(能否给出例子)?
2.包含各种类型的批量数据有无别的传输方法?
3.二进制数文件及文本文件如何传输?
 
什么是spcom?
 
spcom时一种串行通讯控件
 
我刚刚才发现我对指针的理解还是很肤浅,重新想了一下才明白,下面是我刚刚做的例子:(我复制了核心部分)

type
TRecTest = record //我用这个结构来测试你想要的功能!
head :integer;
data :real;
str :array [0..33] of char;
end;

TForm1 = class(TForm)
...
private
size :integer;
end;

var
Form1: TForm1;
pc : Pointer
//此指针指向的内存用于存储记录包

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
size := sizeof(TRecTest);
GetMem(pc,size*2);
end;

//Button1用于把记录包写入数据缓冲区
procedure TForm1.Button1Click(Sender: TObject);
var
rec :array [0..1] of TRecTest;
pr :pointer;
i :integer;
begin
//给记录包赋值
rec[0].head := 123;
rec[0].data := 1.2;
rec[0].str := 'i am a cowboy';
rec[1].head := 234;
rec[1].data := 2.3;
rec[1].str := 'you are a cowboy';
//写入数据缓冲区
for i:=0 to 1 do
begin
pr := @rec;
CopyMemory(Pointer(integer(pc)+i*size),pr,size);
end;
Label1.Caption := 'Copy memory ok!';
end;

//Button2用于把数据缓冲区读入记录包
procedure TForm1.Button2Click(Sender: TObject);
var
rec :^TRecTest;
begin
rec := pc
// 若你把pc定义成pchar,则这一句要改为 rec := pointer(pc);
label1.Caption := inttostr(rec.head);
label2.Caption := floattostr(rec.data);
label3.Caption := rec.str;

rec := Pointer(integer(pc)+size);
label4.Caption := inttostr(rec.head);
label5.Caption := floattostr(rec.data);
label6.Caption := rec.str;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeMem(pc);
end;
end.

 
其实Delphi对指针的隐藏使我们忽视了指针的重要性,但无论如何我们应该知道
1、指针对内存操作有着相当重要的作用;
2、Pascal的指针确实比C的指针要逊色,缺乏C指针的灵活性,但这不表示我们无法
实现C指针的(大部分)功能!
 
是spcomm32吧。
传送数据,你要自己定义一种传送协议,双方按此协议发送接收就行了。
发送文件可以用tapiline1.4,也是个控件,相当于超级终端。
 
很简单,搞清楚Move的用法就全明白了。
 
公子的东西比较精致, 懒人如我者可以用下面代码:
比如要传送x: integer
y: double
z: string;

1.写入缓冲:
var
buffer, p: pchar;
l: Integer;

l := sizeof(integer)+sizeof(double)+length(z)+1;
buffer := allocmem(l);
fillchar(buffer^, l, 0)
// 缓冲区清空, 主要是为了传的字符串(z)能用#0结尾,
// 以便读出时能区分
p := buffer
// p为当前指针
move(x, p^, sizeof(integer))
// 把x的值保存到buffer中
p := p + sizeof(integer)
// 移动指针到新位置, 然后可以写下一个
move(y, p^, sizeof(double))
// 把y的值保存到buffer中
p := p + sizeof(double);
move(z[1], p^, length(z))
// 把字符串复制到buffer中
..... // 保存完毕, 可以传送buffer啦.

读出缓冲区:
p := buffer
// 假定buffer指向缓冲区的头.
move(p^, x, sizeof(integer));
p := p + sizeof(integer);
move(p^, y, sizeof(double));
p := p + sizeof(double);
z := strpas(p);

ok.
 
对于记录结构,还是用指针比较合适。
 
To: 柳五公子

>2、Pascal的指针确实比C的指针要逊色,缺乏C指针的灵活性,但这不表示我们无法实现C指针的(大部分)功能!
?? 其实两者的功能是完全相同的, Pascal/Delphi的编译器里面
可以指定选项不要强类型的指针, 这样就和C一样了. 即使是强类
型的指针, 那也是和C++相当的, 同C没有功能上的强弱之分, 只
是使用起来麻烦一点, 但是强类型带来了高的可靠性, 牺牲一点
方便性还是值得的.


 
多人接受答案了。
 

Similar threads

后退
顶部