Страница 2 из 2

Re: Вопросы по теме книги

Добавлено: 14.09.2012 09:55:33
Oleg_D
Испытайте эту программку, откомпилировав FPC.

Код: Выделить всё

var S : AnsiString;    T : String;
BEGIN
  S:= 'AnsiString';  T:= 'String';
  Writeln(SizeOf(S));  { 4 }
  Writeln(SizeOf(T));  { 256 }
  Readln;
END.

Дело в том, что переменные типа AnsiString - это указатели. Вообще, прежде чем делать что-то со строкой, составьте себе чёткое представление, с каким именно типом вы работаете.
А возвращаясь к FillChar, добавлю, что процедура эта трактует заполняемую область памяти как некий массив байтов, без учёта типа. На практике её лучше применять к массивам и записям (структурам).

Re: Вопросы по теме книги

Добавлено: 16.12.2012 11:37:31
Paster Fob
Олег Виленович.Не могу никак разобраться.
Глава 48
Совместив сдвиг с логическими операциями, можно исследовать отдельные биты слова. Перед вами булева функция TestBit, принимающая два параметра:ARG — число, в котором проверяется состояние некоторого бита, и BIT — номер этого бита. Функция возвращает TRUE, если проверяемый бит содержит единицу, и FALSE в противном случае.

Код: Выделить всё

function TestBit (arg: longint; bit : byte): Boolean; 
begin
  TestBit := (arg and (1 shl bit)) <> 0
end;


Исходя из выше сказанного пишу такой вот код для проверки функции.

Код: Выделить всё

function testbit(arg:integer;bit:byte):boolean;
begin
  testbit:=(arg and (1 shl bit))<>0;
end;


var
  num:longint;i:byte;
  s:string;c:char;

begin
  readln(num);
  for i:=8 downto 1 do
    if testbit(num,i) then
      write(1)
    else
      write(0);
  writeln;
  s:='';
  for i:=1 to 8 do begin
    c:=char ((num mod 2)+ord('0'));
    s:=c+s;
    num:=num div 2;
  end;
  writeln(s);
  readln
end.


Ввёл я например число 5 в отве получил 00000010 хотя должно быть 00000101
Так что я не понял,в чём смысл функции?
Я так понимаю что двоичное представление числа,это и есть биты.Т.е. получается что 8-ой бит содержит 1; 7 => 0 ; 6 => 1 ; остальные 0.Но функция показывает совсем другое.Или я что-то попутал и не так понял?

Re: Вопросы по теме книги

Добавлено: 16.12.2012 11:42:10
bormant
for i:=7 downto 0 do ...

потому как младший бит 0-й, для его проверки 1 сдвигать влево не нужно (1 shl bit).

Re: Вопросы по теме книги

Добавлено: 16.12.2012 12:08:36
Oleg_D
Меня опередили :-)
Да, у программистов принято нумеровать биты с нуля, проверил, работает. Можно будет в книжке сказать об этом.

Re: Вопросы по теме книги

Добавлено: 16.12.2012 13:15:17
bormant
По поводу "нумеровать с 0" -- программистам обычно удобнее оперировать не порядковым номером, а смещением от базы, отсюда и 0.

Re: Вопросы по теме книги

Добавлено: 16.12.2012 13:55:40
Oleg_D
bormant писал(а):По поводу "нумеровать с 0" -- программистам обычно удобнее оперировать не порядковым номером, а смещением от базы, отсюда и 0.

Так я и говорю -- привычка уже. Один знакомый программист, заполняя анкету, в графе "количество детей" так и написал: 0. Кадровичка долго "въезжала", что это значит, потом потребовала: напиши "нет". :-)

Re: Вопросы по теме книги

Добавлено: 16.12.2012 15:34:28
Vadim
Oleg_D писал(а): потом потребовала: напиши "нет". :-)

И тогда он написал:

Код: Выделить всё

SELECT NOT ISNULL(`дети`) FROM `анкета`;

:D

Re: Вопросы по теме книги

Добавлено: 17.12.2012 15:33:47
Paster Fob
bormant писал(а):for i:=7 downto 0 do ...

потому как младший бит 0-й, для его проверки 1 сдвигать влево не нужно (1 shl bit).


Oleg_D писал(а):Да, у программистов принято нумеровать биты с нуля, проверил, работает. Можно будет в книжке сказать об этом.


Всё ясно,значит я всё правильно понял.Только о нумерации не подумал.