Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Владимиру Кладову...


Dimaxx ©   (2003-07-31 23:30:00) 

Сейчас столкнулся с проблемой ассемблерных функций Trim. Ни одна не работает, если строка символов окружена не пробелами, а нулевыми символами. Возвращает пустую строку. Паскалевская работает на "ура", а ассемблерная - нет. Не мешает поправить бы... ;-)


Gandalf   (2003-08-05 09:31:00) [1]

> Может, все-таки Hex2Int, Int2Hex ничего не должен анализировать,
> у него на входе число. Hex2Int лучше не трогать.


Да конечно, соответсвенно Oct2Int - можно и Bin2Int - он мне лично не нужен но они настолько легко клепаются из Hex2Int что грех не сделать.

function Hex2Int( const Value : String) : Integer;
var I : Integer;
begin
Result := 0;
I := 1;
if Value = '' then Exit;
if Value[ 1 ] = '$' then Inc( I );
// C form support
if Value[ 2 ] = 'x' then  I:=3;
while I <= Length( Value ) do
begin
  if Value[ I ] in [ '0'..'9' ] then
     Result := (Result shl 4) or (Ord(Value[I]) - Ord('0'))
  else
  if Value[ I ] in [ 'A'..'F' ] then
     Result := (Result shl 4) or (Ord(Value[I]) - Ord('A') + 10)
  else
  if Value[ I ] in [ 'a'..'f' ] then
     Result := (Result shl 4) or (Ord(Value[I]) - Ord('a') + 10)
  else
    break;
  Inc( I );
end;
end;

function Oct2Int( const Value : String) : Integer;
var I : Integer;
begin
Result := 0;
I := 1;
if Value = '' then Exit;
while I <= Length( Value ) do
begin
  if Value[ I ] in [ '0'..'8' ] then
    Result := (Result shl 3) or (Ord(Value[I]) - Ord('0'))
  else
    break;
  Inc( I );
end;
end;

function Bin2Int( const Value : String) : Integer;
var I : Integer;
begin
Result := 0;
I := 1;
if Value = '' then Exit;
while I <= Length( Value ) do
begin
  if Value[ I ] in [ '0'..'1' ] then
    Result := (Result shl 1) or (Ord(Value[I]) - Ord('0'))
  else
    break;
  Inc( I );
end;
end;

Насчет StrReplace - пардон, теперь не могу добится эффекта вылетания, видимо померещилось. (Или дело было в Parse?)


Dimaxx   (2003-08-04 23:27:00) [2]

А как тогда обрезать нулевые символы в строке, если ничего не править? Вот тут-то и добавляем свой лишний код. 8-( Так какая разница - в KOL добавить или каждый будет городить свои версии замены нулей на пробелы, а потом их триммингование? А так была бы полная функциональность. И добавлять ничего не пришлось бы.
Иначе к переносу с VCL на KOL будет добавлено самостоятельное исправление таких вот мелких неприятностей. ;-) Сначала это, потом другое обнаружится...

PS: В ассемблерной части добавить-то всего-ничего: дополнительную команду сравнения. :-)


Кладов   (2003-08-04 19:40:00) [3]

Может, все-таки Hex2Int, Int2Hex ничего не должен анализировать, у него на входе число. Hex2Int лучше не трогать. Можно сделать cHex2Int, который еще и на ведущий 0x проанализирует. Насчет Trim'а я тоже не согласен. Во многих случаях хватает trim'а для asciz, а не для asciz можно использовать альтернативный или по-другому названный. Я против изменения функциональности существующих функций и методов, если это не исправление ошибки. Могу согласиться, если изменение не увеличивает размер кода, и не нужно после этого вносить изменения в тех проектах, где эти функции/методы были использованы.


Gandalf   (2003-08-04 14:14:00) [4]

StrReplace не пашет если дать ей пустую строку - вылетает.
Можно добавить в Int2Hex - Си формат (0x...) - добавить проверку на ворой знак и смещать индекс на 2 (ведь проверка на $ есть) - мне бонадобилось.
Может ввести функцию Int2Oct?

Код исправленый Int2Hex и Int2Oct - могу выслать.


miek   (2003-08-01 08:49:00) [5]

И это не только для Trim, кстати говоря. А дело в том, что в них используется код для ASCIIZ-строк.


Наверх

Титульная страница Поиск, карта сайта Написать письмо