请问如何给一个动态字符数组赋值

zxd1999 2005-06-28 02:50:23
我是首先定义了一个
MessageContent: array of Char;

然后在使用的时候
SetLength(MessageContent,length(eMsg.Text));

但strpcopy( MessageContent, eMsg.Text );
却报错([Error] main.pas(284): Incompatible types: 'Array' and 'Char')

这是什么原因,不能这样写吗,如果messagecontent是定长就可以了

哪位大大知道,请告知,谢谢
...全文
236 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
to beyondtkl(大龙驹<*学习祖国医学中,国粹,路在何方?*>)

还是报错,可能不是赋值的原因,再去看看,谢谢各位大大
beyondtkl 2005-06-29
  • 打赏
  • 举报
回复
procedure TMainFrm.Button1Click(Sender: TObject);
var
s: array of Char;
begin
SetLength(s, 100);
StrCopy(PChar(s), PChar(LbPrompt.Caption));
ShowMessage(string(s));
end;

这样 OK 我刚试过。
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
用for和用move一样,到底是为什么啊
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
用move也会报类似于

strpcopy(PChar(MessageContent), eMsg.Text );

的错误
cxj1976 2005-06-29
  • 打赏
  • 举报
回复
一个比较笨的方法,用for循环赋值
SetLength(MessageContent,length(eMsg.Text));
for i := 1 to length(eMsg.Text) do
MessageContent[i] := eMsg.text[i];
何鲁青 2005-06-29
  • 打赏
  • 举报
回复
用move函数吧
procedure TForm1.Button1Click(Sender: TObject);
var MessageContent: array of Char;
begin
SetLength(MessageContent,length(eMsg.Text));
Move(eMsg.text, MessageContent, length(eMsg.Text));
showmessage(PChar(MessageContent));
end;
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
不行啊,我是定义一个包的类型,然后用socket发出这个包,用string就接收不对,就是说必须用char类型,但赋值到底要怎么办啊
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
我用strpcopy(PChar(MessageContent), eMsg.Text );

在赋值过程中就会报“project xxxxx.exe raised exception class eaccessviolation with message'access violation at address 00409161 in module 'xxxxx.exe'.write of address 00000000' process stopped.use step or run to continue.”


而用StrCopy(@MessageContent, PChar(sMsg.Text));
就会报“project d:\xxxxx.exe faulted with messatge:access violation at 0xc3a2cfc5:read of address oxc3a2cfc5'.process stopped.use step or run to continue.”


决定用string试试
zxd1999 2005-06-29
  • 打赏
  • 举报
回复
上面的方法单独试都可以呢,但不知道为什么加到我的程序里面就不行了

我是定义了一个
TSGIP_SUBMIT_tag = packed record
MessageCoding: Byte;
MessageType: Byte; //信息类型
MessageLength: longword; //信息长度
MessageContent: array of Char;
Reserve: array[0..7] of Char; //保留
end;

这样一个包
然后
SetLength(Sgip_SUBMIT_tag.MessageContent,length(eMsg.Text)+1);(//看到有人说要加1就是加个#0)
FillChar( Sgip_SUBMIT_tag, SizeOf( Sgip_SUBMIT_tag ), 0 );
with Sgip_SUBMIT_tag do
begin
MessageCoding := 15; //byte;//信息格式
MessageType:=0;
MessageLength:=htonl(length(eMsg.Text));
strpcopy(Pchar(MessageContent),eMsg.Text )
end;

然后再cSocket.SendBuf

运行过程中就会报“project xxxxx.exe raised exception class eaccessviolation with message'access violation at address 00409161 in module 'xxxxx.exe'.write of address 00000000' process stopped.use step or run to continue.”
何鲁青 2005-06-29
  • 打赏
  • 举报
回复
应该是其它地方的错误,你单步执行看看到哪里出的错,我的move也是试过之后才给你的...
saien 2005-06-29
  • 打赏
  • 举报
回复
字符串类型在访问上与数据是一致的,只不过字符串是从1开始的
例如:
Var
S:String;
begin
S :='qaz';
//S[1] 就等于 字符'q'
//S[2] 就等于 字符'a' ....
end;
saien 2005-06-29
  • 打赏
  • 举报
回复
var
MessageContent: String;
begin
setLength(MessageContent,length(eMsg.Text));
strpcopy(Pchar(MessageContent),eMsg.Text );
emsg.Lines.Add(MessageContent);
end;
zhangdaosheng 2005-06-28
  • 打赏
  • 举报
回复
strpcopy(PChar(MessageContent), eMsg.Text );
xinqingbucuo 2005-06-28
  • 打赏
  • 举报
回复
StrCopy(@MessageContent, PChar(sMsg.Text));

xinqingbucuo 2005-06-28
  • 打赏
  • 举报
回复
同意楼上
,感觉string 好,不用定字节
beyondtkl 2005-06-28
  • 打赏
  • 举报
回复
MessageContent: array of Char;

干吗 不用 string呢。。

StrCopy(@MessageContent, PChar(sMsg.Text));

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧