Yereax Johnsen: Programm hört mittendrin auf

Hallo

ich habe hier gerade ein Perl-Skript am laufen. Da passieren komische Dinge.
Erst mal was es machen soll:
Ein 3D-Array mit Werten füllen, abhängig von 3 Eingabewerten.

Die Berechnung scheint paar Durchläufe gutzugehen, dann fängt das Programm an zu hängen.
Als Testausgabe lasse ich jede zweite Zeile die Zeilennummer ausgeben.
Und das Programm hängt an einer echt unkritischen Stelle:
Letzte Testausgabe:
"z165"
und die Stelle im Programm dazu:
print "z165 ";
  print "\ni:$i";
print "z167 ";

Ideen an was das liegen könnte?

Und es wird noch besser:
Davor hat die Testausgabe mitten in der Zahl aufgehört
"z1"

Der Prozessor bleibt bei 100% Auslastung, bis Strg+C gedrückt wird.
Wenn die Größe der Eingabedaten variiert, sind es unterschiedliche Zeilen, bei denen der Fehler auftritt.

Die Speicherauslastung (laut top) ist bei 0.7%, bzw. wenn ich in der graphischen Systemüberwachung nachschaue 0.5 MB Differenz. Kann da der Fehler liegen?
Der 3D Array hat "nur" eine Größe von (weniger als) 20*20*20, zusätzlich sind noch 3 2D-Arrays mit je 20*20 und paar Textvariablen.

cYa
Yere

P.S.: Bei Bedarf kann ich das Programm + die Testdateien gerne per mail zuschicken.

  1. gudn tach!

    Davor hat die Testausgabe mitten in der Zahl aufgehört
    "z1"

    vor was?

    laesst du das script im cli oder im browser ausfuehren?

    P.S.: Bei Bedarf kann ich das Programm + die Testdateien gerne per mail zuschicken.

    reduziere das programm um alles, was nicht noetig ist, um das problem hervorzurufen und poste es dann hier im forum.

    prost
    seth

    1. gudn tach!

      Davor hat die Testausgabe mitten in der Zahl aufgehört
      "z1"

      vor was?

      Bevor ich die Eingabedaten verkleinert habe.

      laesst du das script im cli oder im browser ausfuehren?

      GNOME-Terminal 2.14.2

      reduziere das programm um alles, was nicht noetig ist, um das problem hervorzurufen und poste es dann hier im forum.

      wird gemacht.... dauert nur ca. 5 Minuten... oder doch etwas länger, weil das Minimalbeispiel hängt nicht. *wunder*

      1. gudn tach!

        Davor hat die Testausgabe mitten in der Zahl aufgehört
        "z1"

        das hat (indirekt) zur Lösung geführt:
        Das Problem lag lange danach:
        Es gab eine Endlosschleife, die hat halt endlos gerechnet. Allerdings scheint es so zu sein, dass Perl nicht sofort alles am Bildschirm ausgibt, sondern erst, wenn genug zusammenkommt.
        ODER????

        Aber die Endlosschleife war erst weit hinter der Stelle, wo ich die Testausgaben hab ausgeben lassen. Und da einige Testausgaben noch vermisst wurden, insbesondere die am Ende des Blocks, hab ich den Fehler noch oberhalb dieser Testausgabe vermutet.

        Danke für die Hilfe & Mühe
        cYa
        Yere

        1. moin,

          gudn tach!

          Davor hat die Testausgabe mitten in der Zahl aufgehört
          "z1"

          das hat (indirekt) zur Lösung geführt:
          Das Problem lag lange danach:
          Es gab eine Endlosschleife, die hat halt endlos gerechnet. Allerdings scheint es so zu sein, dass Perl nicht sofort alles am Bildschirm ausgibt, sondern erst, wenn genug zusammenkommt.

          Si isses.

          ODER????

          Diesen Puffer kannst Du ausschalten mit der Anweisung

          $| = 1;

          --roro

          1. Hey,

            Diesen Puffer kannst Du ausschalten mit der Anweisung
            $| = 1;

            Anmerkung zum Stil: wo möglich, sollte man die superglobalen Variablen vermeiden. Wer weiß, wo einem diese ungewollt dazwischenpfuschen (Stichwort action at a distance). Entweder schränkt man den Gültigkeitsbereich so stark wie möglich ein

            {  
               local $| = 1;  
               # ungepufferte Operationen  
            };  
            
            ~~~ oder nimmt am besten gleich die Methode `IO::Handle::autoflush()`{:.language-perl}, so lässt sich der Puffer spezifisch für einzelne Handles steuern.
            
            -- 
            水-金-地-火-木-土-天-海-冥