.type: Objekte in einem Array speichern

Liebe Javascript Profis,

  
function pc (infd,ntpc,stop){  
    this.infd=infd;  
    this.ntpc=ntpc;  
    this.stop=stop;  
    if(this.infd==1){  
    document.write(this.ntpc," is infected! <br>");  
    }  
  
  
  while(this.stop=0){  
      var rpn=Math.floor(Math.random()*nmc)  
  
      pca[rpn](1,rpn,0);  
      }  
}  
  
var nrp=0;  
while(nrp<nmc){   //nmc wird schon vorher definiert, der Teil Skriptes,  
                  //ist bloss für das Problem irrelevant  
       var pca[nrp]= new pc(0,nrp,0);  
       document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;  
        nrp=nrp+1;  
    }

Ich möchte im Endeffekt eine while-Schleife haben, die mir eine gewisse Anzahl von Objekten erstellt und einen Inhalt, die dieses Objekt gleich verarbeitet.
Ich erhalte folgende 2 Fehler Meldungen im IE 7: Exspected: ";" und Object exspected.
Ist das so überhaupt möglich oder mache ich einen (Denk-)Fehler?

Danke schon mal im Vorraus für eure Antwort,
lg .type

  1. Hallo,

    Ich erhalte folgende 2 Fehler Meldungen im IE 7: Exspected: ";" und Object exspected.

    schade, dass du nicht verrätst, für welche Zeilen diese Meldungen auftreten.

    function pc (infd,ntpc,stop){
        this.infd=infd;
        this.ntpc=ntpc;
        this.stop=stop;

    Vielleicht ist es keine gute Idee, einen Parameter so zu nennen wie eine Methode des window-Objekts. Ich bin mir nicht so sicher, ob dieser Namenskonflikt den IE ins Straucheln bringt.

    while(this.stop=0){

    Und hier konstruierst du eine Schleife, die nie ausgeführt wird. Denn in der Klammer steht eine Zuweisung, kein Vergleich; und da du den Wert 0 zuweist, der als false gilt, wird die Schleife sofort abgewiesen (der Vergleichsoperator ist '==').

    So long,
     Martin

    --
    Irgendwann in grauer Vorzeit benutzte einer unserer prähistorischen Vorfahren ein Schimpfwort anstelle der Keule.
    Die Zivilisation hatte begonnen.
    1. Hi,

      Vielleicht ist es keine gute Idee, einen Parameter so zu nennen wie eine Methode des window-Objekts. Ich bin mir nicht so sicher, ob dieser Namenskonflikt den IE ins Straucheln bringt.

      Der IE kennt window.stop doch gar nicht ...

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
      1. Hallo Chris,

        Vielleicht ist es keine gute Idee, einen Parameter so zu nennen wie eine Methode des window-Objekts. Ich bin mir nicht so sicher, ob dieser Namenskonflikt den IE ins Straucheln bringt.
        Der IE kennt window.stop doch gar nicht ...

        das war mir bisher nicht bewusst, danke - aber diese Wissenslücke halte ich angesichts des geringen Nutzwerts von window.stop() für unerheblich - ich wüsste jedenfalls keinen Anwendungsfall.

        So long,
         Martin

        --
        Die letzten Worte des Architekten:
        Mir fällt da gerade was ein...
        1. das war mir bisher nicht bewusst, danke - aber diese Wissenslücke halte ich angesichts des geringen Nutzwerts von window.stop() für unerheblich - ich wüsste jedenfalls keinen Anwendungsfall.

          darüber da hab ich mir auch schon oft Gedanken gemacht und bin zu keiner Antwort gekommen.

          Struppi.

          1. Hat noch jemand eine Idee zu meinem anfänglichen Problem? :)
            Lg.,
            .type

            1. Hat noch jemand eine Idee zu meinem anfänglichen Problem? :)

              Hat ich doch schon geschrieben.

              Struppi.

    2. Hallo,

      Ich erhalte folgende 2 Fehler Meldungen im IE 7: Exspected: ";" und Object exspected.

      schade, dass du nicht verrätst, für welche Zeilen diese Meldungen auftreten.

      function pc (infd,ntpc,stop){
          this.infd=infd;
          this.ntpc=ntpc;
          this.stop=stop;

      In de.selfhtml.org wird unter der Eigendefinierung von Objekten selbiges als Beispiel angeführt und der IE 7 streikt da nicht.

      while(this.stop=0){

      Hab ich verbessert.

      Habe zu den Zeilen ein Kommentar gegeben, wo die Fehlermeldung ist, habe ich vorhin natürlich vergessen :)

      function pc (infd,ntpc,stop){
          this.infd=infd;
          this.ntpc=ntpc;
          this.stop=stop;
          if(this.infd==1){
          document.write(this.ntpc," is infected! <br>");
          }

      while(this.stop=0){
            var rpn=Math.floor(Math.random()*nmc)

      pcarpn;
            }
      }

      var nrp=0;
      while(nrp<nmc){   //nmc wird schon vorher definiert, der Teil Skriptes,
                        //ist bloss für das Problem irrelevant
             var pca[nrp]= new pc(0,nrp,0);  //Hier ist der erste Fehle

      //(Exsp..)

      document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;
              nrp=nrp+1;
          }

        
      Der zweite Fehler wird ganz am Ende des Scriptes angegeben, wenn ich aber die Zeile vom ersten Fehler auskommentiere, kommt auch die zweite Fehlermeldung nicht.  
        
      lg.,  
      .type  
      
      
    3. function pc (infd,ntpc,stop){

      Vielleicht ist es keine gute Idee, einen Parameter so zu nennen wie eine Methode des window-Objekts. Ich bin mir nicht so sicher, ob dieser Namenskonflikt den IE ins Straucheln bringt.

      Wieso sollte er? IE implementiert die Scope Chain hinreichend korrekt.

      Man kann dann natürlich nicht mehr stop() schreiben, wenn man window.stop meint, sondern muss ausdrücklich window.stop schreiben. Aber das sollte man ohnehin tun.

      Darüber hinaus sehe ich kein Problempotenzial.

      Mathias

      1. Man kann dann natürlich nicht mehr stop() schreiben, wenn man window.stop meint, sondern muss ausdrücklich window.stop schreiben. Aber das sollte man ohnehin tun.

        Das ist auch unsicher, es könnte ja in der Scope Chain ein anderes window auftauchen.

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  2. ...

    var pca[nrp]= new pc(0,nrp,0);

    ...

    Ist das so überhaupt möglich oder mache ich einen (Denk-)Fehler?

    Ja, du musst zuerst pca definieren, zumindest als Objekt und dann kannst du erst eine Eigenschaft hinzufügen.

    Struppi.

    1. ...

      var pca[nrp]= new pc(0,nrp,0);
      ...
      Ist das so überhaupt möglich oder mache ich einen (Denk-)Fehler?

      Ja, du musst zuerst pca definieren, zumindest als Objekt und dann kannst du erst eine Eigenschaft hinzufügen.

      Struppi.

      Ich hab pca als Array definiert, geht das dann so?
      Lg.,
      .type

      1. Struppi.

        Bitte kein Fullqoute!

        Ich hab pca als Array definiert, geht das dann so?

        Ja, aber dann musst du das var wegmachen.

        Struppi.

        1. Struppi.

          Bitte kein Fullqoute!

          Ich hab pca als Array definiert, geht das dann so?

          Ja, aber dann musst du das var wegmachen.

          Struppi.

          Jetzt habe ich für diese Zeile einen Fehler (Hab jetzt die ganze pc funktion kopiert:)

          function pc (infd,ntpc,stop){               this.infd=infd;  
              this.ntpc=ntpc;  
              this.stop=stop;  
              if(this.infd==1){  
              document.write(this.ntpc," is infected! <br>");  
              }  
            while(this.stop==0){  
                var rpn=Math.floor(Math.random()*nmc)  
            
                pca[rpn](1,rpn,0); //Fehler: Object doesn't support this method or  
                                   //property.  
                }  
          } 
          

          Nur kruze Erklärung diese Funktion ist das Mutterobjekt und alle Objekte sollen sich gegenseitig ändern (das ist die Zeile wo der Fehler ist).

          lg.,
          .type
          PS: Danke nochmal für eure Hilfe bis jetzt :)

          1. Hi,

            Bitte kein Fullqoute!

            Was hast du an dieser Aufforderung nicht begriffen?

            pcarpn; //Fehler: Object doesn't support this method or
                                     //property.

            Du hast also im Array Funktionsreferenzen gespeichert?
            Oder was willst du an dieser Stelle aufrufen?

            Nur kruze Erklärung diese Funktion ist das Mutterobjekt und alle Objekte sollen sich gegenseitig ändern (das ist die Zeile wo der Fehler ist).

            Was dein Code eigentlich machen soll, hast du bisher immer noch nicht verstaendlich und nachvollziehbar beschrieben - das macht es ziemlich schwer, dir weiterzuhelfen.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Was hast du an dieser Aufforderung nicht begriffen?

              Es tut mir Leid, dass ich das Antwortsystem dieses Forums noch nicht verstanden habe, ich bitte um Nachsicht

              Du hast also im Array Funktionsreferenzen gespeichert?
              Oder was willst du an dieser Stelle aufrufen?

              »»Was dein Code eigentlich machen soll, hast du bisher immer noch nicht verstaendlich und nachvollziehbar beschrieben - das macht es ziemlich schwer, dir weiterzuhelfen.

              Unter PC lege ich eine Funktion fest, die in allen Objekten vorhanden sein soll. Dann erstelle ich einen Array mit Objekten, die ich mit einer while-Schleife erstelle. Jedes Objekt ist durchnummeriert (-> Daher ein Array). Die Funktion in jedem Objekt sollte nun die Werte von anderen Objekten verändern, genau das Objekt mit der Zufallszahl (-> Deswegen durchnummeriert).
              Ich hoffe jetzt ist ein bisschen klarer.

              lg.,
              .type

              1. Hi,

                Unter PC lege ich eine Funktion fest, die in allen Objekten vorhanden sein soll. Dann erstelle ich einen Array mit Objekten [...]

                Schoen und gut, aber meine Frage hast du nicht beantwortet:

                pcarpn; //Fehler: Object doesn't support this method or
                                         //property.

                Du hast also in *diesem* Array Funktionsreferenzen gespeichert?
                Oder *was* willst du an dieser Stelle *aufrufen*?

                MfG ChrisB

                --
                „This is the author's opinion, not necessarily that of Starbucks.“
                1. Du hast meine Antwort nicht genau gelesen, die Frage ist darin auch beantwortet. Im Array selbst sind einfach Objekte gespeichert. In diesen Objekten wird die Funktion "pc" ausgeführt.
                  Mit diesem Teil will ich ganz normal das aufrufen, was unter dieser Nummer nämlich der Zufallszahl rpn, gespeichert ist und ihm gleich Daten in () übermitteln.
                  Hab ich da einen Denkfehler?

                  lg.,
                  .type

                  1. Yerf!

                    Du hast meine Antwort nicht genau gelesen, die Frage ist darin auch beantwortet.

                    Das Problem ist, dass das Ganze etwas... verworren ist. Ich hatte auch probleme zu verstehen, was eingentlich passieren soll.

                    Im Array selbst sind einfach Objekte gespeichert. In diesen Objekten wird die Funktion "pc" ausgeführt.

                    In diesen Objekte wird keine Funktion ausgeführt. Sie wurden nur über den Konstruktor "pc" erstellt.

                    Mit diesem Teil will ich ganz normal das aufrufen, was unter dieser Nummer nämlich der Zufallszahl rpn, gespeichert ist und ihm gleich Daten in () übermitteln.
                    Hab ich da einen Denkfehler?

                    Ja. Du kannst an einem bestehenden Objekt nicht nochmals den Konstruktor aufrufen um es zu modifizieren. Entweder baust du ein neues Objekt oder du gibst den Objekten eine Methode mittels derer du sie modifizieren kannst und rufst diese dann auf.

                    Gruß,

                    Harlequin

                    --
                    <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                    1. Das Problem ist, dass ich kein neues Objekt erstellen kann, da die Objekte durchnummeriert sein müssen und ein zweites Objekt ja nicht mehr logisch verbunden wäre.
                      Wärest du so nett und könntest du mir ganz kurz darstellen, wie du das mit einer Methode meinst?

                      Danke im Vorraus,
                      lg.,
                      .type

                      PS: Es ist leider nicht viel einfacher zu erklären. Ich hoffe es geht trotzdem irgendwie :)

                      1. Yerf!

                        Wärest du so nett und könntest du mir ganz kurz darstellen, wie du das mit einer Methode meinst?

                        So wie du im Konstruktor Eigenschaften festlegst kannst du dort auch Funktionen anlegen, die dann zum Objekt gehören:

                        Ausgang:

                        function pc (infd,ntpc,stop){  
                            this.infd=infd;  
                            this.ntpc=ntpc;  
                            this.stop=stop;  
                            if(this.infd==1){  
                            document.write(this.ntpc," is infected! <br>");  
                            }  
                          
                          
                          while(this.stop=0){  
                              var rpn=Math.floor(Math.random()*nmc)  
                          
                              pca[rpn](1,rpn,0);  
                              }  
                        }
                        

                        Wenn ich dich richtig verstehe soll die Konstruktorfunktionalität am bestehenden Objekt nochmals ausgeführt werden:

                        function pc (infd,ntpc,stop){  
                          
                            this.modify = function (_infd,_ntpc,_stop){  
                              this.infd=_infd;  
                              this.ntpc=_ntpc;  
                              this.stop=_stop;  
                              if(this.infd==1){  
                              document.write(this.ntpc," is infected! <br>"); //hier solltest du dir noch eine andere Ausgabe überlegen  
                              }  
                              while(this.stop=0){  
                                var rpn=Math.floor(Math.random()*nmc)  
                                pca[rpn](1,rpn,0);  
                              }  
                            }  
                            this.modify(infd,ntpc,stop)  
                        }
                        

                        Wie du siehst habe ich die funktionalität in eine Methode namens Modify verlagert und nutze diese für die Initialisierung. Zu einem späteren Zeitpunkt kannst du diese folgendermaßen aufrufen:

                        objektName.modify(infd,ntpc,stop);

                        Wobei objektName in deinem Fall pca[nrp] sein müsste.

                        Beachte auch den Kommentar, ein document.write innerhalb einer Funktion zerstört dir das Dokument im Browser, das willst du sicherlich nicht... Benutze lieber ein vorhandenes Element im Dokument und ändere dessen Inhalt.

                        Gruß,

                        Harlequin

                        PS: das ganze ist ungetestet und soll vor allem das Prinzip veranschaulichen.

                        --
                        <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                        1. Obwohl es ungetest ist, hat es gut funktioniert, danke :)
                          Jetzt habe ich nur ein neues Problem, beim Aufrufen der Funktionen aus dem Array kommt jetzt, dass ein Objekt erwartet wird. Das Problem war vorher nicht da aber in deinem Vorschlag wird ja nichts am Objektauruf geändert.

                            
                          var nrp=0;  
                          var nsp=0;  
                          while(s<=hlr){  
                              while(nrp<nmc){  
                                pca[nrp]= new pc(0,nrp,0);  
                                 document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;  
                                  nrp=nrp+1;  
                              }
                          

                          lg.,
                          .type

                          1. Yerf!

                            Jetzt habe ich nur ein neues Problem, beim Aufrufen der Funktionen aus dem Array kommt jetzt, dass ein Objekt erwartet wird. Das Problem war vorher nicht da aber in deinem Vorschlag wird ja nichts am Objektauruf geändert.

                            Hm, im geposteten Code führst du eigentlich keine Funktion aus, sondern erstellst nur neue Objekte. An welcher Stelle genau tritt der Fehler auf?

                            Tipp: Teste im FireFox, dessen Fehlerkonsole (im Menü unter Extras) liefert genauere Meldungen.

                            Gruß,

                            Harlequin

                            --
                            <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
                            1. In den beiden Zeilen:

                              pca[nrp]= new pc(0,nrp,0);  
                                     document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;
                              

                              Sry meinte Objekt.

                              lg.,
                              .type

                              1. Hallo .type,

                                pca[nrp]= new pc(0,nrp,0);

                                document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;

                                  
                                warum liegt pca einmal unter document, und einmal nicht?  
                                  
                                Gruß, Jürgen  
                                
                                
                                1. Yerf!

                                  pca[nrp]= new pc(0,nrp,0);

                                  document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;

                                  
                                  >   
                                  > warum liegt pca einmal unter document, und einmal nicht?  
                                    
                                  Das ist so ein Punkt, den ich mir auch schon die ganze zeit überlege. Aber sie 2 Arrays speichern unterschiedliche Dinge, weshalb es Absicht sein könnte. Die Frage ist nur, hat der OP beide Arrays zuerst als new Array() erzeugt oder nur eines davon? Oder sollte das doch nur ein Array sein? Dann sieht aber die 2. zeile mit der Zuweisung seltsam aus, da hier das Objekt durch eine zahl ersetzt werden würde...  
                                    
                                    
                                  Gruß,  
                                    
                                  Harlequin  
                                    
                                  
                                  -- 
                                  <!--[if IE]>This page is best viewed with a webbrowser. [Get one today!](http://www.opera.com)<![endif]-->
                                  
                                  1. Da liegt mein Denkfehler, danke :)
                                    Habe die zweite Zeile gelöscht und sie da es funktioniert ohne Fehlermeldung.

                                    Danke für all eure Hilfe :)

                                    lg.,
                                    .type

                            2. Habs jetzt auch mit Firexfox getest die Fehler-Konsole sagt nicht mehr bzw. das gleiche aus.

                              lg.,
                              .type

                  2. Hi,

                    Du hast meine Antwort nicht genau gelesen, die Frage ist darin auch beantwortet.

                    Wenn du das meinst, dann hast du meine Frage wohl nicht verstanden.

                    Im Array selbst sind einfach Objekte gespeichert. In diesen Objekten wird die Funktion "pc" ausgeführt.

                    Nein.

                    MfG ChrisB

                    --
                    „This is the author's opinion, not necessarily that of Starbucks.“
              2. Unter PC lege ich eine Funktion fest, die in allen Objekten vorhanden sein soll.

                Du erstellst eine Funktion pc, das ist korrekt. Sie soll in allen Objekten sein. Das macht dein Code aber nicht, stattdessen ruft er die Funktion als Konstruktor auf.

                Dann erstelle ich einen Array mit Objekten, die ich mit einer while-Schleife erstelle.

                Richtig, die Objekte im Array sind aber keine Funktionen, sondern Objekte, die durch pc konstruiert wurden (siehe oben).

                Jedes Objekt ist durchnummeriert (-> Daher ein Array). Die Funktion in jedem Objekt sollte nun die Werte von anderen Objekten verändern, genau das Objekt mit der Zufallszahl (-> Deswegen durchnummeriert).

                Die Objekte enthalten keine Funktionen. Solltest du seit gestern eigentlich wissen!

                Ich hoffe jetzt ist ein bisschen klarer.

                Klar ist vor allem: Beschäftige dich mit OOP in JavaScript. Vielleicht hilft ja schon <http://de.selfhtml.org//javascript/sprache/objekte.htm@title=Objekte, Eigenschaften und Methoden>.

                --
                Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
  3. while(this.stop=0){

    Dazu wurde ja schon was geschrieben.

    pca[rpn](1,rpn,0);

    Was hast du dir bei dieser Konstruktion gedacht? Wenn ich das richtig sehe, enthält pca[rpn] keine Funktion, also sollte der Aufruf fehlschlagen (passiert allerdings nicht, wegen der dysfunktionalen while-Schleife).

    document.pca[nrp]=pca[nrp].infd + pca[nrp].ntpc + pca[nrp].stop;

    Hältst du es für klug, an document etwas anzuhängen in dieser Art?

    Ich möchte im Endeffekt eine while-Schleife haben, die mir eine gewisse Anzahl von Objekten erstellt und einen Inhalt, die dieses Objekt gleich verarbeitet.
    Ich erhalte folgende 2 Fehler Meldungen im IE 7: Exspected: ";" und Object exspected.

    Hast du eine Konstruktion wie
    var x[y]=z;
    noch irgendwo im Code? Ist nämlich ungültig! Korrekt wären beispielsweise
    var x={y:z};
    oder

    var x=new Foo();  
    x[y]=z;
    
    --
    Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
    Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|