Ĺadny brzuch
Mam napisaną prostą funkcję, która ma za zadanie usuwać tekst między słowami Written i 2004. Wygląda tak:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end; procedure TForm1.Button3Click(Sender: TObject); var i: integer; x: string; begin Memo1.Lines.Clear; for i:= 0 to RichEdit1.Lines.Count -1 do begin x:= usuwanie(RichEdit1.Lines[i]); if x <> '' then Memo1.Lines.Add(x); end;
Zadanie wykonuje poprawnie, ale pod koniec program się zwiesza. Gdzie popełniłem błąd?
Napisz te petle jeszcze raz, a po drugie troszke dokladniej dawaj opis.
Kiedy umiescilem 'tekst między słowami Written i 2004' (bylo to 'WrittenEdit12004') otrzymalem '004', a kiedy zrobilem odwrotnie ('2004Edit1Written') to sie program zwiesil (tak jak mowiles), czyt. wykonywal petle do usra... smierci.
Przeanalizuj jeszcze raz kod, sprawdz 2x jakie wyniki daje Pos i PosEx (poza programem zebys dobrze wiedzial jak one dzialaja) i najlepiej zrob sobie rozpiske na kartce papieru. Polecam.
Mam napisaną prostą funkcję, która ma za zadanie usuwać tekst między słowami Written i 2004. Wygląda tak:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end; procedure TForm1.Button3Click(Sender: TObject); var i: integer; x: string; begin Memo1.Lines.Clear; for i:= 0 to RichEdit1.Lines.Count -1 do begin x:= usuwanie(RichEdit1.Lines[i]); if x <> '' then Memo1.Lines.Add(x); end;
Zadanie wykonuje poprawnie, ale pod koniec program się zwiesza. Gdzie popełniłem błąd?
Moim zdaniem zien to: while Pos('Written', x) <> 0 do
na: while Pos('Written', x) > 0 do
Moim zdaniem zien to: while Pos('Written', x) <> 0 do
na: while Pos('Written', x) > 0 do
a jakie to ma znaczenie? funkcja pos nigdy nie zwraca liczb ujemnych
Mam napisaną prostą funkcję, która ma za zadanie usuwać tekst między słowami Written i 2004. Wygląda tak: no chyba nie do końca ją napisałeś :-)
Kiedy umiescilem 'tekst między słowami Written i 2004' (bylo to 'WrittenEdit12004') otrzymalem '004'
Twój kod:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); // * stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end;
Opis POS:
[POS] - Funkcja zwraca wartość indeksu, pierwszego znaku określonego w parametrze SubStr. Szukanie odbywa się w łańcuchu S.
Więc zapis przy * w tej funkcji jest błędny. Zamiast tego, proponuję np.:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x)+7; stop:= Pos('2004', x); Delete(x, start, stop - start); Result:= x; exit; end; end;
ewentualnie:
function GetText(body, SStart, SStop : String) : String; var Length1: integer; s: string; begin Length1:=Length(SStart); s:=copy(body,Pos(SStart,body), Pos(SStop,body)-Pos(SStart,body)); //kopiuj z 'body' tekst między znakami Delete(s,1,Length1); body:=StringReplace(body,s,'',[rfReplaceAll]); Result:=body; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text:=GetText(Memo1.Text,'Written','2004'); end;
a jakie to ma znaczenie? funkcja pos nigdy nie zwraca liczb ujemnych
Ano ma bo byte też nie zawiera.
A co ma byte do tego? Pos zwraca pozycję początku poszukiwanego tekstu jako Integer.
A co ma byte do tego? Pos zwraca pozycję początku poszukiwanego tekstu jako Integer.
Naturalnie masz racje ups, źle spojrzalem na to, wydawało mi się, że funkcja pos przypisuje swoją wartość do zmiennej byte. Autor postu zadeklarowal dwie zmienne byte i to mnie zmyliło. Sorry
no chyba nie do końca ją napisałeś :-)
Twój sposób tez nie do końca działa, przynajmniej u mnie ;).
http://cimlik.pl/temp/zrodelko.zip - może teraz będzie Wam łatwiej zaradzić.
Ile wynosi wartość zmiennej start w funkcji:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; exit; end;
??
;)
Użytkownik Uno edytował ten post 16 wrzesień 2007, 20:40
Ile wynosi wartość zmiennej start w funkcji:
??
;)
W poprzednich postach znalazłem informację, że jest ona niepotrzebna ;).
@down: fakt, mój błąd, ale to niewiele zmienia. Nadal nie działa tzn. występuje ten sam błąd - po wykonaniu pętli program się zawiesza. Sposób bl4ckh4t nie krzaczy programu, ale też nie daje efektu.
Użytkownik cimlik edytował ten post 17 wrzesień 2007, 05:45
W poprzednich postach znalazłem informację, że jest ona niepotrzebna ;).
Czytanie ze zrozumieniem zarówno postów jak i kodu się kłania.
@down: fakt, mój błąd, ale to niewiele zmienia. Czyli że co? Nadal nie działa? Jeżeli tak to napisz co oznacza iż nie działa...
Użytkownik Ali240 edytował ten post 16 wrzesień 2007, 22:08
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end; procedure TForm1.Button3Click(Sender: TObject); var i: integer; x: string; begin Memo1.Lines.Clear; for i:= 0 to RichEdit1.Lines.Count -1 do begin x:= usuwanie(RichEdit1.Lines[i]); if x <> '' then Memo1.Lines.Add(x); end;
Zadanie wykonuje poprawnie, ale pod koniec program się zwiesza. Gdzie popełniłem błąd?
Napisz te petle jeszcze raz, a po drugie troszke dokladniej dawaj opis.
Kiedy umiescilem 'tekst między słowami Written i 2004' (bylo to 'WrittenEdit12004') otrzymalem '004', a kiedy zrobilem odwrotnie ('2004Edit1Written') to sie program zwiesil (tak jak mowiles), czyt. wykonywal petle do usra... smierci.
Przeanalizuj jeszcze raz kod, sprawdz 2x jakie wyniki daje Pos i PosEx (poza programem zebys dobrze wiedzial jak one dzialaja) i najlepiej zrob sobie rozpiske na kartce papieru. Polecam.
Mam napisaną prostą funkcję, która ma za zadanie usuwać tekst między słowami Written i 2004. Wygląda tak:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end; procedure TForm1.Button3Click(Sender: TObject); var i: integer; x: string; begin Memo1.Lines.Clear; for i:= 0 to RichEdit1.Lines.Count -1 do begin x:= usuwanie(RichEdit1.Lines[i]); if x <> '' then Memo1.Lines.Add(x); end;
Zadanie wykonuje poprawnie, ale pod koniec program się zwiesza. Gdzie popełniłem błąd?
Moim zdaniem zien to: while Pos('Written', x) <> 0 do
na: while Pos('Written', x) > 0 do
Moim zdaniem zien to: while Pos('Written', x) <> 0 do
na: while Pos('Written', x) > 0 do
a jakie to ma znaczenie? funkcja pos nigdy nie zwraca liczb ujemnych
Mam napisaną prostą funkcję, która ma za zadanie usuwać tekst między słowami Written i 2004. Wygląda tak: no chyba nie do końca ją napisałeś :-)
Kiedy umiescilem 'tekst między słowami Written i 2004' (bylo to 'WrittenEdit12004') otrzymalem '004'
Twój kod:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x); // * stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; end;
Opis POS:
[POS] - Funkcja zwraca wartość indeksu, pierwszego znaku określonego w parametrze SubStr. Szukanie odbywa się w łańcuchu S.
Więc zapis przy * w tej funkcji jest błędny. Zamiast tego, proponuję np.:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin start:= Pos('Written', x)+7; stop:= Pos('2004', x); Delete(x, start, stop - start); Result:= x; exit; end; end;
ewentualnie:
function GetText(body, SStart, SStop : String) : String; var Length1: integer; s: string; begin Length1:=Length(SStart); s:=copy(body,Pos(SStart,body), Pos(SStop,body)-Pos(SStart,body)); //kopiuj z 'body' tekst między znakami Delete(s,1,Length1); body:=StringReplace(body,s,'',[rfReplaceAll]); Result:=body; end; procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text:=GetText(Memo1.Text,'Written','2004'); end;
a jakie to ma znaczenie? funkcja pos nigdy nie zwraca liczb ujemnych
Ano ma bo byte też nie zawiera.
A co ma byte do tego? Pos zwraca pozycję początku poszukiwanego tekstu jako Integer.
A co ma byte do tego? Pos zwraca pozycję początku poszukiwanego tekstu jako Integer.
Naturalnie masz racje ups, źle spojrzalem na to, wydawało mi się, że funkcja pos przypisuje swoją wartość do zmiennej byte. Autor postu zadeklarowal dwie zmienne byte i to mnie zmyliło. Sorry
no chyba nie do końca ją napisałeś :-)
Twój sposób tez nie do końca działa, przynajmniej u mnie ;).
http://cimlik.pl/temp/zrodelko.zip - może teraz będzie Wam łatwiej zaradzić.
Ile wynosi wartość zmiennej start w funkcji:
function usuwanie(x: string): string; var start, stop: byte; begin while Pos('Written', x) <> 0 do begin stop:= Pos('2004', x); Delete(x, start, stop - start +1); end; Result:= x; exit; end;
??
;)
Użytkownik Uno edytował ten post 16 wrzesień 2007, 20:40
Ile wynosi wartość zmiennej start w funkcji:
??
;)
W poprzednich postach znalazłem informację, że jest ona niepotrzebna ;).
@down: fakt, mój błąd, ale to niewiele zmienia. Nadal nie działa tzn. występuje ten sam błąd - po wykonaniu pętli program się zawiesza. Sposób bl4ckh4t nie krzaczy programu, ale też nie daje efektu.
Użytkownik cimlik edytował ten post 17 wrzesień 2007, 05:45
W poprzednich postach znalazłem informację, że jest ona niepotrzebna ;).
Czytanie ze zrozumieniem zarówno postów jak i kodu się kłania.
@down: fakt, mój błąd, ale to niewiele zmienia. Czyli że co? Nadal nie działa? Jeżeli tak to napisz co oznacza iż nie działa...
Użytkownik Ali240 edytował ten post 16 wrzesień 2007, 22:08