Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.09.2011, 04:41   #1
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию Как правильно заменить строку

Есть такой код:
Код:
  var
    RetLen: Integer;
    P: PChar;
  ...
  Result := TMemoryStream.Create;
  P := GetMemory(256);
  RetLen := FSocket.ReceiveBuf(P^, 256);

  while RetLen > 0 do
   begin
    P := PChar ( StringReplace(P, 'gzip,deflate', ' ', [rfIgnoreCase] ) );
    P := PChar ( StringReplace(P, '1.1', '1.0', [rfIgnoreCase] ) );
    Result.Write(P^, RetLen);
    RetLen := FSocket.ReceiveBuf(P^, 256);
   end;
  P := '';
  FreeMemory(P);
  Result.Position := 0;
Стоит задача подменить пару строк в переменной P. Лезу внаглую стринг реплейсом, естественно стоит мат на весь компилятор, acces violation'ы вылетают на строке FreeMemory(P) и на самих реплейсах. Подскажите пожалуйста, как корректно реплейснуть строку в моем случае Спасибо
WennY вне форума Ответить с цитированием
Старый 05.09.2011, 05:55   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Потому как непонятно что такое FSocket, а так же чего в коде делает цикл, то проверка была проведена в таком виде (D7 & D2010):
Код:
  P := GetMemory(256);
//  RetLen := FSocket.ReceiveBuf(P^, 256);
  P := '1.1';
//  while RetLen > 0 do begin
    P := PChar ( StringReplace(P, 'gzip,deflate', ' ', [rfIgnoreCase] ) );
    P := PChar ( StringReplace(P, '1.1', '1.0', [rfIgnoreCase] ) );
//    Result.Write(P^, RetLen);
//    RetLen := FSocket.ReceiveBuf(P^, 256);
//   end;
  P := '';
  FreeMemory(P);
Ошибок не было. Замена состоялась.
Прик вне форума Ответить с цитированием
Старый 05.09.2011, 06:26   #3
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

FSocket: TCustomWinSocket;
Замнена то нормально проходит, но в процессе начинаются вылеты...
Вот полный кусок:

Код:
function THTTPProxyTransport.Receive(WaitForInput: Boolean;
  Context: Integer): TMemoryStream;
var
 RetLen: Integer;
 P: PChar;
 FDSet: TFDSet;
 TimeVal: PTimeVal;
 RetVal: Integer;
begin
  Result := nil;
  TimeVal := nil;
  FD_ZERO(FDSet);
  FD_SET(FSocket.SocketHandle, FDSet);
  if not WaitForInput then
  begin
    New(TimeVal);
    TimeVal.tv_sec := 0;
    TimeVal.tv_usec := 1;
  end;
  RetVal := select(0, @FDSet, nil, nil, TimeVal);
  if Assigned(TimeVal) then
    FreeMem(TimeVal);
  if RetVal = SOCKET_ERROR then
    raise Exception.Create(SysErrorMessage(WSAGetLastError));
  if (RetVal = 0) then Exit;

  Result := TMemoryStream.Create;

  {
  P := GetMemory(99999999);

  RetLen := FSocket.ReceiveBuf(P^, 200000);

  P := PChar(StringReplace(P, 'Accept-Encoding: gzip,deflate', 'Accept-Encoding: ', [rfIgnoreCase]));
  P := PChar(StringReplace(P, '1.1', '1.0', [rfIgnoreCase]));
  }

  {
  Result.Write(P^, StrLen(P));
  FSocket.ReceiveBuf(P^, StrLen(P));
  }

  P := GetMemory(256);
  RetLen := FSocket.ReceiveBuf(P^, 256);

  while RetLen > 0 do
   begin
    P := StringReplace(P^, 'gzip,deflate', ' ', [rfIgnoreCase] ) ;
    P := PChar ( StringReplace(P^, '1.1', '1.0', [rfIgnoreCase] ) );
    Result.Write(P^, RetLen);
    RetLen := FSocket.ReceiveBuf(P^, 256);
   end;
  P := '';

  Result.Position := 0;
end;
WennY вне форума Ответить с цитированием
Старый 05.09.2011, 06:47   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Обрабатывай ошибку через try...except или try...finally. В среде разработки будет ошибка при замене появляться. При запуске exe из папки - нет.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 05.09.2011, 07:00   #5
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Да, ошибки нет.. Прога просто вылетает Я явно чет не так делаю, там переполнение буфера, но как правильно влезть, убрать нужные строки и выйти - не знаю.. Надеюсь, что все же получу ответ..
WennY вне форума Ответить с цитированием
Старый 05.09.2011, 09:16   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
P := GetMemory(256);
получили память (буфер)
Код:
 P :=Pchar( StringReplace(P^, 'gzip,deflate', ' ', [rfIgnoreCase] ) );
получили ДРУГУЮ память
или что тоже самое по работе памяти, но нагляднее для примера
Код:
P := PChar('какая то строка');
ЧТО мы будем освобождать здесь
Код:
FreeMemory(P);
освобождаем то, что не выделяли
вот и AV и все что угодно

Код:
var
  rs: string;

rs:=StringReplace(P,...);
rs:=stringreplace(rs, ...);

wrire(Pchar(rs),...);
Код:
var
  P, P000: Pchar;

P000:=GetMEmory;// цель сохранить начальный указатель на память в целости и сохранности
P:=P000;
....
// здесь работаем с P
....
FreeMEmory(P000); //освобождем изначально выделенный буфер
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.09.2011 в 09:22.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить cmp? VintProg Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 14.08.2011 16:40
как правильно записать строку? Vladimir-belikov Помощь студентам 4 10.06.2011 08:40
Заменить строку матрицы Asell Помощь студентам 1 26.04.2011 16:09
Как при нажатии на строку в Listbox передавать нажатую строку в переменную Михаил Юрьевич Общие вопросы Delphi 5 16.03.2009 12:59
Как заменить курсор на форме RAVAL)) Общие вопросы Delphi 11 31.01.2009 01:49