Toon posts:

[Delphi]Loop maken die eindigd...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi, ik ben een irc application aan het maken en die moet uit een string die hij van de server krijgt bepaalde karakters zoeken en als ie die vindt moet ie wat doen.
Zlef heb ik deze code bedacht: (maar die werkt niet, komt geen einde aan)
code:
1
2
3
4
5
6
while x<20 do;
x:=x+1    
    if (copy(sData, length(sData)-22+x,2)=':(') then
    begin
    ClientSocket1.Socket.SendText('PRIVMSG #channel BLIJ' + #13+#10);
    end;

Maar dit werkt dus niet, hij telt geen x bij de x op. Heeft iemand een idee of deze code helemaal fout is of dat ik gewoon een (kleine) fout maak??

edit:

topic titel is een beetje fout (eindigt met een d :) )
Kan ik niet veranderen?

  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
code:
1
2
3
4
5
6
while x<20 do;
x:=x+1    
if (copy(sData, length(sData)-22+x,2)=':(') then
  begin
    ClientSocket1.Socket.SendText('PRIVMSG #channel BLIJ' + #13+#10);
  end;

Als dit een letterlijke copy/paste is, dan komt het door ide puntkomma achter de conditie... Je blijft testen, alleen door die puntkomma gaat hij opnieuw testen, zonder dus iets met X gedaan te hebben... Ik denk dat je het volgende bedoeld:
code:
1
2
3
4
5
6
7
8
while X < 20 do
  begin
    inc(x);
    if (copy(sData, length(sData)-22+x, 2)=':(') then
    begin
      ClientSocket1.Socket.SendText('PRIVMSG #channel BLIJ' + #13+#10);
    end;
  end;

[edit]
Nu ik er aan denk, misschien is het volgende wel NOG mooier :) Daarbij ga ik er wel van uit dat X onder de 20 begint, ik weet niet helemaal zeker of een for nu test VOOR, of NA de executie van statement
code:
1
2
3
4
5
6
7
for X := X to 20 do
  begin
    if (copy(sData, length(sData)-22+x, 2)=':(') then
    begin
      ClientSocket1.Socket.SendText('PRIVMSG #channel BLIJ' + #13+#10);
    end;
  end;

Beide begin en end statements kunnen eigenlijk wel weg, maar dit is wel zo overzichtelijk...

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
Het probleem is nu juist dat hij in de string gaat zoeken...
Dat wil ik met een loop doen en met een x die steeds groter wordt zodat hij steeds een ander stuk van de string eruit neemt en dat gaat onderzoeken of de eerste 2 karakters darvan gelijk zijn aan ":("

de x moet dus groter worden, en als de x<20 is dan moet ie stoppen met de loop, "while x<20" dus.
Waar moet ik dan "x:=x+1" zetten zodat de loop daar steeds langskomt en dus de x steeds groter maakt totdat de x 20 is??

  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
Op zaterdag 12 januari 2002 20:48 schreef cougar007 het volgende:
Hier stond eerst 'Maar ik snap nog steeds niet hoe hij die x nu groter maakt. Komt dat door inc(x)?' >:) Snel editten zeker :)
Bij de while lus komt het inderdaad door de inc (schijnt sneller te zijn of zo?), for x := x to 20 do verhoogt automagisch x.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
Hij doorzoekt de string met deze code dus niet..

Levende bewijs zien??
join efnet #kick12

  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
Door die Length constructie bekijk je dus alleen de LAATSTE karakters... ik neem aan dat je de hele string wilt doorlopen?
code:
1
2
3
4
5
6
7
for x := 1 to length(sData) - 1 do
  begin
    if copy(sData, x, 2) = ':(' then
    begin
      ClientSocket1.Socket.SendText('PRIVMSG #channel BLIJ' + #10#13);
    end;
  end;

Volgens mij draai je trouwens ook de endline (#10) en de newline (#13) om :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 08:06

Tomatoman

Fulltime prutser

Op zaterdag 12 januari 2002 20:53 schreef pnieuwkamp het volgende:

[..]

Bij de while lus komt het inderdaad door de inc (schijnt sneller te zijn of zo?), for x := x to 20 do verhoogt automagisch x.
Dit moet natuurlijk zijn:
for x := 1 to 20

En cougar007, ik vind het trouwens nogal knullig dat je een fout als
code:
1
while <conditie> do;

niet weet te vinden. Als je met de debugger de code regel voor regel had doorlopen, had je direct gezien dat je hier in een oneindige lus raakt. Voortaan eerst even de debugger gebruiken alsjeblieft :(.

Een goede grap mag vrienden kosten.


  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
Op zaterdag 12 januari 2002 21:20 schreef tomatoman het volgende:

[..]

Dit moet natuurlijk zijn:
for x := 1 to 20

En cougar007, ik vind het trouwens nogal knullig dat je een fout als
code:
1
while <conditie> do;

niet weet te vinden. Als je met de debugger de code regel voor regel had doorlopen, had je direct gezien dat je hier in een oneindige lus raakt. Voortaan eerst even de debugger gebruiken alsjeblieft :(.
Nee, dan maak je een aanname over de initiele waarde van X.. Misschien had die al een specifieke waarde, je hebt de code erboven namelijk niet :P Okee, op IRC blijkt dat er vrijwel boven de var x : integer; begin x := 1; staat, maar dat wist ik niet, dus mijn code is toch goed :)

Verder blijkt via IRC dat hij net een weekje of zo Delphi gebruikt, dus dat hij meteen in de irc-botjes duikt vindt ik knap, alleen tja, dat regel voor regel had ik ook pas na een week of zo door :P

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Topicstarter
de code is nu:
code:
1
2
3
4
5
6
for x:=1 to 20 do;
    inc(x);
    if (copy(sData, length(sData)-23+x,2)=':(') then
    begin
    ClientSocket1.Socket.SendText('PRIVMSG #kick12 BLIJ' + #13+#10);
    end;

Maar het werkt nog steeds niet :(

Het lijkt wel of de x niet groter wordt...

(join Efnet #kick12 )

  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
Je hebt dus NOG STEEDS die puntkomma achter je do staan !!!!!! En tja, dan KOMT hij niet eens voorbij je loopje.. En aangezien je code in een ClientSocketOnReceive of zo staan, zul je na een aantal regels gechat vanzelf een erg brakke, recource-loze pc overhouden :)

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Is de functie Pos geen oplossing voor zoeken binnen een string?

Of voor geavanceerder zoeken een regex component?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 08:26

mulder

ik spuug op het trottoir

Op zaterdag 12 januari 2002 21:35 schreef cougar007 het volgende:
de code is nu:
code:
1
2
3
4
5
6
for x:=1 to 20 do;
    inc(x);
    if (copy(sData, length(sData)-23+x,2)=':(') then
    begin
    ClientSocket1.Socket.SendText('PRIVMSG #kick12 BLIJ' + #13+#10);
    end;

Maar het werkt nog steeds niet :(

Het lijkt wel of de x niet groter wordt...

(join Efnet #kick12 )
Weet niet wat je wilt, maar de code hier boven is kut.
code:
1
2
3
4
5
6
for x:=1 to 20 do
begin
  inc(x);
  if (copy(sData, length(sData)-23+x,2)=':(') then
    ClientSocket1.Socket.SendText('PRIVMSG #kick12 BLIJ' + #13+#10);
end;

oogjes open, snaveltjes dicht


  • whoami
  • Registratie: December 2000
  • Laatst online: 06:24
Op zondag 13 januari 2002 05:17 schreef El_Mundo het volgende:

[..]

Weet niet wat je wilt, maar de code hier boven is kut.
Vind ik ook. Begin eens met een degelijk gebruik te maken van begin en end, ipv die ';' achter uw for en while enzo. De manier waarop jij dat doet is vragen om fouten.
code:
1
2
3
4
5
6
for x:=1 to 20 do
begin
  inc(x);
  if (copy(sData, length(sData)-23+x,2)=':(') then
    ClientSocket1.Socket.SendText('PRIVMSG #kick12 BLIJ' + #13+#10);
end;
Dit zal ook niet goed werken. De for loop zorgt er zelf voor dat de waarde van X geincrementeerd wordt, dus die inc(x) in uw loop moet er uit.
Ik denk ook (ben het niet zeker), dat je x vanaf 0 zult moeten laten beginnen.

https://fgheysels.github.io/


  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
We hebben het nu meen ik ook al opgelost met POS, alleen nog niet vermeld hoe het nu is :) Probleem is alleen, dat de string die je van de IRC-server krijgt, ook je nick en adres bevat, en er vlak voor de text nog een dubbele punt staat.
Dus als je dan ze zin begint met een (, dan roept hij ook BLIJ!! :P

Code is nu btw dus:
code:
1
2
  if pos(':(', sData) <> 0 then
    ClientSocket1.Socket.SendText('PRIVMSG #kick12 PNBLIJ' + #10+#13);

Hij had ook een stukje dat op de LAATSTE twee charakters controlerrde op 'hi', en dan 'Hallo' terugstuurde, maar dat gaat dus weer niet met een pos :P Dan is je nick bijvoorbeeld abcdefghi, en dan zegt hij iedere keer dat je iets willekeurigs post: 'Hallo' :+

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Verwijderd

Op zondag 13 januari 2002 11:38 schreef whoami het volgende:

[..]

Dit zal ook niet goed werken. De for loop zorgt er zelf voor dat de waarde van X geincrementeerd wordt, dus die inc(x) in uw loop moet er uit.
Ik denk ook (ben het niet zeker), dat je x vanaf 0 zult moeten laten beginnen.
Als het om Strings (Long string) in Delphi gaat tel je vanaf 1. Dus:
code:
1
2
3
4
5
6
7
procedure Test;
var
  S: String;
begin
  S:='ABCDEF';
  ShowMessage(S[1]); // Toont 1e karakter dus A
end;

Tel je in een TList of afgeleide daarvan dan tel je van 0..n-1

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15-09 19:59

Creepy

Tactical Espionage Splatterer

Op zondag 13 januari 2002 12:48 schreef pnieuwkamp het volgende:
We hebben het nu meen ik ook al opgelost met POS, alleen nog niet vermeld hoe het nu is :) Probleem is alleen, dat de string die je van de IRC-server krijgt, ook je nick en adres bevat, en er vlak voor de text nog een dubbele punt staat.
Dus als je dan ze zin begint met een (, dan roept hij ook BLIJ!! :P
Misschien gewoon alles tot aan de eerste : er af halen, en dan pas checken? (lang leve pos() en copy() en delete() !)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Paul
  • Registratie: September 2000
  • Laatst online: 15-09 19:17
Op maandag 14 januari 2002 10:38 schreef Creepy het volgende:

[..]

Misschien gewoon alles tot aan de eerste : er af halen, en dan pas checken? (lang leve pos() en copy() en delete() !)
Klopt 100% :)
Alleen kun je dan beter zoeken naar
code:
1
pos('PRIVMSG ' + channelName + ' :', sData)

want dit:
code:
1
:pnieuwkam!pnieuwkamp@*****.***.wanadoo.nl PRIVMSG #kick12 :Blaat

is dus wat er in sData staat als je 'Blaat' roept.

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock

Pagina: 1