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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2011, 16:40   #1
INSectoID
 
Регистрация: 21.07.2010
Сообщений: 8
По умолчанию

Есть функция parsetext:
Код:
function parsetext(s:string):string;
var
buf,x:string;
j:integer;
begin
randomize;
for j:=0 to countletters(s,'[') do begin
buf:=Copy(s,Pos('[',s),Pos(']',s)-Pos('[',s));
buf:=stringreplace(buf,'[','',[rfreplaceAll,rfIgnoreCase]);
buf:=stringreplace(buf,']','',[rfreplaceAll,rfIgnoreCase]);
x:=GetWordNum(buf,'|',random(CountWords(buf,'|'))+1);
s:=stringreplace(s,Copy(s,Pos('[',s),Pos(']',s)),x,[rfIgnoreCase]);
end;
result:=s;
end;
Функция должна заменять в тексте конструкции типа [вася|петя|маша] на случайно выбранное из такой конструкции слово. Но корректно работает она только один раз. На втором, третьем и т.д. срабатываниях в переменную buf копируется одна буква или вообще ничего, при этом иногда удаляются участки текста. GetWordNum, CountWords и Countletters возвращают слово по номеру, кол-во слов и кол-во определенных букв соответственно (они точно рабочие, проверены в других программах). Что же неправильно в функции?

Неужели никто не знает? Наверняка ведь ошибка банальна.

Последний раз редактировалось artemavd; 10.07.2011 в 10:18.
INSectoID вне форума Ответить с цитированием
Старый 10.07.2011, 08:50   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

http://www.gunsmoker.ru/2011/01/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 10.07.2011, 21:32   #3
)Игнат(
Форумчанин
 
Регистрация: 06.01.2008
Сообщений: 180
По умолчанию

1)Ставьте брейкпоинты
2)выводите каждый отпарсенный массив [||] в эдит, и смотрите правильность
3)Наверняка в парсинге ошибка, и она имеет какую-то закономерность.
Проверьте правильность поисковых ключей.
)Игнат( вне форума Ответить с цитированием
Старый 11.07.2011, 10:51   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

иногда проще написать своё, чем разобраться в чужом

вот полный, самодостаточный (т.е. не использующий каких-то дополнительных процедур и функций),
РАБОЧИЙ код:
Код:
implementation

{$R *.DFM}

function GetWordNum(const s: string; const DelimChar: char; iNum: integer): string;
var
  sIn: string;
  i: integer;
begin
  i := iNum - 1;
  if i < 0 then GetWordNum := '::' // признак ошибки
  else begin
    sIn := s;
    while (i > 0) and (Pos(DelimChar, sIn) > 0) do begin
      Delete(sIn, 1, Pos(DelimChar, sIn));
      Dec(i);
    end;

    i := Pos(DelimChar, sIn);
    if i > 0 then Delete(sIn, i, Length(sIn) - i + 1);

    GetWordNum := sIn;
  end;
end;

function StrCharCount(const S: AnsiString; C: AnsiChar): Integer;
var
  I: Integer;
begin
  Result := 0;
  for I := 1 to Length(S) do
    if S[I] = C then
      Inc(Result);
end;


function parsetext(s: Ansistring): AnsiString;
var
  buf, x: AnsiString;
  p1, p2 : integer;
  j: integer;
begin
  p1 := Pos('[', s);
  p2 := Pos(']', s);
  while (p1>0) and (p2>p1) do begin
    buf := Copy(s, p1+1, p2-p1-1);
    x := GetWordNum(buf, '|', random(StrCharCount(buf, '|')+1) + 1);
    Delete(s, p1, p2-p1+1);
    Insert(x, s, p1);
    p1 := Pos('[', s);
    p2 := Pos(']', s);
  end;
  result := s;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Text := parsetext(Memo1.Lines.Text);
end;


p.s. обратите внимание, что я вынес Randomize из функции. Иницилизацию счётчика случайных чисел нужно выполнять ОДИН раз для приложения.
Вызывать его постоянно - это, конечно, не ошибка. Но может привести к совершенно неожиданным результатам...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2011, 10:33   #5
INSectoID
 
Регистрация: 21.07.2010
Сообщений: 8
По умолчанию

GunSmoker, спасибо за ссылку, хотя моя функция небольшая и не показалась мне непонятной.
)Игнат(, я делал это. потому и обратился на форум, что не нашел ошибку.
Serge_Bliznykov, благодарю, смогу проверить код послезавтра.
INSectoID вне форума Ответить с цитированием
Старый 14.07.2011, 20:55   #6
INSectoID
 
Регистрация: 21.07.2010
Сообщений: 8
По умолчанию

Serge_Bliznykov, спасибо большое, все работает. Сравнение вашего и моего кода помогло найти ошибку.
INSectoID вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Криво отображается в ie SPKe HTML и CSS 1 11.09.2010 08:20
программа работает криво Юрий_91 Общие вопросы C/C++ 1 25.04.2010 08:40
почему DrawText криво работает? STill_ace Общие вопросы C/C++ 11 24.08.2009 15:57
принтер криво печатает текст SKS Компьютерное железо 2 23.04.2009 16:54
Криво работает polygon ROD Общие вопросы C/C++ 5 06.02.2009 20:54