Блокнот Графомана

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Блокнот Графомана

Сообщение Лекс Айрин » 29.03.2016 14:20:43

Что-то я запутался (((
Почему-то не входит в case
Код: Выделить всё
function FirstTag (var Str:String):String;
Var
   Start, Finish:boolean;
   StrTag:String;
Begin
     // ShowMessage ('переписывается((((');
      If Str='' then
      begin
        Result:='';//отсев ошибочного использования
        ShowMessage ('Пустая строка');
      end else
      begin
           Start:=False;  // инициализация переменных.
           Finish:=False;
           Result:='';
           StrTag:='';
           while Finish<>True do   //
           begin
           ShowMessage ('Str='+ Str);
           if Str='' then
             Begin
                  Finish:=True;//выход из цикла по исчерпанию строки
                  ShowMessage ('выход из цикла по исчерпанию строки');
             End else
             Begin
                  StrTag:=Copy(Str,1,1);
                  case  Str of
                    '<':
                      Begin
                      if Start=true then
                        Begin  //это второй символ '<'
                          Finish:=True; // штатный выход если это все же не тег.
                          ShowMessage (' штатный выход если это все же не тег.');
                        end else  //это первый символ '<'.
                        begin   // начинаем копировать предположительно тег в строку
                            Start:=True;
                            Result:=Result+StrTag;
                            Delete(Str, 1, 1);
                        end

                      end;
                    '>':
                      Begin
                           Result:=Result+StrTag;
                           Delete(Str, 1, 1);
                           if Start=true then
                             begin
                               Finish:=True;// штатный выход если тег
                               ShowMessage (' штатный выход если тег.');
                             end else begin end;

                      end;
                  else Begin
                            Result:=Result+StrTag; // обычный символ
                            Delete (Str, 1, 1);
                       End;
                  end;
             end;
           end;
      end;
end;                     


Добавлено спустя 6 часов 2 минуты 13 секунд:
нашел ошибку. Классическая логическая ошибка(((
Код: Выделить всё
StrTag:=Copy(Str,1,1);
                  case  Str of
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.04.2016 12:35:06

обновление версии -- 0.5.4 -- добавлена простейшая работа с тегами.
выложен и архив с актуальной версией.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.06.2016 16:48:55

в общем, итоговый код функции разделения на теги. Проще не могу(((

Код: Выделить всё
function FirstTag (var Str:String):TTag;
var
   i, k, m: integer;
   S: string;
begin
   S := pChar(@Str[1]); // было 2
   i := Pos('>', Str);
   k := Pos('<', Str);
   M := Pos('<', S);
   if i=k then
   begin     //"невозможная ситуация" означает, что тегов нет вообще
     Result.Str:=Str;
   end else begin
   if m=0 then//второго символа "<" нет
   begin
      begin
           result.Str:=Copy(Str, 1, Pred(k));//копируем тег!!!
           Delete (Str,1,k);
      end;
   end else
   begin
       m:=m+1;// теперь требуется положение символа!!!
       if k=1 then
           Begin //ищем второе вхождение k
             if m<i then   //проверяется порядок символов    поменял проверку на обратную
                 begin
                   ShowMessage (Str);
                   result.Str:=Copy(Str, 1, Pred(m));//копируем.
                   ShowMessage (Result.Str);
                   Delete (Str,1,pred(m));
                   ShowMessage (Str);
                  end
             else
                 begin
                        begin
                        ShowMessage (Str);
                        result.Str:=Copy(Str, 1, i);//копируем тег!!!
                        ShowMessage (Result.Str);
                        Delete (Str,1,i);
                        ShowMessage (Str);
                      end;
                 end;
           end
       else
           begin   //удалить строку до k в результат

               result.Str:=Copy(Str, 1, Pred(k));//копируем.
               Delete (Str,1,pred(k));

           end;
       end;
   end;
end;           
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение resident » 09.06.2016 17:15:48

Код: Выделить всё
   k := Pos('<', Str);
   M := Pos('<', S);

Между ними чего не хватает? :)
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.06.2016 18:14:38

resident, не... все верно. в проге все работает отлично.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение resident » 09.06.2016 20:03:53

Лекс Айрин писал(а):в проге все работает отлично

Может я и не прав, но вижу вот что:
В вашем случае вы сначала создаете переменную S, указывающую на Str
Код: Выделить всё
S := pChar(@Str[1]);

А потом зачем-то пробегаете и по Str и по S ища одно и тоже вхождение '<'
Код: Выделить всё
   k := Pos('<', Str);
   M := Pos('<', S);

В таком случае k и M будут всегда одинаковые.
А раз они одинаковые, то не лучше ли записать:
Код: Выделить всё
M := k;


А вот если вы S будете инициализировать между прогонами, используя результаты первого, вот тогда уже будет какой-то смысл:
Код: Выделить всё
   
k := Pos('<', Str);
S := pChar(@Str[k]); ///////////// [k]
M := Pos('<', S);
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.06.2016 21:04:13

resident, косяк в строке
Код: Выделить всё
S := pChar(@Str[1]);

изначально я пытался скрыть первый символ '<' // увы... внимательный тест драйв показал, что я где-то лоханулся... да и Ваш код приводит к вылету программы. Похоже придется инициализировать 'S' по старинке присваиванием без первого символа.

Добавлено спустя 9 минут 30 секунд:
мда... пытаясь исправить ошибку "сломал функцию" (( В общем, поторопился((( видимо, случайно запустил старую версию
Последний раз редактировалось Лекс Айрин 09.06.2016 21:19:41, всего редактировалось 1 раз.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение resident » 09.06.2016 21:15:17

А если так:
Код: Выделить всё
k := Pos('<', Str);
if k > 0 then
// один точно есть
begin
S := pChar(@Str[k]); ///////////// [k]
M := Pos('<', S);
end else
// отстутствуют
begin
S := pChar(@Str[1]); ///////////// == Str
M := k;
end;


Лекс Айрин писал(а):изначально я пытался скрыть первый символ '<'

Как же вы его скрывали, когда еще не выяснили: есть ли он вобще?

Добавлено спустя 9 минут 54 секунды:
Кхе, и тут тоже косяк, нужно же со следующего за k символа начинать второй прогон. А если со следующего то нужна еще дополнительная проверка: а вдруг первый символ - последний в строке?
Код: Выделить всё
k := Pos('<', Str);
if (k > 0) and (k <> Length(Str)) then
// один точно есть и он НЕ последний
begin
S := pChar(@Str[Succ(k)]); ///////////// Succ[k] <<< Со следующего за k
end else
// отстутствуют
begin
S := pChar(@Str[1]); ///////////// == Str
end;
M := Pos('<', S);
Последний раз редактировалось resident 09.06.2016 21:31:02, всего редактировалось 2 раз(а).
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Блокнот Графомана

Сообщение Лекс Айрин » 09.06.2016 21:27:19

resident писал(а):Как же вы его скрывали, когда еще не выяснили: есть ли он вобще?


На самом деле, меня интересовало есть ли этот символ вообще. Переменная используется (в идеале) только если к=1.

resident писал(а):M := k;

скорее, надо K=M (или М+1, в зависимости от способа использования) использовать как проверку наличия второго символа.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение resident » 09.06.2016 21:29:48

Подправил код выше.

Добавлено спустя 3 минуты 54 секунды:
Вернул М обратно в блоки begin-end
Код: Выделить всё
k := Pos('<', Str);
if (k > 0) and (k <> Length(Str)) then
// один точно есть и он НЕ последний
begin
S := pChar(@Str[Succ(k)]); ///////////// Succ[k] <<< Со следующего за k
M := Pos('<', S);
end else
// отстутствуют или последний
begin
S := pChar(@Str[1]); ///////////// == Str
M := k;
end;


Добавлено спустя 5 минут 25 секунд:
Лекс Айрин писал(а):скорее, надо K=M (или М+1, в зависимости от способа использования)

Равны? Я в логику функции не лез. Но, если результаты прогона допускают что они могут быть равны, то они будут равны всегда. И смысла вобще никакого.
Если +1 тогда логично, но тогда и прогонять нужно по разным строкам Str и pChar(@Str[Succ(k)]);

Добавлено спустя 2 минуты 26 секунд:
:mrgreen:
Кхе, а если вы их (k / M) сравниваете, то значит они должны отсчитываться от одной величины?
Тогда присваивание нужно со смещением типа того:
Код: Выделить всё
S := pChar(@Str[Succ(k)]);
M := k + Pos('<', S); /////////////// смещение на k


Добавлено спустя 4 минуты 40 секунд:
Да, и если первое вхождение "<" - это последний символ в строке, то нужно еще блок.
Т.е.
Первый "<"
1) Отсутстсвует
2) Присутствует, но не последний
3) Последний
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Блокнот Графомана

Сообщение Лекс Айрин » 10.06.2016 09:19:46

resident писал(а):Равны? Я в логику функции не лез. Но, если результаты прогона допускают что они могут быть равны, то они будут равны всегда. И смысла вобще никакого.

Логично, что если первый символ '<', то его сокрытие позволит найти второй символ '<', если этого не произошло, тогда m и k будут равны но данная ситуация обрабатывается до проверки m.

resident писал(а):Если +1 тогда логично, но тогда и прогонять нужно по разным строкам Str и pChar(@Str[Succ(k)]);


вот и хотел добиться разных строк... но пока программа виснет.

resident писал(а):Да, и если первое вхождение "<" - это последний символ в строке, то нужно еще блок.
Т.е.
Первый "<"


не нужен, если добьюсь своего. На первом этапе должно в результат кинуть всю строку без последнего символа, а на следующем прогоне не будут найдены символ '>' и второе вхождение '<'. То есть ситуация вполне нормально обрабатывается.


В общем, буду курить дальше...
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 14.06.2016 18:46:49

Отказался (по крайней мере пока) от "улучшенного варианта". В первоначальном избавился от Copy присваиванием типа StrTag:=Str[1];

Интересно, а можно ли примерно так же избавиться от delete? Или не имеет смысла?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Cheb » 15.06.2016 09:11:59

Вообще, первый отрезать нужно из-за того, что Pos в паскале кривая (нет третьего параметра, откуда начинать). Но ты делаешь неэффективно, она ищет строку в строке, а те надо найти символ. Плюнь на ея, ищи сам в цикле по Str[i] = '<'. Причём, компилятор умный, при использовании Pos у тебя '<' - это строка, со всеми оверхедами, а при сравнении с элементом строки, '<' это Char, который всё равно, что Byte, только Char.

P.S. И пофиг если utf-8, базовые символы вроде ентого в ней остаются однобайтными.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Блокнот Графомана

Сообщение Лекс Айрин » 15.06.2016 09:24:14

Cheb, согласен, что Pos кривая.
Cheb писал(а):Плюнь на ея, ищи сам в цикле по Str[i] = '<'.


От Pos я уже отказался. сейчас речь идет о подправленной реализации из вот этого сообщения viewtopic.php?p=98038#p98038 вот только delete (str,1,1) смущает... хотя... кажется, я понял твою мысль.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Блокнот Графомана

Сообщение Лекс Айрин » 28.06.2016 21:01:38

Пришел к мнению, что для полноценной работы стоит изменить внутреннее представление текста на список слов. Например, для прикручивания в будущем проверки синонимов. Интересно... это реально стоящая идея или мой бзик?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru