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

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

PChar TO String [D7, WinXP]


Davinchi ©   (2004-11-29 20:42:00) 

Господа, наверное глупый вопрос, но как корректно перевести Buffer: Array[0..255] of Char в Str: String, при этом выкинуть все переводы строк и пустые символы или "кракозябры", которые нормально не отображаются.... Я имею ввиду какую нибудь стандартную функцию, если таковой нет, то я сам это могу сделать, прото времени нет писать ее самому...
Заранее благодарен!!!


GrayFace   (2004-11-30 05:57:00) [1]

GuAV ©   (29.11.04 23:57) [10]
SetLength(Result, High(A) - Low(A));

SetLength(Result, High(A) - Low(A) + 1);

GuAV ©   (29.11.04 23:57) [11]
Че значат эти цифры?


GanibalLector   (2004-11-30 00:01:00) [2]

2 GuAV [11]
Это и так понятно ;)


GuAV   (2004-11-29 23:57:00) [3]

var A: array[0..255] of Char =
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF'+
 '0123456789ABCDEF0123456789ABCDEF';

function Concatenation: string;
var I: Integer;
begin
 Result := '';
 for I := Low(A) to High(A) do
   if A[I] in ['0'..'9'] then
     Result := Result + A[I];
end;

function DirectAssignment: string;
var I, J: Integer;
begin
 J:=0;
 SetLength(Result, High(A) - Low(A));
 for I := Low(A) to High(A) do
   if A[I] in ['0'..'9'] then
   begin
     Inc(J);
     Result[J] := A[I];
   end;
 SetLength(Result, J);
end;

procedure TForm1.Button1Click(Sender: TObject);
const
 TestCount = 10000;
var
 A, B: Cardinal;
 i: Integer; i1, i2 : tcolor;
begin
 Assert(Concatenation = DirectAssignment);

 A := GetTickCount;
 for i := 0 to TestCount do Concatenation;
 A := GetTickCount - A;

 B := GetTickCount;
 for i := 0 to TestCount do DirectAssignment;
 B := GetTickCount - B;

 Caption := Format('Concatenation = %d'+
   ', DirectAssignment = %d', [A, B]);
end;


GuAV   (2004-11-29 23:57:00) [4]

Concatenation = 935, DirectAssignment = 21


GanibalLector   (2004-11-29 23:32:00) [5]

2 GuAV ©   [8]
> предварительно установив длину S в максимум, а потом скоректировав длину.
Начитался статей http://www.delphimaster.ru/articles/dyntable/index.html ???


GuAV   (2004-11-29 23:25:00) [6]

2 GanibalLector

SetString(Str, Buffer, 256);- и Chr(0) не страшен.

А по теме - согасен с begin...end ©   (29.11.04 22:08) [5]. Только лучше прибавлять не S:=S+Ch, а S[I]:=Ch, предварительно установив длину S в максимум, а потом скоректировав длину.


GanibalLector   (2004-11-29 23:03:00) [7]

begin...end предложил в [3] правильно,а то что там переводы строк...это ничего.Лишь бы chr(0) не было


begin...end   (2004-11-29 22:12:00) [8]

> Davinchi

P.S. Надеюсь, Вы понимаете, что если я этого решения не вижу, то это не означает, что его нет... :-) Подождите, может кто чего подскажет...


begin...end   (2004-11-29 22:08:00) [9]

> [4] Davinchi ©   (29.11.04 22:04)

Что-то не вижу никакого решения, кроме пробега по массиву и прибавления / неприбавления очередного символа к Str в зависимости от того, считается ли этот символ мусором или нет...


Davinchi   (2004-11-29 22:04:00) [10]

не идет по той причене, что присутствуют переводы строк и еще всякие спец символы. К стати, StrPas делает то же самое... А кок получить строку без всякого мусора???


begin...end   (2004-11-29 21:59:00) [11]

> Davinchi ©   (29.11.04 20:42)

> как корректно перевести Buffer: Array[0..255] of Char в
> Str: String

Str := String(Buffer)не подойдёт?


Davinchi   (2004-11-29 21:01:00) [12]

а че делает StrPas??? ни это ли случайно


NE_Mashinist   (2004-11-29 20:57:00) [13]

Не слышал стандартной, думаю что нет!


Наверх

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