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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2011, 04:25   #1
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
Печаль Путаница с типами для больших строк

Вот код:

Код:
program question;

uses
  windows,
  classes,
  idhttp,
  dialogs;

{ запрос кода страницы (indy 9) }
function GetUrl (URL : string) : string;
var
  idhttp1 : tidhttp;
begin
  idhttp1 := tidhttp.Create(nil);
  Result := 'test' + idhttp1.Get(URL);
end;

{ разделитель строк }
procedure Explode(var a: array of pchar; Border, S: string);
var
  S2: string;
  i: Integer;
begin
  i := 0;
  S2 := S + Border;
  repeat
    try
      a[i] := PChar( Copy(S2, 0, Pos(Border, S2) - 1) );
    except
    end;
    Delete(S2, 1, Length(a[i] + Border));
    Inc(i);
  until S2 = '';
end;

var
  A : array[0..1] of pchar;
begin

{ не вылетает }
{ Explode(A, 'test', GetUrl ( 'http://www.google.ru' ) ); }

{ вылетает =( }
Explode(A, 'test', GetUrl ( 'http://www.delphisources.ru/forum/' ) );

ShowMessage(A[1]);

end.
Суть в том, что при обработке слишком больших строк (это моя версия причины) вылезает violation read error. Вроде pchar, что я там недоглядел? Я чет встрял :\ Спасибо.
WennY вне форума Ответить с цитированием
Старый 02.09.2011, 05:40   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

PChar() не выделяет память, а просто приводит указатель к типу PChar, так что при выходе из Explode() локальные переменные очистятся, а элементы массива а[] с большой степенью вероятности будут указывать вникуда.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.09.2011, 05:55   #3
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Подскажите пожалуйста, что нужно сделать в моей ситуации?

Последний раз редактировалось WennY; 02.09.2011 в 06:01.
WennY вне форума Ответить с цитированием
Старый 02.09.2011, 06:13   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Из кода не совсем ясно, чего хотим добиться, но если в общем случае нужно разделить большую строку на много маленьких, то есть 2 подхода:

1) заюзать TStringList. В него удобно сохранить результат:

Код:
procedure Explode(L: TStringList; const data: string);
begin
  while (чего-то там) do
    L.Add(Copy(data, ...));
end;
На выходе элементы списка L буду содержать найденные подстроки.


2) можно и массив PChar, только память под них выделять/освобождать руками, через StrNew()/StrDispose(), например. И не забывать, что массив должен динамически рости, "array[0..1]" выглядит удручающе ) Если на сайте несколько раз встретится слово 'test', ваш цикл пойдёт записывать в a[2], a[3] и далее по списку.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 02.09.2011, 06:16   #5
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Цитата:
Из кода не совсем ясно, чего хотим добиться, но если в общем случае нужно разделить большую строку на много маленьких
Нужно разделить на две части. Просто у функции такой метод работы
Цитата:
И не забывать, что массив должен динамически рости
В моем проге он не должен расти, там только 2 части
Цитата:
Если на сайте несколько раз встретится слово 'test'
Не встретится. Спасибо, но я не идиот, это просто тестовый исходник, чтобы было понятна суть моей проблемы.
WennY вне форума Ответить с цитированием
Старый 02.09.2011, 06:27   #6
WennY
Форумчанин
 
Регистрация: 17.01.2008
Сообщений: 236
По умолчанию

Спасибо вам за наводку, сменил реализацию функции explode, заработало =)
Исход рабочей эксплоды:

Код:
function Explode ( S, Border: string ) : MyArray;
 var
   a: array [0..1] of string;
 begin
    SetLength(Result,2);
    a[0] := Copy ( S, 0, pos ( Border, S ) - 1 ) ;
    Delete ( S, 1, pos ( Border, S ) + Length ( Border ) - 1 );
    a[1] := S;
    Result[0]:=a[0];
    Result[1]:=a[1];
 end;

Последний раз редактировалось WennY; 02.09.2011 в 06:29.
WennY вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввести массив вещественных чисел NxM для заданной строки массива найти два самых больших числа (на C#) владислав10 Помощь студентам 1 10.04.2011 14:10
Какое сочетание клавиш для больших символов sasha_prof Microsoft Office Excel 2 11.11.2010 18:46
Ищем человека, имеющего опыт в создании больших проектов для руководства начинающей группой разработчиков skiler07 Фриланс 3 31.05.2010 10:28
Аналог "Сквозных строк" для формирования итоговых строк на печать. kotyambala Microsoft Office Excel 0 05.05.2010 13:40
Путаница в формах в Delphi TaYgA Помощь студентам 2 26.10.2009 19:51