Johannes Vogel: Variableninhalte verloren?

Hi ihr alle

Ich hab ein interessantes Problem in JavaScript. Schon vor einigen Wochen habe ich dieses an dieser Stelle angebracht, leider konnte es damals noch niemand loesen und es interessierte sich auch kaum einer genauer dafuer :-( Hier ist also die Herausforderungen fuer alle die, die mal wieder beweisen moechten, dass sie die besten auf dem Web sind! :-)

Nun, weil ich es wirklich oberst merkwuerdig finde, habe ich euch eine Seite zusammengestellt mit dem Problem und auch einem kleinen Fragebogen...

Es geht darum, dass ich in einer for-Schlaufe einige Bilder in einen zweidimensionalen Array werfe, diese dann, sobald ich die for-Schlaufe verlasse, sofort den allerletzten Wert, den ich zuwiess, enthalten. Wie kann das sein? Wieso verliere ich plötzlich Daten? Weshalb?!

Die Seite mit dem Sourcecode und ebenfalls gerade einer Möglichkeit des Testens habe ich euch auf http://www.zik.ch/vogel/problem geblasen. Auf reges Kommen, Versuchen, helfen wuerde ich mich freuen.

Gruessle aus dem Schweizle (kalt)
Johannes Vogel

PS: Wie auch im PS der Page: sorry, es ging etwas schnell und ich hab mir nicht gross mphe gegeben mit der Page. Mir war die Information wichtig, nicht die Gestaltung... Trotzdem, ich hoffe, ihr habt Spass beim Tuefteln!!!!

  1. Hallo,

    Es geht darum, dass ich in einer for-Schlaufe einige Bilder in einen zweidimensionalen Array werfe,

    Genau da liegt IMHO die Krux.
    Deine Deklaration sieht so aus:
        Pict = new Array (MaxBilder, 3)
    Das ergibt aber kein zweidimensionales Array, sondern ein eindimensionales mit zwei Elementen.

    Zwei Formen der Syntax beim Definieren von Array-Objekten gibt es:
       new Array(arrayLength);
       new Array(element0, element1, ..., elementN);
    mit:  
       arrayLength  (Optional) The initial length of the array.
       elementN  (Optional) A list of values for the array's elements. When this form is specified,
                       the array is initialized with  the specified values as its elements

    Deine Syntax entspricht der zweiten.

    Sorry, aber ich habe jetzt nicht versucht, nachzuvollziehen, was in Deinem Script daraufhin weiter unten genau passiert, was der Browser da hineininterpretiert.
    Hilfreicher ist es sicher zu wissen, wie man zweidimensionale Felder anlegt
    So:
       a = new Array(4)    /*    a = new Array() reicht auch
       for (i=0; i < 4; i++) {
          a[i] = new Array(4)
          for (j=0; j < 4; j++) {
             a[i][j] = "["+i+","+j+"]"
          }
       }
    und zum Ueberpruefen das hier gleich hinten dran:
       for (i=0; i < 4; i++) {
          str = "Row "+i+":"
          for (j=0; j < 4; j++) {
             str += a[i][j]
          }
          document.write(str,"<p>")
       }

    Das Beispiel habe ich uebrigens jetzt nicht konstruiert, sondern ebenso wie die Beschreibung der Syntax direkt bei Netscape abgeschrieben.
    War einfacher :-)
    JavaScript Referenz: http://developer.netscape.com/docs/manuals/communicator/jsref/index.htm

    Christine

    1. ...
      Das Beispiel habe ich uebrigens jetzt nicht konstruiert, sondern ebenso wie die Beschreibung der Syntax direkt bei Netscape abgeschrieben.
      War einfacher :-)
      JavaScript Referenz: http://developer.netscape.com/docs/manuals/communicator/jsref/index.htm

      Christine

      Hallo,

      wo ich gerade dabei bin, hier meine modifizierte Version des Beispielskripts.
      Anzumerken ist noch, dass in dem Original-Beispiel die Variable
      zaehler von 1..maxbilder durchlaeuft. Korrekt ist IMHO allerdings
      von 0..(maxbilder-1) (wie Arrays in C).

      Gruesse,

      Andreas Bierhals

      ...Funktioniert bei mir (Netscape 4.05):

      <html><body>
      <script language="JavaScript">

      var MaxBilder = 7;

      /* Bilder in den Speicher laden                             */
              /* 0 für deaktiviert, 1 für übergefahren, 2 für aktiv       */
              Pict = new Array(MaxBilder);
              for (i=0; i<MaxBilder; ++i) Pict[i] = new Array(3);

      var testvar="";
              for (zaehler=0; zaehler<MaxBilder; zaehler++)
              {
                      Pict[zaehler][0] = new Image(); Pict[zaehler][0].src = "menue_pix/section" + eval(zaehler+1) + "b.gif";
                      Pict[zaehler][1] = new Image(); Pict[zaehler][1].src = "menue_pix/section" + eval(zaehler+1) + "r.gif";
                      Pict[zaehler][2] = new Image(); Pict[zaehler][2].src = "menue_pix/section" + eval(zaehler+1) + "g.gif";
                      testvar = testvar + "; " + Pict[zaehler][0].src + "\n";
                      testvar = testvar + "; " + Pict[zaehler][1].src + "\n";
                      testvar = testvar + "; " + Pict[zaehler][2].src + "\n";
              }
              alert (testvar);
              testvar= "";
              for (zaehler=0; zaehler<MaxBilder; zaehler++)
              {
                      testvar = testvar + "; " + Pict[zaehler][0].src + "\n";
                      testvar = testvar + "; " + Pict[zaehler][1].src + "\n";
                      testvar = testvar + "; " + Pict[zaehler][2].src + "\n";
              }
              alert (testvar);        
        
      </script>
      </body></html>