Zum Inhalt springen

Loop endet in Dauerschleife


Empfohlene Beiträge

Geschrieben

Hallo ihr alle...

Ich stehe gerade vor einem kleinen Problem. Zum auslesen und weiterleiten von Rechnerdaten, hat mein Ausbilder mir ein prog besorgt was genau dies tun sollte. Ausgegeben wird letztendlich eine HTML Datei. Da das Programm zuerst eine Art Log Datei schreibt, wird schliesslich noch ein Script zum Umwandeln in HTML benötigt. Dieses ist in Form einer .vbs auch vorhanden. Das Problem welches sich mir hier auftut ist folgendes:

a) Das Programm verheddert sich in einer Dauerschleife

B) Da die ganze zeit weiter in eine HTML geschrieben wird, wird diese immer größer bis der virtuelle Speicher des Rechners nimmer ausreicht

Die folgende Passage konnten wir bisher als Fehlerquelle definieren:


'---Retrieve info from sorted tempfile and write results to snapshot

        Do Until TextStreamTemp.AtEndOfStream

                inputLine = TextStreamTemp.ReadLine

                inputLevel = Split(inputLine, ":", 4, 1)

                If (UBound(inputLevel) >= 3) Then               'skip empty lines


                        '---Write SCC Class totals

                        If currentSccClass <> inputLevel(0) Then

                                TextStreamOut.WriteLine ("<TR>")

                                TextStreamOut.WriteLine ("       <TD>" & inputLevel(0) & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & inputLevel(1) & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & Round((inputLevel(1) / total) * 100) & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("</TR>")


                                currentSccClass = inputLevel(0)

                        End If


                        '---Write SubClass totals; general has no subclass.

                        If inputLevel(2) <> "" Then

                                TextStreamOut.WriteLine ("<TR>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & inputLevel(2) & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & " " & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & inputLevel(3) & "</TD>")

                                TextStreamOut.WriteLine ("       <TD>" & Round((inputLevel(3) / total) * 100) & "</TD>")

                                TextStreamOut.WriteLine ("</TR>")

                        End If

                End If


	Loop

Nun ist es an dem armen kleinen Azubi (mir) den Fehler zu beheben. Da ich das nach 2 Tagen rumprobieren und rumforschen irgendwie noch nicht auf die Reihe bekommen habe bitte ich euch um Mithilfe...

THX...Dere

P.s.: Gerad ekam mein Ausbilder rüber und meinte dies sei gar ni der Primäre Punkt der Aufgabenstellen *rummoser*

Geschrieben

Mit was kann ich sowat denn Debuggen? Da es sich nur um ein Programmmodul handelt lässt sich dies schwerlich tun...

Das HTML file krieg ich im nachhinein aus Speichergründen nicht geöffnet (knapp 200 MB groß)....

Geschrieben

eben das waren auch meine Gedanken, nur hab ich beim Durchssuchen des WWW kein Script gefunden wo im zusammenhang mit solch einem Loop ein Movenext o.ä. verwendet wird....

Geschrieben
hab den eindruck da fehlt so ne art: movenext

joa hab ich auch gedacht, aber vielleicht macht das auch schon das readline :confused:

desswegen die frage nach dem debuggen und wie das HTML aussieht (immer gleiche daten oder wiedeholen sich unterschiedliche daten)?

edit: zum debuggn breakpoint setzen!

Geschrieben

Hi,

ich kenn mich nicht so recht mit VB au, aber ich vermute es liegt an deiner Abbruchbedingung:

"TextStreamTemp.AtEndOfStream" klingt für mich irgendwie komisch. Gibt es nicht andere Methoden, die dir zurückgeben, dass das ende erreicht ist. Ich hate früher mal mit VB zu tun und da hieß es dann immer StreamObjekt.EOF bzw. StreamObjekt.EnOfStream - also ohne At.

Vielleicht hat dir das ja was gebracht...

mfg Eytibi

Geschrieben
"TextStreamTemp.AtEndOfStream" klingt für mich irgendwie komisch.
Nein, das ist schon richtig so. So heißt das bei Scripting.FileSystemObject. Wir sind ja bei VBS, nicht VB.

Eigentlich sollte der Code so funktionieren. Wie |roTekuGeL| schon sagte, es wäre interessant zu wissen, was hinterher in der Ausgabe steht, nachdem die Quelldatei eigentlich abgearbeitet sein sollte.

Geschrieben

danke euch erstmal....da, wie beschrieben, dieses Problem eher sekundär ist, werde ich das zu gegebenem Zeitpunkt ausprobieren, sprich wenn der ganze Rest lauffähig ist...

Soweit shconmal danke für die Antworten

Dere Nico

Geschrieben

So...nachdem ich mich gestern noch diverser anderer Probleme angenommen habe, bin ich nun heut morgen dazu gekommen mich wieder dem mit der Dauershcleife zu widmen.

Es ist tatsächlich so, dass das Programm einfach nur eine leere endlose Tabelle produziert bis der Speicher voll

<TR>

       <TD> </TD>

       <TD>file(s)</TD>

       <TD> </TD>

       <TD> </TD>

       <TD>C \WINNT\win.ini::layout=0</TD>

</TR>

Hrm...also ich habe keine wietere Idee was da nun zu tun wäre....Ihr vieleicht?

Geschrieben

Das sollte de rrichtige sein. Denn wenn ich diese Schleife auskommentiere, bzw. ganz rausnehme funktioniert alles tadellos...

Aber jetz wo du's sagst, merkwürdig is das shcon....

Geschrieben

Ist da irgendein "On Error" drin? Falls ja, nimm das mal raus.

Falls das der richtige Code ist, dann ist inputLevel(3) ein String mit dem Inhalt "C \WINNT\win.ini::layout=0". Der wird aber für das 6. Tabellenelement offenbar wie eine Zahl behandelt, was wenig sinnvoll ist.

Und gib mal bitte aus, welchen Wert total an dieser Stelle hat.

Kannst du die entsprechende Zeile in der Quelldatei finden? Was genau steht da drin? Steht die ganz am Ende?

Geschrieben

Also wenn ich den entsprechenden "On Error..." rausnehme läuft er ohne Probleme durch, hat dann allerdings nicht die beabsichtigte Tabelle dabei.

An dieser Stelle hat "total" den "664" was natürlich einiges erklären würde, oder?

Der Wert von Total errechnet sich aus der Addition der beiden Summanden Varcount und Fixcount, welche in folgender Schleife (gleiche Sub) berechnet werden:


        Do Until TextStreamIn.AtEndOfStream

                inputLine = TextStreamIn.ReadLine

                inputLevel = Split(inputLine, ":", 4, 1)

                If (UBound(inputLevel) >= 3) Then                       'skip empty lines

                        If (inputLevel(2) = currentSubClass) Then       'count number in subClass

                                subClassCount = subClassCount + 1

                        Else                                            'calculate number of entries for each subclass

                                If (currentSubClass <> "###start_sub_class###") Then

                                        count = count + 1

                                        ReDim Preserve subClass(count)

                                        ReDim Preserve subCounter(count)

                                        subClass(count) = currentSubClass

                                        subCounter(count) = subClassCount

                                End If

                                currentSubClass = inputLevel(2)

                                subClassCount = 1

                        End If

                        If (inputLevel(1) = currentSccClass) Then               'increment scc class counter

                                sccClassCount = sccClassCount + 1

                        Else                    'write all subclasses and totals to tempfile

                                If (currentSccClass <> "") Then

                                        For i = 1 To count

                                                TextStreamTemp.WriteLine (currentSccClass & _

                                                                        ":" & _

                                                                        sccClassCount & _

                                                                        ":" & _

                                                                        subClass(i) & _

                                                                        ":" & _

                                                                        subCounter(i))

                                        Next

                                End If

                                currentSccClass = inputLevel(1)

                                sccClassCount = 1

                                count = 0

                                ReDim subClass(count)

                                ReDim subCounter(count)

                        End If

                        If (UCase(inputLevel(0)) = "FIX") Then          'increment fix and var counters

                                fixCount = fixCount + 1

                        Else

                                varCount = varCount + 1

                        End If

                End If

        Loop 

Geschrieben
Also wenn ich den entsprechenden "On Error..." rausnehme läuft er ohne Probleme durch, hat dann allerdings nicht die beabsichtigte Tabelle dabei.
Wie sieht denn das "On Error" genau aus? Und wenn du es rausnimmst, läuft das Skript ohne Laufzeitfehler durch?

An dieser Stelle hat "total" den "664" was natürlich einiges erklären würde, oder?
Nein, ich hatte eigentlich auf 0 gehofft, denn Division durch Null könnte das Verhalten recht einfach erklären.

Hast du die Zeile in der Quelldatei finden können?

Geschrieben

Es handelt sich um "On Error resume Next" ... Beim durchlauf bekomme ich immernoch keine fehlermeldung ausgespuckt. Ich werd mal sehen ob noch irgendwo andere Verbergen, die rauszunehmen sind...

Hrm, stimmt, Division durch 0 wäre logisch gewesen...

Von welcher zeile sprichst du genau?

Geschrieben

Also ich hab die Stelle jetzt nicht gefunden. Da ich jetz noch ein paar andere Sachen zu tun habe, werde ich es auch erst einmal debei bewenden lassen. Sollte dieses Problem nun allerdings jemandem Schlaflose Nächte bereiten, weil er einfach viel ehrgeiziger ist als ich, dann kann er sich das Programm auch herunterladen und noch weiter tüfteln (positive Ergebnisse, wären dann natürlich schön zu lesen *g*) :D

http://www.openeyet.nl/scc/download.html

Die Install for windows ist die, die ich verwende (scc-0_10b.exe). Das problem befindet sich in der Scc2Html.vbs .

An dieser Stelle schonmal vielen Lieben Dank für die Mithilfe an dieser Stelle. Sollte ich mich durchricngen können mich noch ein wenig mit dem problem zu befassen, werde ich hier umgehend Meldung geben...

Wie gesagt Danke euch erstmal....

Dere nico

Geschrieben

Hier liegt das Problem:

'--------------------------------------------------------------------------
'---
'--- Initialization global variables
'---
'--------------------------------------------------------------------------
defaultBinPath = ""
strComputer = "."
ForReading = 1
ForAppending = 8
defaultSCCFile = "scc.localhost.cur"
defaultInputPath = "c:\[b]Program Files[/b]\SCC\data"
defaultOutputPath = "c:\[b]Program Files[/b]\SCC\data"
strSccPath = "C:\[b]Program Files[/b]\SCC\bin"
[/code]

Damit funktioniert der Code nur auf einem englischsprachigen Windows.

Geschrieben

cool, du hast ja wirklich noch weiter geschaut :-)

Hrm...also mein Kollege meinte, dass es eigentlich keinen Einfluss haben sollte, deswegen bin ich das einfach übergangen...Hrm...Hast du probiert ob es funktioniert, wenn du den ganzen Mist ins Deutsche protierst?

Geschrieben

Ja, dann geht's. Das Problem liegt letztendlich daran, dass im Skript eine Sort.bat im "falschen" bin-Ordner erstellt wird. Da der Pfad aber gar nicht existiert, wird die eben nicht erstellt, und auch nicht ausgeführt. Und mit unsortierten Daten kommt das Skript wohl nicht zurecht.

Geschrieben

Es geht!!!!

Wie gesagt hab ich da auch shcon dran gedacht, aber aufgrund einer Fehlinformation den Gedanken nicht weiter verfolgt.

Ich danke dir für die gute und vor allem schnelle Hilfe

Geschrieben

Gern geschehen :)

Zwei Hinweise möchte ich dir noch mitgeben:

Der Kollege hat es sicher gut gemeint, als er dir sagte, dass sich das eigentlich nicht auswirken sollte. Entwickle eine gesunde Skepsis gegenüber dem Wort "eigentlich". Hier (wo ich arbeite) haben wir einen Running Gag: "Das sollte eigentlich so unter CE laufen". Das betreffende Windowsprogramm war nur unter größten Schwierigkeiten nach CE portierbar. Wie sagt man so schön: Man hat schon Pferde vor der Apotheke ****en gesehen. Prüfe auch die unwahrscheinlichen Fehlerursachen, gerade wenn sie so einfach zu prüfen sind, wie hier.

Und leg Wert auf gute Fehlerbehandlung. Ich weiß, dass das gerade bei VBS eher unhandlich ist, und "On Error Resume Next" ist ja auch sehr bequem. Aber wenn mal ein Problem auftritt, suchst du dich dumm und dämlich.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...