![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что-то я торможу (
Поручик © (2004-12-07 00:14:00)Почему появляется AV в таком коде:
For i:=1 to LENGTH(sSource) do
begin
if sSource[i] <> '#13' then
sSend[i] := sSource[i]
else
DelBeg(length(sSend)+1);
end;
begin...end (2004-12-07 10:13:00) [1]> [22] Ega23 © (07.12.04 10:01)
Не совсем по теме, но вот ещё интересный момент:
var
s1, s2, s3: String;
I, J: Integer;
t1, t2: Cardinal;
begin
// Делаем большущую строку
s1 := DupeString('x', 1000000) + #13 + 'x';
// Вариант с последовательным прибавлением символов
t1 := GetTickCount;
s2 := '';
for I := 1 to Length(s1) do
if s1[I] <> #13 then s2 := s2 + s1[I];
t1 := GetTickCount - t1;
// Вариант с предварительной установкой длины строки и последующим усечением
t2 := GetTickCount;
SetLength(s3, Length(s1));
J := 0;
for I := 1 to Length(s1) do
if s1[I] <> #13 then
begin
Inc(J);
s3[J] := s1[I];
end;
SetLength(s3, J);
t2 := GetTickCount - t2;
ShowMessageFmt('Ega23: %d, begin...end: %d', [t1, t2])
end.
Выполни, будешь удивлён :-)
Такое, конечно, будет сильно заметно только для больших строк, но кто знает, чего там Поручик намутил :-)
Ega23 (2004-12-07 10:01:00) [2]begin...end © (07.12.04 09:51) [21]
А... Не разобрался, что автору нужно...
begin...end (2004-12-07 09:51:00) [3]> [20] Ega23 © (07.12.04 09:44)
Ну а Break где?
Ega23 (2004-12-07 09:44:00) [4]
var
s1,s2:String;
i:Integer;
begin
s2:='';
for i:= 1 to Length(s1) do
if s1[i]<>#13 then s2:=s2+s1[i];
end;
?
begin...end (2004-12-07 09:13:00) [5]Забыл сказать: LeftStr находится в модуле StrUtils.
begin...end (2004-12-07 09:12:00) [6]> [12] Поручик © (07.12.04 00:48)
> Этот код должен брать из строки все символы пока не встретит
> #13 и копировать их в другую переменную, с которой я работаю.
Как вариант:
var
sSource, sSend: String;
P: Integer;
begin
P := Pos(#13, sSource);
if P > 0 then
sSend := LeftStr(sSource, P - 1)
end.
SergP (2004-12-07 08:43:00) [7]
> Котелок вчера не варил, после DelBeg должен идти break
ага...
Поручик (2004-12-07 08:04:00) [8]SergP © (07.12.04 1:02) [14]
если sSource, то нехорошо получается когда цикл у тебя For i:=1 to LENGTH(sSource) а саму переменную sSource ты укорачиваешь в теле цикла.
Котелок вчера не варил, после DelBeg должен идти break
SergP © (07.12.04 1:02) [14]
i:=pos(#13,sSource+#13);
sSend:=copy(sSource,1,i-1);
delete(sSource,1,i);
Спасиб, я вчера сначала так хотел сделать, но не сдалал, ошибки какие-то были.
TButton (2004-12-07 01:03:00) [9]
> А вообще пишу бота для одной онлайновой игры.
респект.
SergP (2004-12-07 01:02:00) [10]
> Удаляет часть строки, которая прочитанна.
Какой строки?
если sSource, то нехорошо получается когда цикл у тебя For i:=1 to LENGTH(sSource) а саму переменную sSource ты укорачиваешь в теле цикла.
> Этот код должен брать из строки все символы пока не встретит
> #13 и копировать их в другую переменную, с которой я работаю.
Т.е если я правильно понял из твоего описания (но не из кода) то он должен брать символы до первого появления #13, засунуть получившийся кусок в другую переменную и "отрезать" от переменной с исходным текстом этот же кусок + #13?
Если так, то:
i:=pos(#13,sSource+#13);
sSend:=copy(sSource,1,i-1);
delete(sSource,1,i);
Поручик (2004-12-07 00:56:00) [11]Короче завтра перепишу на свежую голову алгоритм, и делу конец.
А вообще пишу бота для одной онлайновой игры.
Поручик (2004-12-07 00:48:00) [12]SergP © (07.12.04 0:37) [10]
А что это за процедура?
Удаляет часть строки, которая прочитанна.
SergP © (07.12.04 0:39) [11]
Кстати скажи что этот код должен делать, тогда будет понятнее.
Этот код должен брать из строки все символы пока не встретит #13 и копировать их в другую переменную, с которой я работаю.
SergP (2004-12-07 00:39:00) [13]
> [8] Поручик © (07.12.04 00:32)
> Когда инициализирую и убираю кавычки то ругается - AV;
> а с кавычками работает, правда не уверен, что правильно,
> сейчас проверю
Кстати скажи что этот код должен делать, тогда будет понятнее.
SergP (2004-12-07 00:37:00) [14]
> DelBeg
А что это за процедура?
Поручик (2004-12-07 00:37:00) [15]Anatoly Podgoretsky © (07.12.04 0:30) [6]
А это вообще абсурд sSource[i] <> '#13' сравнивать символ со строкой
Да, пора спать, что-то я сразу не понял что это строка будет такая #13, а не символ...
Спокойной ночи.
Поручик (2004-12-07 00:32:00) [16]Когда инициализирую и убираю кавычки то ругается - AV;
а с кавычками работает, правда не уверен, что правильно, сейчас проверю
Поручик (2004-12-07 00:30:00) [17]Забыл инициализировать, спасибо Анатолий.
Anatoly Podgoretsky (2004-12-07 00:30:00) [18]А это вообще абсурд sSource[i] <> '#13' сравнивать символ со строкой, убери кавычки.
Anatoly Podgoretsky (2004-12-07 00:28:00) [19]Длина sSend < sSource
Поручик (2004-12-07 00:26:00) [20]SergP © (07.12.04 0:22) [3]
if sSource[i] <> '#13' then
Нет! Что с апострофами, что без вываливается. Сначало работало без апострофов, потом что-то начал ругаться на эту строчку, я их поставил. А так что ставь, что убирай - результат один - AV в четвертой строчке.
По идее должно быть все нормально, а AV :(