Laden...

Code wird nach while schleife nicht weiter abgearbeitet

Erstellt von 0odarkio0 vor 13 Jahren Letzter Beitrag vor 12 Jahren 5.043 Views
0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren
Code wird nach while schleife nicht weiter abgearbeitet

hallo... ich hoffe ihr könnt mir bei meinem problem helfen.. also ich finde den fehler nicht 🙁

ich habe folgenden code:

        private void webBrowser6_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            string bild_quelle = webBrowser6.DocumentText;
            string[] bilder_gw = new string[14];
            int bilder_gw_zaehler = 0, suche_gw_1 = 0, suche_gw_2 = 0;
            int bild_1 = bild_quelle.IndexOf("Wer hat", 0);
            int bild_2 = bild_quelle.IndexOf("<a class", bild_1);
            do {
                suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
             if (suche_gw_1 != -1)
             {
                 suche_gw_1 += 10;
                 suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
                 suche_gw_2 -= 2;
                 bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
                 bilder_gw_zaehler++;
                 bild_2 = suche_gw_2;
                 MessageBox.Show(suche_gw_1.ToString());
             }
            } while (suche_gw_1 != -1);
            MessageBox.Show("fertig");
        }

die messageboxen hab ich in den Code geschrieben um zu sehen ob alles funktioniert...
das programm findet die richtigen Werte das zeigt die -> MessageBox.Show(suche_gw_1.ToString()); ), aber nach der while schleife hört es dann auf... die MessageBox.Show("fertig"); .. wird nicht mehr ausgeführt.
wenn ich den wert - >} while (suche_gw_1 != -1); ... ändere... dann führt das programm die letzte messagebox aus.
kann mir jemand sagen wieso die while schleife so nicht funktioniert... ich hab das bis jetzt meiner meinung nach immer so gemacht

C
48 Beiträge seit 2011
vor 13 Jahren

Ich würde mal sagen, suche_gw_1 wird niemals 1, weil in jedem "bild_quelle" dein Text vorkommt => logisch, da bild_quelle nicht verändert wird.
Ich hoffe ich sehe das richtig
C#ler

In theory, there is no difference between theory and practice. But, in practice, there is.

The nice thing about the Java API is that if you don't like it, just wait two minutes — it will change. Doug Lyon

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

bild_quelle ist der gesamte quelltext der seite... und da sollen bestimmte bild links rausgefiltert werden der findet auch die werte davon und arbeitet die while schleife ab... aber danach passiert nix mehr.. also es entsteht auch keine entlosschleife oder so

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

@C#ler: Der String wird zwar nicht verändert, aber der Startindex der Suche 🙂

@0odarkio0

die MessageBox.Show("fertig"); .. wird nicht mehr ausgeführt.

Was genau passiert denn?? Keine Exeption und keine Endlosschleife? Gar nichts?

Ich könnte mir vorstellen, dass es an den MessageBoxen selbst liegt. Die sind nicht dazu geeignet, solche Ausgaben zu machen. Den Grund dafür hat herbivore mal in [gelöst] Endlose Anzeige einer MessageBox in Form_Load (in Kombination mit Form_Activated) (und seinem folgenden Beitrag) beschrieben.

Versuch es doch mal stattdessen mit Debug- oder Logausgaben, die kannst Du auch wesentlich ausführlicher machen.

Sonst kann ich nicht unbedingt einen Fehler sehen, es sei denn das Dokument ist nicht so aufgebaut, wie Du es vermutest. Aber selbst dann müsstest Du eigentlich rauskommen. Die Bedingungen von if und while sind ja identisch, also gibt es einen weiteren Durchlauf nur, wenn er vorher in den if-Block gegangen ist. Dann müsstest Du aber die MessageBox von dort erhalten...

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

Gelöschter Account
vor 13 Jahren

Offensichtlich tritt irgendwo eine Exception auf die dann wahrscheinlich kommentarlos einkassiert wird, kann auch passieren wenn du es in einem extra Thread ausführst.

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

es kommt keine fehlermeldung nix... er sucht mir die bild adressen alle richtig raus und hört dann bei der letzten auf... also das funktioniert.

ich hab jetzt die messagebox mal weg genommen und hab nach der while schleife ein:
this.Close();
geschrieben... aber das macht er auch nicht =(

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

den Debugger benutzt Du aber schon? Dann müsstest Du doch sehen wo's schiefläuft.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

ja ich hab haltemarken gesetzt und geguckt ob irgendwo nen fehler oder so kommt ... er läuft richtig hab ... er findet die richtigen werte und die richtige adressen ... und nach dem letzten wert hört er auf
aber wenn ich ne haltemarke nach der while schleife setze ... dann wird die auch nicht ausgeführt

5.742 Beiträge seit 2007
vor 13 Jahren

aber wenn ich ne haltemarke nach der while schleife setze ... dann wird die auch nicht ausgeführt

*hust* endlosschleife hust...

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

aber ich kann doch weiterhin alles normal ausführen ohne das sich das programm aufhängt oder so... und wenn ich in die schleife ein label reinschreibe was das rausgefilterte immer ausgibt ... dann kommt das genau 14 mal ... bei ner endlosschleife müsste das ja dann immer wieder kommen oder?

5.742 Beiträge seit 2007
vor 13 Jahren

dann kommt das genau 14 mal ... bei ner endlosschleife müsste das ja dann immer wieder kommen oder?

Debugge mal stepweise durch.

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

das hab ich gemacht... nach dem 14. mal geht er aus der schleife raus =/

5.742 Beiträge seit 2007
vor 13 Jahren

das hab ich gemacht... nach dem 14. mal geht er aus der schleife raus =/

Aber dann muss er doch auch an dem Breakpoint nach der Schleife ankommen?
Gib mal testweise alles in die VS-Konsole aus (Debug.WriteLine).

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

ich hab jetzt Debug.WriteLine("error"); in die schleife geschrieben ... da passiert nix.. war das falsch?

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

wenn ich den wert: while (suche_gw_1 != -1);
zu : while (bilder_gw_zaehler == 0);
änder ... dann führt er nach der while schleife alles aus =O
aber damit kann ich ja dann nicht prüfen lassen wie oft etwas im quelltext vorhanden ist.

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

OK ich weis jetzt zwar nicht wie das problem entstanden ist ... aber wenn ich
die whileschleife in
} while (bild_2 == suche_gw_2);
änder klappt alles wie ich es will und nach der while schleife wird alles ausgeführt.

edit: es klappt doch nicht sry ^^ der fehler bleibt .. er führt nix nach der schleife aus

C
92 Beiträge seit 2010
vor 13 Jahren

Hallo 0odarkio0,

du kannst ja mal versuchen die While-Schleife umzuschreiben, eventuel hilft es dir ja bei der Problemsuche:

do {
   suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
   if (suche_gw_1 != -1)
   {
      suche_gw_1 += 10;
      suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
      suche_gw_2 -= 2;
      bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
      bilder_gw_zaehler++;
      bild_2 = suche_gw_2;
      MessageBox.Show(suche_gw_1.ToString());
   }
   else
   {
      break;
   }
} while (true);

oder besser so:

while(true) {
   suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
   if (suche_gw_1 != -1)
   {
      suche_gw_1 += 10;
      suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
      suche_gw_2 -= 2;
      bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
      bilder_gw_zaehler++;
      bild_2 = suche_gw_2;
      MessageBox.Show(suche_gw_1.ToString());
   }
   else
   {
      break;
   }
}

Edit: Du kannst ja mal einen Breakpoint in die Else-Bedingung reinsetzen, wenn dieser Breakpoint nie erreicht wird, dann hast du hier definitiv eine Endlosschleife.

mfg Cuin

0
0odarkio0 Themenstarter:in
61 Beiträge seit 2010
vor 13 Jahren

mit der endlosschleife war das gleiche problem... aber die schleife ändern hat geholfen 🙂
ich hab das nun so gelöst:

        private void webBrowser6_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            string bild_quelle = webBrowser6.DocumentText;
            string[] bilder_gw = new string[14];
            int bilder_gw_zaehler = 0, suche_gw_1 = 0, suche_gw_2 = 0;
            int ende = bild_quelle.LastIndexOf("src=\"http://content2");
            int bild_1 = bild_quelle.IndexOf("Wer hat dich zuletzt gespickt?", 0);
            int bild_2 = bild_quelle.IndexOf("<a class", bild_1);

            do {
                 suche_gw_1 = bild_quelle.IndexOf("<img src=\"", bild_2);
             if (suche_gw_1 != -1)
             {
                 suche_gw_1 += 10;
                 suche_gw_2 = bild_quelle.IndexOf("/>", suche_gw_1);
                 suche_gw_2 -= 2;
                 bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
                 bilder_gw_zaehler++;
                 bild_2 = suche_gw_2+2;
             }
            } while (ende > suche_gw_1);
        }

da wird nun der LastIndexOf vom letzten Bild gesucht und mit dem wert sag ich der while schleife wie oft die durchlaufen soll... so funktioniert das komischerweise.
danke euch allen für eure hilfe 🙂
falls jemand weiß wieso die erste Variante nicht funktioniert... kann er es ja hier mal schreiben.. das würde mich mal interessieren.

9 Beiträge seit 2011
vor 12 Jahren

Ich gehe mal davon aus, dass die Methode Bestandteil eines Programmes ist, wo in einer höheren Ebene Code für das Abfangen von Fehlern ist.

Vielleicht gibt es in dem Webdokument mehr als 14 Bilder. Dann würdest du zwar 14 Messageboxen bekommen, aber die 15. nicht mehr da der Code bei


...
bilder_gw[bilder_gw_zaehler] = bild_quelle.Substring(suche_gw_1, suche_gw_2 - suche_gw_1);
...

in den Catch-Block fliegt. Dein restliches Programm läuft dann problemlos weiter.