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

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

AV при попытке поиска в строке


DelphiN! ©   (2006-08-10 09:35:00) 

Указываю на данные строке через указатель, затем пытаюсь сделать поиск опеределенных символов в строке(посредством 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;


Slym   (2006-08-10 10:26:00) [1]

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


KilkennyCat   (2006-08-10 10:25:00) [2]

> [10]

:)))


Сергей М.   (2006-08-10 10:12:00) [3]


> DelphiN!


Ну и самое главное - для решения поставленной тобой задачи этот примитивный алгоритм не годится: работать он не будет.


Сергей М.   (2006-08-10 10:05:00) [4]


> Slym


Ты меня опередил)

Разумеется, ситуация с отсутствием терминатора в конце буфера очень вероятна.
Автор это должен осознать и принять меры, например, по твоему совету.


Сергей М.   (2006-08-10 10:03:00) [5]


> DelphiN!


Да, и еще ожно важное замечание: алгоритм даст сбой, если в буфере pv, куда из стрима только что прочитано cbRead байт, не окажется на конце терминирующего строку символа.


Slym   (2006-08-10 10:02:00) [6]

Сергей М. ©   (10.08.06 9:48) [3]
s := StrPas(pv);

тоже AV грозит! ты ни где не ограничеваешь строку нулем! при поиске нуля можно выйти за границы выделенной памяти
вот так прокатит:
PByteArray(pv)[cbRead+1]:=0;
s := StrPas(pv);


Slym   (2006-08-10 09:59:00) [7]

В место
SetLength(s,cbRead); //ищет #0 - для определения конца строки и не находит
s := String(pv);

пользуй:
SetString(s,pv,cbRead);//длинна задается и поиск #0 не производится


Сергей М.   (2006-08-10 09:57:00) [8]


> DelphiN! ©   (10.08.06 09:53) [4]


Учти, что это будет работать только при условии

   Length(NewWord) <=  Length(Word)


DelphiN!   (2006-08-10 09:53:00) [9]

> [3] Сергей М. ©   (10.08.06 09:48)


Спасибо!!!


DelphiN!   (2006-08-10 09:48:00) [10]

> [1] Reindeer Moss Eater ©   (10.08.06 09:45)


А где ошибка?

  SetLength(s,cbRead);
  s := String(pv);


Тут?


Сергей М.   (2006-08-10 09:48:00) [11]


> s := String(pv);


s := StrPas(pv);


> pv := @s;


Move(PChar(s)^, pv^, Length(s)+1)


Reindeer Moss Eater   (2006-08-10 09:45:00) [12]

"Тут" - AV
а ошибка не тут


Наверх

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