Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
ВнизAV при попытке поиска в строке Найти похожие ветки
← →
DelphiN! © (2006-08-10 09:35) [0]Указываю на данные строке через указатель, затем пытаюсь сделать поиск опеределенных символов в строке(посредством pos) и получаю Access Violation. В чем дело?
var
DataStream: IStream;
function TOurNSHandler.Read(pv: Pointer; cb: ULONG; out cbRead: ULONG): HResult;
var
i: Integer;
Word,NewWord: String;
s: String;
begin
(*Read Data from DataStream to Browser/URLMON *)
DataStream.Read(pv, cb, @cbRead);
if pv <> nil then
begin
SetLength(s,cbRead);
s := String(pv);
NewWord := "My Text!!!";
Word := "<NAMESPACE>";
i := pos(AnsiUpperCase(Word),AnsiUpperCase(s));//Ошибка тут!
while i > 0 do
begin
Delete(s,i,Length(Word));
Insert(NewWord,s,i);
i := pos(AnsiUpperCase(Word),AnsiUpperCase(s));
end;
pv := @s;
end;
Inc(written, cbread);
if (written = totalSize) then
result := S_FALSE
else
Result := E_PENDING;
end;
← →
Reindeer Moss Eater © (2006-08-10 09:45) [1]"Тут" - AV
а ошибка не тут
← →
DelphiN! © (2006-08-10 09:48) [2]> [1] Reindeer Moss Eater © (10.08.06 09:45)
А где ошибка?
SetLength(s,cbRead);
s := String(pv);
Тут?
← →
Сергей М. © (2006-08-10 09:48) [3]
> s := String(pv);
s := StrPas(pv);
> pv := @s;
Move(PChar(s)^, pv^, Length(s)+1)
← →
DelphiN! © (2006-08-10 09:53) [4]> [3] Сергей М. © (10.08.06 09:48)
Спасибо!!!
← →
Сергей М. © (2006-08-10 09:57) [5]
> DelphiN! © (10.08.06 09:53) [4]
Учти, что это будет работать только при условии
Length(NewWord) <= Length(Word)
← →
Slym © (2006-08-10 09:59) [6]В место
SetLength(s,cbRead); //ищет #0 - для определения конца строки и не находит
s := String(pv);
пользуй:
SetString(s,pv,cbRead);//длинна задается и поиск #0 не производится
← →
Slym © (2006-08-10 10:02) [7]Сергей М. © (10.08.06 9:48) [3]
s := StrPas(pv);
тоже AV грозит! ты ни где не ограничеваешь строку нулем! при поиске нуля можно выйти за границы выделенной памяти
вот так прокатит:
PByteArray(pv)[cbRead+1]:=0;
s := StrPas(pv);
← →
Сергей М. © (2006-08-10 10:03) [8]
> DelphiN!
Да, и еще ожно важное замечание: алгоритм даст сбой, если в буфере pv, куда из стрима только что прочитано cbRead байт, не окажется на конце терминирующего строку символа.
← →
Сергей М. © (2006-08-10 10:05) [9]
> Slym
Ты меня опередил)
Разумеется, ситуация с отсутствием терминатора в конце буфера очень вероятна.
Автор это должен осознать и принять меры, например, по твоему совету.
← →
Сергей М. © (2006-08-10 10:12) [10]
> DelphiN!
Ну и самое главное - для решения поставленной тобой задачи этот примитивный алгоритм не годится: работать он не будет.
← →
KilkennyCat © (2006-08-10 10:25) [11]> [10]
:)))
← →
Slym © (2006-08-10 10:26) [12]Slym © (10.08.06 10:02) [7]
Прокатат исли нуля в сообщении небыло!
pv="Hello world"#0"this is test";
s := StrPas(pv);
s="Hello world" утеряно- #0"this is test"
или
pv="Hello world this is test"; явно #0 в конце не проставляется
s := StrPas(pv);
s="Hello world this is test5фывЙ12№23сяхsafkdsafjhsdfлоыва"и так до тех пор пока не найдет #0 или не выйдет за границы выделенной памяти с AV
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c