Вниз
Скачать: CL | DM;

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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
2-1157200732
Sam Stone
2006-09-02 16:38
2006.09.24
Параметр для потока


15-1157570633
Комбинатор
2006-09-06 23:23
2006.09.24
BDS2006. Внедрение хелпа


15-1157449721
ПЛОВ
2006-09-05 13:48
2006.09.24
Подскажите пожалуйста где б найти такую вот информацию:


15-1157430752
Pazitron_Brain
2006-09-05 08:32
2006.09.24
E-mail - SMS


15-1157140922
ANTPro
2006-09-02 00:02
2006.09.24
IBE




   Наверх