问一简单问题 ( 积分: 11 )

  • 主题发起人 主题发起人 ykjt
  • 开始时间 开始时间
Y

ykjt

Unregistered / Unconfirmed
GUEST, unregistred user!
FillChar(S, SizeOf(S), Ord(' '));



FillChar(S, SizeOf(S), ' ');

效果是一样的,有何区别呢?

还有FillChar(S, SizeOf(S), 0);

这里的0是什么意思,好像不是赋值
 
FillChar(S, SizeOf(S), Ord(' '));



FillChar(S, SizeOf(S), ' ');

效果是一样的,有何区别呢?

还有FillChar(S, SizeOf(S), 0);

这里的0是什么意思,好像不是赋值
 
Delphi帮助:
procedure FillChar(var X
Count: Integer
Value: Byte);

Description

In Delphi, FillChar fills Count contiguous bytes (referenced by X) with the value specified by Value (Value can be type Byte or Char).

Warning: This function does not perform any range checking.
(要是看不明白,安装个金山词霸,自己翻译一下)
 
FillChar(S, SizeOf(S), Ord(' '));
按照一般的理解,S是表示String类型的变量的,你上面的调用是要用空格来填充你的这个S,那么你上面的调用是个错误的调用,之所以在执行完你的上面的那个调用的时候没有报错,是因为你上面的调用在计算机看来是合理的(至少没有内存越界)
正确的调用方式是
FillChar(S[1], Length(S), Ord(' '));
至于为啥,我觉得你还是先从头到尾详细看看 Delphi开发人员指南 的好
 
s此处是数组,我理解它是指向第一个元素的指针,并不是楼上所说的“S是表示String类型的变量的”
 
procedure TForm1.Button3Click(Sender: TObject);
var
S: array[0..3] of char;
begin
fillChar(S, SizeOf(S), Ord('a'));
//FillChar(S, SizeOf(S), 'a');
Caption:='mmm'+s[0]+s[1]+s[2]+s[3]+'nnn';
end;
用ord('a')和 'a'填充得到的CAPTION都是mmmaaaannn,是不是填充时系统自动进行了转换?
也即系统自动将'a'转换为ord('a')
 
procedure TForm1.Button3Click(Sender: TObject);
var
S: array[0..3] of char;

begin
fillChar(S, SizeOf(S), 0);
Caption:='mmm'+s[0]+s[1]+s[2]+s[3]+'nnn';
end;
此时得到的CAPTION为mmm,而没有了'nnn',为什么?
 
看来你真的不喜欢看帮助啊,虽然帮助信息完整地解释了你的疑惑。即使帮助就那么两句话,而且别人都把他放在了你眼前。
学问学问,学而后问!
 
帮助看了,水平有限所以不理解。还请高人指点!
 
这是我查到的例程:
FillChar过程
用指定的值填充相邻的字节
单元
System
原型
procedure FillChar(var X
Count: Integer
Value: Byte);
描述
FillChar 用由Value(Value可以是Byte类型或者Char类型)指定的值填充个数为Count的相邻的字节(被X引用referenced by X)。
警告: 这个函数不执行任何范围检查。
示例
var
S: array[0..79] of char;
begin
{ 设置所有的空间 }
FillChar(S, SizeOf(S), Ord(' '));
end;
 
呵呵,你好真好脾气噢。
一个Char类型的变量,其SizeOf是1,一个Byte类型的变量,其SizeOf也是1
也就是说,他们占内存的大小是一样的。
Char类型的数据在内存中是用其ASCII码来表示的,也就是说,字符A在内存中是65(好像是噢[:D]),如果你把这个65当成Char,那么他就是A,如果你把他当成是Byte,那他就是65。
0 如果你把他看成是Char,表示ASCII是0的字符。
标准的字符串是以ASCII为0作为结束标记的(Delphi中的String不是),FillChar(s, SizeOf(s), 0)意思是用ACSII为0的字符去填充这个s。
 
一个整型数值可以付值给一个浮点数,这是数据类型的隐式转换(也就是编译器为你实现的转换),关于什么样的数据类型会进行隐式转换,这方面你可以查你使用的语言的隐式转换表。
一个Char类型可以被隐式转换成一个Byte类型,一个Byte类型也可以隐式转换成一个Char类型。
对许多关于字符串处理的函数(尤其是API函数),都是遇到ASCII为0的字符,就认为这个字符串结束了。因此你的
fillChar(S, SizeOf(S), 0);
Caption:='mmm'+s[0]+s[1]+s[2]+s[3]+'nnn'
是先用ASCII为0的字符填充了s, 'mmm'+s[0]+s[1]+s[2]+s[3]+'nnn'形成的是一个
'mmm'#0#0#0'nnn'字符串(#是个转意字符,后面跟着的是ASCII值),当你把这个字符串付给Caption的时候,因为mmm后面是一个ASCII为0的字符,因此付值操作就认为这个字符串结束了,所以你得到的Caption是mmm
 
放飞:谢谢你的答复
也就是说:value即可以是byte型,也可以是char型
上例中:ord(' ')是byte型,‘ ’是CHAR型,是这样吗?
 
fillChar(S, SizeOf(S), Ord('a'));
//FillChar(S, SizeOf(S), 'a');
Caption:='mmm'+s[0]+s[1]+s[2]+s[3]+'nnn';
这种操作又把填充的byte看成了char,对吗?
 
说实在的,这样的问题你都不清楚,还是先看看数据结构、操作手册之类的书籍再说吧。
 
刚开始学时,往往最容易忽略最基础又最重要的东西。不会走却总想跑。
谢谢放飞的帮助,你这分挣得太辛苦了。
虽然挨批的滋味不好受,但诚恳的批评我还是乐意接受的,再次谢谢你!希望以后多帮助!
 
你也看到了,你的这个问题很少有人关注,实在是太基础的东西了,这些问题还没有整明白,最好还是先不要写程序的好。
 
记住了,谢谢
 

Similar threads

回复
0
查看
863
不得闲
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部