Sven Franck: Stack overflow vermeidbar?

Hallo,

habe ein Script, dass einen Array mit 75 Images durchläuft, Fehlbilder überspringt und existierende Bilder in einem Table abbildet.

Problem:

Wenn nur wenige Bilder im Array enthalten sind, erhalte ich stets einen Stack Overflow error, da der "Bilderzähler" nicht bei 75 anhält, sondern munter weiterzählt.

Frage:

Kann man diesen stack overflow Error irgendwie vermeiden???

Mit return true funktioniert es nicht, weil dass Script dann nicht mehr durchläuft.

Den Zähler auf auf 75 zu begrenzen, wäre fein, aber leider kommt der overflow Error schon bei einem Stand von ca. 30!!! Würde aber gerne den gesamten Array mit den 75 Bildern durchsuchen.

Vielen Dank für die Hilfe,

Sven

  1. Hi,

    habe ein Script, dass einen Array mit 75 Images durchläuft, Fehlbilder überspringt und existierende Bilder in einem Table abbildet.
    Problem:
    Wenn nur wenige Bilder im Array enthalten sind, erhalte ich stets einen Stack Overflow error, da der "Bilderzähler" nicht bei 75 anhält, sondern munter weiterzählt.
    Kann man diesen stack overflow Error irgendwie vermeiden???

    Ja.
    Du mußt in der 17. Zeile ein ; ans Zeilenende setzen. *)

    *) Du erwartest, daß wir hellsehen?!

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...

      Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.

      <!--
              //globals
              var catory = "012"
              var Saison = 8;
              var i = "";
              var s = "";
              var a = "";
              var y = 0;
              var stopper = 0;
              var mistakecounter = "";

      //array
              container = new Array ();
                           for (i=0; i<76; ++i) {
                                if (i<10) {
                                j = "0" + i;
                           } else {
                                j = i;
                           }
                            container[i] = new Image (50,50);
                            container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";
                           }

      //main part
                    s = 0;
                    var Pix = container[s];
                    testImage (Pix);

      //------------start function loop-----------------

      //initial

      function testImage(Pix)
                      {
                      var tester=new Image();
                      tester.onload=Wasda;
                      tester.onerror=Nixda;
                      tester.src=Pix;
                      }

      //Bild vorhanden

      function Wasda()
                       {
                       y = ++y;
                       document.all.tags("div")[y].innerHTML = "<img src='T" + container[s] + "' name='"+"Bild"+ s + "' border=0 height=50px width= 50px alt='' onclick='NLarge(name);'>";
                       y = ++y;
                       var Pix = container[s];
                       var DisplayMain = Pix.slice(Pix.length-Pix.length,[Pix.length-4]);
                       document.all.tags("div")[y].innerText = DisplayMain;
                       //anhalter, fuer den Table
                       if (stopper <=20)
                       {
                       stopper = ++stopper;
                       s = ++s;
                       var Pix = container[s];
                       testImage (Pix);
                       }
                       }

      //kein Bild vorhanden

      function Nixda()
                       {
                       mistakecounter = ++mistakecounter
                       s = ++s
                       if (mistakecounter<18)
                       {
                       Pix = container[s];
                       testImage (Pix);
                       }
      // HIER KOMMT DER STACK OVERFLOW; WENN MISTAKECOUNTER > 18 wird!!!
                       }

      //------------Ende function loop-----------------

      //onclick Function

      function NLarge (name){

      //extract s aus URL

      var merker = document.all[name].src;
                       var merker2 = merker.slice(merker.length-6, [merker.length]);
                       var merker3 = merker2.slice(merker2.lenght-merker2.length, [merker2.length-4]);;
                       if (merker3.charAt(0) == 0) {
                          var merker4 = merker3.slice(merker3.length-1, [merker3.length]);
                          } else {
                          var merker4 = merker3;
                          }
                       var s = merker4;
                       var Display = container[s];

      //extract Name of jpg aus URL

      Display2 = Display.slice(Display.length-Display.length, [Display.length-4]);
                       Detail = window.open ("Detail.html", "Detail", "toolbar=no,...");

      //open large version in new picture

      window.Detail.document.write("<...>")
                       window.Detail.document.write("<...>");
                       }
      //-->

      Hoffe man wird schlau draus und jemand kann mir weiterhelfen...

      Merci nochmal

      Sven

      1. Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...

        Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.

        <!--

        //globals
                var catory = "012"
                var Saison = 8;
                var i = "";
                var s = "";
                var a = "";
                var y = 0;
                var stopper = 0;
                var mistakecounter = "";

        //array
                container = new Array ();
                             for (i=0; i<76; ++i) {
                                  if (i<10) {
                                  j = "0" + i;
                             } else {
                                  j = i;
                             }
                              container[i] = new Image (50,50);
                              container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";
                             }

        //main part
                      s = 0;
                      var Pix = container[s];
                      testImage (Pix);

        //------------start function loop-----------------

        //initial

        function testImage(Pix)
                        {
                        var tester=new Image();
                        tester.onload=Wasda;
                        tester.onerror=Nixda;
                        tester.src=Pix;
                        }

        //Bild vorhanden

        function Wasda()

        Ich weiss nicht ob dir das nicht gesagt wurde als du das letzte Mal gefragt hast, aber in dieser Funktion ist this gleich dem Bild. D.h. src = this.src und width = this.width usw.

        Und du musst die Funktion nicht immer neu aufrufen, da du sie in einer Schleife aufrufen kannst:

        for(var i = 0; container[i]; i++) testImage(container[i]);

        Das ruft dann für alle Bilder die entsprechende Funktion auf, wenn du allerdings sicher gehen willst, das die nacheinander aufgerufen werden musst du in der onload/error Funktion das nächste Bild aufrufen am besten mit setTimeout.

        und das sollte das Hauptproblem lösen.

      2. Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...

        Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.

        Bah mir ist gar nicht aufgefallen was da in dem Skript noch alles drin steckt. Auweia.

        <!--
                //globals
                var catory = "012"
                var Saison = 8;
                var i = "";
                var s = "";
                var a = "";
                var y = 0;

        Sowas GLobal zu deklarieren ist sehr gefährlich und kann dich am Schluss einige Stunden debuggen kosten.

        var stopper = 0;
                var mistakecounter = "";

        //array
                container = new Array ();
                             for (i=0; i<76; ++i) {
                                  if (i<10) {
                                  j = "0" + i;
                             } else {
                                  j = i;
                             }
                              container[i] = new Image (50,50);
                              container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";

        Erst weist du dem Element ein Image Objekt zu und dann doch ein String. Wenn dir die Reihenfolge der Bilder egal ist würde ich die erste Variante verwenden und das Objekt um die Eigneschaften die du benötigst erweitern.

        container[i] = new Image ();
        container[i].onload=Wasda;
        container[i].onerror=Nixda;
        container[i].src = catory + "-" + Saison + "-" + [j] + ".jpg";

        }

        //main part
                      s = 0;
                      var Pix = container[s];
                      testImage (Pix);

        Der 'main Part' ist dann überflüssig.

        //------------start function loop-----------------

        //Bild vorhanden

        function Wasda()
                         {
                         y = ++y;
                         document.all.tags("div")[y].innerHTML = "<img src='T" + container[s] + "' name='"+"Bild"+ s + "' border=0 height=50px width= 50px alt='' onclick='NLarge(name);'>";

        Das ist IE 4.x syntax, du solltest dich mal mit neueren Browsern beschäftigen.
        wie gesagt container[s] ist this.src

        y = ++y;
                         var Pix = container[s];

        var Pix = this.src;

        var DisplayMain = Pix.slice(Pix.length-Pix.length,[Pix.length-4]);

        Keine ahnung was du da genau willst, ich vermute mal den Dateinnamen.

        document.all.tags("div")[y].innerText = DisplayMain;

        all.tag() ist IE 4.x

        //anhalter, fuer den Table
                         if (stopper <=20)
                         {
                         stopper = ++stopper;

        Du musst hier stopper nichts zuweisen stopper++ erhöht bereits stopper um eins auch ohne Zuweisung.

        s = ++s;

        dito.

        var Pix = container[s];
                         testImage (Pix);

        Nicht mehr nötig.

        }
                         }

        //kein Bild vorhanden

        function Nixda()
                         {
                         mistakecounter = ++mistakecounter
                         s = ++s
                         if (mistakecounter<18)
                         {
                         Pix = container[s];
                         testImage (Pix);
                         }
        // HIER KOMMT DER STACK OVERFLOW; WENN MISTAKECOUNTER > 18 wird!!!

        Nixda() ist eigenlich auch nicht mehr nötig. Da in wasDa() ja schon mitgezählt werden kann, wieviele Dateien erfolgreich angezeigt wurden.

        Struppi.

        1. Naja, hab ich mir fast gedacht, dass ich ein wenig mehr ins Detail gehen sollte...

          Folgend Script mit ein wenig Instruktionen und hoffentlich ausreichend zusammengekürzt.

          Bah mir ist gar nicht aufgefallen was da in dem Skript noch alles drin steckt. Auweia.

          <!--
                  var catory = "012"
                  var Saison = 8;
                  var i = "";
                  var s = "";
                  var a = "";
                  var y = 0;

          //array
                  container = new Array ();
                               for (i=0; i<76; ++i) {
                                    if (i<10) {
                                    j = "0" + i;
                               } else {
                                    j = i;
                               }
                                container[i] = catory + "-" + Saison + "-" + [j] + ".jpg";

          Erst weist du dem Element ein Image Objekt zu und dann doch ein String. Wenn dir die Reihenfolge der Bilder egal ist würde ich die erste Variante verwenden und das Objekt um die Eigneschaften die du benötigst erweitern.

          container[i] = new Image ();
          container[i].onload=Wasda;
          container[i].onerror=Nixda;
          container[i].src = catory + "-" + Saison + "-" + [j] + ".jpg";

          }

          function Wasda()
                           {
                           y = ++y;
                           document.all.tags("div")[y].innerHTML = "<img src=...'>";

          Das ist IE 4.x syntax, du solltest dich mal mit neueren Browsern beschäftigen.
          wie gesagt container[s] ist this.src

          y = ++y;
                           var Pix = container[s];

          var Pix = this.src;

          document.all.tags("div")[y].innerText = DisplayMain;

          all.tag() ist IE 4.x

          Nixda() ist eigenlich auch nicht mehr nötig. Da in wasDa() ja schon mitgezählt werden kann, wieviele Dateien erfolgreich angezeigt wurden.

          Struppi.

          Danke erstmal für die Hilfe.

          Bin nicht der 24/7 Programmierer und habe auch nur eine alte JavaScript Fibel zur Hand!

          Gruss

          Sven

  2. Hallo Sven,

    Den Zähler auf auf 75 zu begrenzen, wäre fein, aber leider kommt der overflow Error schon bei einem Stand von ca. 30!!! Würde aber gerne den gesamten Array mit den 75 Bildern durchsuchen.

    Ich versuche mich mal im Wahrsagen: Du rufst deine Funktion rekursiv auf. Der overflow Error kommt nicht nach 30 Bildern sondern nach ca. 2250 Bildern (75 * 30)

    Aber ohne Codeschnipsel ... ? Vielleicht täuscht sich meine Kristallkugel ja auch ;-)

    ffbx

    Maxx