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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2010, 00:49   #1
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию Ошибка если более 20000 сторок

Не могу понять почему выскакивает ошибка. Программа записывает между вот такими скобками [Таб1] Здесь вставляется текст [/Таб1] текст. Но если в файл имеет более 20000 строк то происходит ошибка. Ошибка именно тогда когда я открываю файл и пытаясь произвести запись. Объясните в чем ошибка.
Вложения
Тип файла: zip Error.zip (846.9 Кб, 17 просмотров)
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 22.01.2010, 10:15   #2
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Ошибка, понятное дело, когда процедура (del) вызывается рекурсивно 22000 раз. Получаем переполнение стека. Вполне предсказуемая реакция программы.
Скандербег вне форума Ответить с цитированием
Старый 22.01.2010, 11:41   #3
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

Тогда не пойму почему когда я беру эти 22000 строк не из файла (а записываю их в sText:TStringList; в программе) то все работает нормально (даже более 200000). Помогите как можно устранить ошибку
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 22.01.2010, 12:00   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я не знаю что там за прикол, но могу с уверенностью сказать что твоя стратегия никуда не годится.
У тебя jj не увеличивается, по какой-то причине, если я просто нажму открыть и записать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2010, 12:16   #5
Скандербег
Форумчанин
 
Регистрация: 04.04.2009
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Volt Посмотреть сообщение
Тогда не пойму почему когда я беру эти 22000 строк не из файла (а записываю их в sText:TStringList; в программе)
А откуда, позвольте осведомиться, "а записываю их..."? Не из файла ли? Или они в sText попадают каким-то чудесным образом? Уж не привиделась ли такая строка в тексте: sText.LoadFromFile(OpenDialog1.File Name);, которая и "берет эти 22000 строк" именно из файла.

Цитата:
Сообщение от Volt Посмотреть сообщение
... то все работает нормально (даже более 200000).
А что "все"?
В программе ничего нет, кроме попытки удалить все строки из списка sText, к тому же в рекурсивной процедуре. Как будь то нельзя строки удалять простым методом Delete.
Опять же, непонятно, зачем загружать текст в список, чтобы потом все строки удалить.
Из текста исходника вообще не понятна цель программы.
Два, совершенно бессмысленных оператора:
Код:
  sText2.Text:=memo1.Text;
  writes('Таб1', sText2)
Вернее, бессмысленны действия, которые они выполняют.
Не мешало бы рассказать чего требуется от программы.
Скандербег вне форума Ответить с цитированием
Старый 22.01.2010, 12:41   #6
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

Это проблемный фрагмент моей программы. А выполняет он вот что: ищит скобки [Таб1][/Таб1] таких скобок может быть n количество. т.е [Таб1][/Таб1][Таб2][/Таб2]..[ТабN][/ТабN]. Если скобка найдена то процедура writes удаляет все что между ними и записывает новый текст. Если нужной скобки нет то процедура записывает в конец скобки и текст.
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 22.01.2010, 13:27   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Думаю тебе нужно что-то вроде такого:
Код:
procedure writes(Index:string; var PasteText:TStringList);
var  k,i:integer;e,s,aga:string;
begin
 aga:='[/'+index+']';
 s:=PasteText.Text;
 i:=pos('['+index+']',s);
 if i>=0 then begin
 k:=i+length('['+index+']');
  while i<(length(s)-length(index)) do begin
   if copy(s,i,length(index))=aga then begin
    break;
   end;
   inc(i);
  end;
  delete(s,k,i-k-length(aga));
  e:=Form1.Memo1.Text;
  Insert(e,s,k);
 end;
 PasteText.Text:=s;
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.01.2010, 14:38   #8
Volt
Форумчанин
 
Аватар для Volt
 
Регистрация: 07.12.2008
Сообщений: 244
По умолчанию

Stilet спасибо я что то совсем забыл про while.
|̲̅̅●̲̅̅|̲̅̅=̲̅̅|̲̅̅●̲̅̅]
Volt вне форума Ответить с цитированием
Старый 22.01.2010, 14:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну я так с потолка взял. главное что смысл ты понял )
Хотя этот код конечно не оптимальный...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как комментить много сторок ytzm2hsD3X0HVxwl Microsoft Office Excel 3 01.01.2010 03:40
Какое программирование в наше время более востребовано и более рентабельно? iukash Свободное общение 18 29.10.2009 13:02
file of string[размер больше 20000] Kn793 Общие вопросы Delphi 2 01.01.2009 16:12
Подскажите есть ошибка ? (если да то где) eyeofthedemon Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 19.09.2008 10:41