С помощью процедуры FillChar можно заполнить любое поле памяти одним и тем же однобайтным значением. Заголовок процедуры имеет вид
FillChar(VarV; N:word; b:byte)
или FillChar(Var V; N:word; ch:char).
Здесь V - переменная любого типа;
N - количество байтов в поле V, которые заполняются значением b или ch.
Поскольку после имени формальной переменной V не записано имя типа, то этой переменной может соответствовать фактический параметр любого типа.
Предположим, что нам требуется обнулить целочисленный массив A и вещественный массив B. В цикле это можно сделать следующим образом:
Vari,j : word;
A : array[1..1000] ofinteger;
B : array[0..25,1..5] of real;
Begin
Fori:=1 to 1000 do
a[i]:=0;
Fori:=0 to25 do
For j:=1 to 5 do
b[i,j]:=0;
Однако более эффективно (по быстродействию и требуемому объему памяти) эта задача решается с помощью процедуры FillChar:
FillChar(A,SizeOf(A),0); FillChar(B,SizeOf(B),0).
Здесь процедура FillChar заполняет каждый байт полей A и B нулевым значением.
Если в массиве A нужно обнулить только элементы 101 .. 500, а в матрице B - ее первые две строки, то это можно сделать следующим образом:
FillChar(A[101],400*SizeOf(integer),0);
FillChar(B,2*5*SizeOf(real),0).
Если массив, элементы которого занимают свыше одного байта памяти, нужно заполнить ненулевым значением, то в этом случае использование процедуры FillChar приведет к ошибке. Например, при обращении
FillChar(A,SizeOf(A),1)
каждому элементу массива A будет присвоено значение 257, а не 1 ( = 00010001 ).
Процедура FillChar может быть использована также для заполнения строки одним и тем же символом. Однако в этом случае нужно позаботиться о принудительном установлении в нулевом байте текущей длины строки.
Пример.
VarS1 : string[80];
S2 : string;
Begin
FillChar(S1,SizeOf(S1),' '); S1[0]:=chr(80);
FillChar(S2[1],100,#32); S2[0]:=chr(100);
Так как SizeOf(S1) = 81, то процедура FillChar заполняет пробелом все байты строки S1, в том числе и нулевой байт. После этого в нулевой байт принудительно заносится текущая длина строки. При отсутствии оператора S1[0]:=chr(80) в нулевой байт S1[0], как и в другие байты строки S1, будет занесен пробел, номер которого по таблице ASCII равен 32. Следовательно, при дальнейшей обработке строки S1 будет считаться, что ее длина равна 32 символам.
В строке S2 заполнение пробелом начинается с адреса S2[1], т.е. с первого ее символа. Поскольку содержимое нулевого байта при этом не изменилось (в данном случае оно осталось неопределенным), то оператором присваивания формируется конкретное значение текущей длины строки S2.
Каждый байт строки, в том числе и нулевой байт, рассматривается как символ. В связи с этим нельзя указывать текущую длину строки оператором S1[0] := 80.