Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Вниз

Проблема с программой...   Найти похожие ветки 

 
KaLLeKa   (2006-07-06 00:10) [0]

Я сделал программу которая заменяет необходимые символы в тексте на другие... Но, возникла определенная трудность. Дело в том, что программа стала прерывать процедуру непонятно из за чего и оставлять часть текста необработанным. Программа спокойно обрабатывала 60.000 строк текста, где то секунд за 5-6,  а тут, я подсунул ей 212.000 строк, и она стала прерывать процедуру на 15.432 строке, непонятно из за чего... Дал ей совсем другой текст - 90.000 строк, она так же вылетает на 15.000 строке... Привожу код функции обработки, поясните пожалуйста почему так происходит и как от этого избавиться...


procedure Tform1.CodeR(FP:Pchar);
var
i, u, k: word;
C: Char;
s : String;
begin
if RichEdit1.Text = "" then exit;

Slist.Clear;
Slist.Text := RichEdit1.Text;
Application.ProcessMessages();

WorkProcces.Visible := true;
WorkProcces.Progress := 0;
WorkProcces.MaxValue := SList.Count-1;

StatusBar1.Panels[0].Text := " Подмена...";
Application.ProcessMessages;

s := "";
for i := 0 to Slist.Count-1 do
  begin
    WorkProcces.Progress := i;
    StatusBar1.Panels[2].text := " Cтрок : "+inttostr(Slist.Count-1);
    StatusBar1.Panels[3].text := " Пройдено : "+ inttostr(i);
    Application.ProcessMessages();

    s := Slist.Strings[i];
    if not (copy(s, 1, length("<br></font><font size=2 face="Tahoma" color=#E00000>")) = pchar("<br></font><font size=2 face="Tahoma" color=#E00000>")) then
    if not (copy(s, 1, length("<br>
")) = pchar("<br>")) then
    if not (copy(s, 1, length("
<br></font><font size=2 face="Tahoma" color=#0000E0>")) = pchar("<br></font><font size=2 face="Tahoma" color=#0000E0>")) then
    if not (copy(s, 1, length("
")) = pchar("
")) then
    if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#E00000>")) = pchar("<font size=2 face="Tahoma" color=#E00000>")) then
    if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#0000E0>")) = pchar("<font size=2 face="Tahoma" color=#0000E0>")) then
    if not (copy(s, 1, length("<html><head></head><body bgcolor=#FFFFFF>")) = pchar("<html><head></head><body bgcolor=#FFFFFF>")) then
    if not (copy(s, 1, length("</body></html>")) = pchar("</body></html>")) then
  begin
  for u := 1 to Length(s) do
    if pos(char(s[u]), CharX)<>0 then
     begin
      if not ((s[u] = "b") or (s[u] = "r")) then
        begin
         k := pos(char(s[u]), CharX);
         C := CodeX[k];
         s[u] := c;
        end;
     end;
   Slist.Strings[i] := s;
 end;

end;
WorkProcces.Progress := 0;
StatusBar1.Panels[0].Text := " Завершено";
Application.ProcessMessages();

Slist.SaveToFile(FP);
end;


 
KilkennyCat ©   (2006-07-06 03:39) [1]

> var
> i, u, k: word;


 
KaLLeKa   (2006-07-06 11:52) [2]

> var
> i, u, k: word;

Var
i, u, k, : Integer;             или    longint

дают тот же эффект что и word.   Я Пробовал.
Ну что, разве никто не может помочь? Как же так....? :((


 
KaLLeKa   (2006-07-06 11:56) [3]

то же самое, только я опустил html тэги чтобы ТУТ ничего небыло подчеркнтым и жирным.


procedure Tform1.CodeR(FP:Pchar);
var
i, u, k: word;
C: Char;
s : String;
begin
if RichEdit1.Text = "" then exit;

Slist.Clear;
Slist.Text := RichEdit1.Text;
Application.ProcessMessages();

WorkProcces.Visible := true;
WorkProcces.Progress := 0;
WorkProcces.MaxValue := SList.Count-1;

StatusBar1.Panels[0].Text := " Подмена...";
Application.ProcessMessages;

s := "";
for i := 0 to Slist.Count-1 do
  begin
    WorkProcces.Progress := i;
    StatusBar1.Panels[2].text := " Cтрок : "+inttostr(Slist.Count-1);
    StatusBar1.Panels[3].text := " Пройдено : "+ inttostr(i);
    Application.ProcessMessages();

    s := Slist.Strings[i];

  begin
  for u := 1 to Length(s) do
    if pos(char(s[u]), CharX)<>0 then
     begin
      if not ((s[u] = "b") or (s[u] = "r")) then
        begin
         k := pos(char(s[u]), CharX);
         C := CodeX[k];
         s[u] := c;
        end;
     end;
   Slist.Strings[i] := s;
 end;

end;
WorkProcces.Progress := 0;
StatusBar1.Panels[0].Text := " Завершено";
Application.ProcessMessages();

Slist.SaveToFile(FP);
end;


 
StriderMan ©   (2006-07-06 12:06) [4]

а что показывает отладка? поставь брэйкпоинт с условием i = 15000


 
KaLLeKa   (2006-07-06 13:04) [5]

хм.. у меня это оказывается происходит из за длины строки...

Тогда другой вопрос...
Как сделать так, чтобы программа обрезала строки по допустимой длине, перенося оставшуюся часть на следующую строку? Обрезать то надо по пробелам между словами а не по длине просто....


 
KaLLeKa   (2006-07-06 13:06) [6]

ЗЫ.  Сейчас прога спокойно за 30 сек, пробежала и приспокойно заменила символы в 1.740.000 строках. На пробу ставил специально...  Все  строки были нормальной длины - 255 символов.
А вот когда строка длинная... Например такая, как пишут роботы html сраницы - весь код страницы одной строкой, тогда процедура подмены слетает...


 
Desdechado ©   (2006-07-06 13:17) [7]

Еще раз говорю.
Var i, u, k, : Integer;
У тебя же используется индексация символов в строках этими переменными. Так что же ты хочешь? Строки могут быть до 2Гб, а word - это только 65тыщ с копейками

И, хоть убей, не понимаю, зачем в цикле делать вот это:
if not (copy(s, 1, length("")) = pchar("")) then
   if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#E00000>")) = pchar("<font size=2 face="Tahoma" color=#E00000>")) then

1. на кой постоянно переводить в PChar?
2. гораздо эффективнее было бы описать константы, их длины и сравнивать с ними, а не каждый раз вычислять длину в каждой проверке условия


 
KaLLeKa   (2006-07-06 13:43) [8]

Desdechado ©   (06.07.06 13:17) [7]
Про Integer понял, сознаюсь, тупил) не знаю зачем вордом сделал...

>И, хоть убей, не понимаю, зачем в цикле делать вот это:
Да это я так)) вам для наглядности)) а то попросили бы еще константы выложить, а их у меня там такой спсок что ой ой ой)))
А в пчар перевожу потому что в функцию библиотеки посылаю данные иногда, а стрингом посылать неудобно...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.015 c
15-1151575109
Новичоккк
2006-06-29 13:58
2006.07.30
Перехватить SEND в конкретном приложении и заXORить пакет


15-1151559934
vajo
2006-06-29 09:45
2006.07.30
Почему-то вырубается компьютер


3-1148722578
alex1980
2006-05-27 13:36
2006.07.30
производительность SqlServ2000


15-1151390965
Иксик
2006-06-27 10:49
2006.07.30
Идиотский вопрос


4-1144861111
anton773
2006-04-12 20:58
2006.07.30
Получить значение напряжения питания





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский