roger: Variablen aus Text erzeuegen

Hallo,

ich möchte gerne eine Funktion schreiben die mir aus einem Zahlenwert pro Bitstelle eine Variable generiert. Der Variablenname wird als "Text" übergeben.

So soll z.B. der Aufruf sein.~~~javascript

bin32Bit(value,"varnamebit0","varnamebit1","varnamebit2",...);

  
1\. wie muss ich es machen damit ich die Variablen erzeugen kann.  
2\. wie stelle ich es an damit die Variablen auch außerhalb der Funktion/Global verfügbar sind.... wenn überhaupt möglich ??  
  
     Gruß  
    roger  
  
  
  

  1. hi,

    mh dynamische variablen in js? ansich noch nix von gehört
    am besten du löst es mit ein globalen array :) würde mir spontan einfallen

    hoffe es hilft dir

    1. Hallo,

      ich möchte gerne mit den Variablen weiterarbeiten. Damit ich die einzelnen "bits" leichter identifizieren kann, wäre ein Name einfacher.

      Somit hätte jedes Bit einen eigenen Namen.
      Wenn ich ein Array nehmen habe ich wieder Bit0...Bit32. Sollte einmal die Adressierung geändert werden muss ich das komplette Programm ändern. Wenn die Bits Namen haben brauche ich nur die Zuweisung Bit->Name ändern.

      Gruß
               roger

      1. Hi,

        ich möchte gerne mit den Variablen weiterarbeiten. Damit ich die einzelnen "bits" leichter identifizieren kann, wäre ein Name einfacher.

        Nein, das wäre nicht einfacher - weil du dann für jeden Zugriff den Namen erst mal zusammenbasteln musst.

        Wenn ich ein Array nehmen habe ich wieder Bit0...Bit32.

        Nein, hast du nicht.

        Du weisst offenbar noch gar nicht, wie man mit Arrays umgeht - deshalb schlage ich vor, du informierst dich mal: http://de.selfhtml.org/javascript/objekte/array.htm#allgemeines

        Sollte einmal die Adressierung geändert werden muss ich das komplette Programm ändern.

        Warum sollte sich die Adressierung ändern?

        Wenn die Bits Namen haben brauche ich nur die Zuweisung Bit->Name ändern.

        Und wie und wo willst du das machen, wenn dein Script an zig Stellen auf eine Variable namens Bit4711 zugreift?

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
  2. Lieber roger,

    was ist Dein eigentliches Problem, das Du auf diese Weise lösen willst? Vielleicht ist Dein hier vorgestellter Ansatz ja unnötig kompliziert...?

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. @@roger:

    nuqneH

    1. wie muss ich es machen damit ich die Variablen erzeugen kann.

    Mit <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=Schema 4>.

    1. wie stelle ich es an damit die Variablen auch außerhalb der Funktion/Global verfügbar sind.... wenn überhaupt möglich ??

    Globale Variablen sind in JavaScript Eigenschaften des window-Objekts.

    In einer Schleife gehst du die http://de.selfhtml.org/javascript/objekte/function.htm#arguments@title=Argumente durch:

    function bin32Bit(value)  
    {  
      for (var i = 1; i < arguments.length; i++,)  
        window[arguments[i]] =;  
    }
    

    Für die … dürften die http://de.selfhtml.org/javascript/sprache/operatoren.htm@title=Operatoren & und >> (>>=) für dich interessant sein.

    Qapla'

    --
    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
    1. Morgen,

      das ist genau das was ich will, obwohl ich es nicht ganz verstehe.
      Bitte korrigiert mich falls ich falsch liege.
      z.B.

        
      function bin32Bit(value)  
      {  
      // beginne bei 1 weil argument 0 mein Zahlenwert ist  
      // ab 1 sind dann meine "Varnamen"  
        
        for (var i = 1; i < arguments.length; i++,)  
          window[arguments[i]] = bitzustand_aus_anderer_funktion;  
        
      // window[arguments[i]] hier die übergebenen Namen "varname"  
      // an das window-objekt plus Zustand der neue variable, damit diese global // sind.  
      }  
      
      

      Ist das so richtig. ??

      Frage 1:
      es wird zyklisch aufgerufen. Muss ich abfragen ob das x.y window objekt schon vorhanden ist oder wird es nur einmal erzeugt, wenn nicht vorhanden und dann später nur noch beschrieben... so denke ich ?

      Frage 2:
      Der Aufruf der Funktion würde dann z.B. so bei mir aussehen

      bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)

      Natürlich frage ich auf "" ab... vor dem window[argu...]

      Das wäre für mich eine super Lösung.

      Danke,Danke
               roger

      1. @@roger:

        nuqneH

        // beginne bei 1 weil argument 0 mein Zahlenwert ist
        // ab 1 sind dann meine "Varnamen"

        for (var i = 1; i < arguments.length; i++, …)

        Richtig.

        window[arguments[i]] = bitzustand_aus_anderer_funktion;

        // window[arguments[i]] hier die übergebenen Namen "varname"
        // an das window-objekt plus Zustand der neue variable, damit diese global // sind.

        Verstehe nicht ganz, was du sagen willst.

        bitzustand_aus_anderer_funktion?? Du willst ganz einfach Bits maskieren. Deshalb hatte ich dich auf den &-Operator hingewiesen.

        Und wenn du in der Schleife value bitweise verschiebst, brauchst du nur immer dasselbe Bit. Deshalb hatte ich dich auf den >>-Operator hingewiesen. (Dies würde ich an der Stelle der … in for tun.

        es wird zyklisch aufgerufen. Muss ich abfragen ob das x.y window objekt schon vorhanden ist oder wird es nur einmal erzeugt, wenn nicht vorhanden und dann später nur noch beschrieben... so denke ich ?

        Das windows-Objekt ist immer vorhanden; da musst du gar nichts abfragen.

        Der Aufruf der Funktion würde dann z.B. so bei mir aussehen

        bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)

        Natürlich frage ich auf "" ab... vor dem window[argu...]

        Es sind nicht alle Bits von value für dich intersessant? Ja, dann:

        if (arguments[i]) window[arguments[i]] =;

        Dann könnte der Funktionaaufruf auch so aussehen:

        bin32Bit(42, "namefuerbit0", "namefuerbit1", null, "namefuerbit3");

        oder so:

        bin32Bit(42, "namefuerbit0", "namefuerbit1", false, "namefuerbit3");

        Das wäre für mich eine super Lösung.

        Na, dann fülle mal die … mit Leben!

        Qapla'

        --
        Volumen einer Pizza mit Radius z und Dicke a: pi z z a
      2. Der Aufruf der Funktion würde dann z.B. so bei mir aussehen

        bin32Bit(Zahl,"namefuerbit0","namefuerbit1","","namefuerbit3"... usw)

        Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?

        Das wäre für mich eine super Lösung.

        Naja, globale Variabeln sind alles andere als super

        Struppi.

        1. @@Struppi:

          nuqneH

          Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?

          Das sagte er doch: Er möchte sprechende Namen für die Bits.

          Naja, globale Variabeln sind alles andere als super

          Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten:

          myBits = {};

          In der Funktion dann:

          if (arguments[i]) myBits[arguments[i]] =;

          Qapla'

          --
          Volumen einer Pizza mit Radius z und Dicke a: pi z z a
          1. @@Gunnar Bittersmann:

            nuqneH

            Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
            In der Funktion dann: […]

            Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des windows-Objekts sein sollte, sondern Methode des myBits-Objekts:

            myBits = {};  
            myBits.bin32Bit = function(value)  
            {};
            

            oder anders notiert:

            myBits = {  
              this.bin32Bit = function(value)  
              {};  
            };
            

            Einen passenderen Namen als "bin32Bit" sollte die Methode auch bekommen; "refresh" dürfte sich anbieten.

            Und für "myBits" fällt dir sicher auch ein besserer Name ein.

            Qapla'

            --
            Volumen einer Pizza mit Radius z und Dicke a: pi z z a
            1. Abend,

              Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
              In der Funktion dann: […]

              Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des windows-Objekts sein sollte, sondern Methode des myBits-Objekts:

              myBits = {

              this.bin32Bit = function(value)
                {
                  …
                };
              };

              Das verstehe ich nicht. Wie soll in der Funktion x.[arguments[i]] aussehen ??  
                
                   Gruß  
                  roger
              
              1. @@roger:

                nuqneH

                myBits = {

                this.bin32Bit = function(value)
                  {
                    …
                  };
                };

                
                > Das verstehe ich nicht. Wie soll in der Funktion x.[arguments[i]] aussehen ??  
                  
                Ähm: <http://de.selfhtml.org/javascript/objekte/elements.htm#allgemeines@title=Schema 4>.  
                  
                Was soll der `.`{:.language-javascript}-Operator da?  
                  
                Entweder sprichst du eine Objekteigenschaft per `Objekt.Eigenschaft`{:.language-javascript} an oder per `Objekt["Eigenschaft"]`{:.language-javascript}. Wenn "Eigenschaft" nicht fest ist, sondern in einer Variablen `String`{:.language-javascript}, bleibt nur die zweite Variante:  
                ~~~javascript
                var String = "Eigenschaft";  
                Objekt[String] = …;
                

                Geben wir den Dingern mal gleich sprechende Namen: myBits → flags, bin32Bit → refresh.

                Dann sieht das so aus:

                flags = {  
                  var thisObj = this;  
                  
                  refresh = function(value)  
                  {  
                    for  (var i = 1; i < arguments.length; i++,)  
                      thisObj[arguments[i]] =;  
                  };  
                };  
                  
                flags.refresh(42, "foo", "bar", null, "baz");  
                
                

                thisObj ist nötig, weil sich this innerhalb von refresh nicht auf das flags-Objekt beziehen würde, sondern auf das refresh-Funktionsobjekt.

                Falls du mehrere Instanzen dieses Objekts brauchen solltest, sieht das dann so in etwa aus:

                function Flags()  
                {  
                  var thisObj = this;  
                  
                  refresh = function(value)  
                  {  
                    for  (var i = 1; i < arguments.length; i++,)  
                      thisObj[arguments[i]] =;  
                  };  
                };  
                  
                flags1 = new Flags();  
                flags1.refresh(42, "foo", "bar", null, "baz");  
                  
                flags2 = new Flags();  
                flags2.refresh(43, "foo", "bar", null, "baz");
                

                Qapla'

                --
                Volumen einer Pizza mit Radius z und Dicke a: pi z z a
                1. Hallo,

                  Dann sieht das so aus:

                  flags = {

                  var thisObj = this;

                  dann aber refresh ohne var?

                  refresh = function(value)
                    {
                      for  (var i = 1; i < arguments.length; i++, …)
                        thisObj[arguments[i]] = …;
                    };

                    
                  Es sollte vielleicht heißen:  
                    
                  ~~~javascript
                       function refresh (value)  
                  
                  >   {  
                  >     for  (var i = 1; i < arguments.length; i++, …)  
                  >       thisObj[arguments[i]] = …;  
                  >   };  
                  
                  

                  oder eher:

                       this.refresh = function (value)  
                  
                  >   {  
                  >     for  (var i = 1; i < arguments.length; i++,)  
                  >       thisObj[arguments[i]] =;  
                  >   };  
                  
                  

                  Gruß, Don P

                  1. @@Don P:

                    nuqneH

                    this.refresh = function (value)

                    Ja, so dachte ich das; ich hatte 'this.' vergessen. Das ist aber im Objekt-Literal falsch, wie Struppi sagte.

                    Also:

                    flags = {  
                      refresh: function(value)  
                      {  
                        for  (var i = 1; i < arguments.length; i++,)  
                          if (arguments[i]) flags[arguments[i]] =;  
                      };  
                    };
                    

                    Im Konstruktor wäre es richtig:

                    function Flags()  
                    {  
                      var thisObj = this;  
                      
                      this.refresh = function (value)  
                      {  
                        for (var i = 1; i < arguments.length; i++,)  
                        if (arguments[i]) thisObj[arguments[i]] =;  
                      }  
                    };
                    

                    Qapla'

                    --
                    Volumen einer Pizza mit Radius z und Dicke a: pi z z a
            2. Ja, es dürfte besser sein, die Dinger in einem eigenen (globalen) Objekt zu halten: […]
              In der Funktion dann: […]

              Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des windows-Objekts sein sollte, sondern Methode des myBits-Objekts:

              Oder des String Objektes, wenn value ein String ist.

              oder anders notiert:

              myBits = {

              this.bin32Bit = function(value)
                {
                  …
                };
              };

                
              Nein, du meinst:  
              ~~~javascript
              myBits = {  
                 bin32Bit: function(value)  
                 {  
                   …  
                 }, ....  
                
              };
              

              Struppi.

              1. @@Struppi:

                nuqneH

                Wobei die Funktion dann auch nicht frei im Raum rumhängen sollte, also nicht Methode des windows-Objekts sein sollte, sondern Methode des myBits-Objekts:

                Oder des String Objektes, wenn value ein String ist.

                Eher nicht.

                Nein, du meinst:

                myBits = {

                bin32Bit: function(value)
                   {
                     …
                   }, ....

                };

                  
                Ja, hast recht.  
                  
                Wofür sollte ', ....' stehen?  
                  
                Qapla'
                
                -- 
                Volumen einer Pizza mit Radius z und Dicke a: pi z z a
                
                1. Wofür sollte ', ....' stehen?

                  Das da noch mehr Einträge stehen könnten.

                   myBits = {  
                      bin32Bit: function(value)  
                      {},  
                      bin16Bit:function(value)  
                      {},  
                  // usw.  
                   };  
                  
                  

                  Wenn man dafür schon ein eigenes Objekt bemühen möchte.

                  Struppi.

          2. Das sieht nicht sinnvoll aus. Wieso willst du kein Array verwenden?

            Das sagte er doch: Er möchte sprechende Namen für die Bits.

            Das ist Unsinn. Was ist an bit0 "sprechender" als an bit[0]? Das hat nur Nachteile.

            Struppi.

            1. @@Struppi:

              nuqneH

              Das sagte er doch: Er möchte sprechende Namen für die Bits.

              Das ist Unsinn. Was ist an bit0 "sprechender" als an bit[0]?

              Natürlich nichts. Ich hatte roger aber so verstanden, dass die Namen gar nicht die Numerierung der Bits enthalten sollen.

              Die von ihm beispielhaft angeführten "varnamebit0", "varnamebit1", "varnamebit2", … waren diesbezüglich verwirrend. Besser wären "foo", "bar", "baz", … gewesen. Oder gleich das, was diese Flags bezeichen.

              Qapla'

              --
              Volumen einer Pizza mit Radius z und Dicke a: pi z z a
              1. Die von ihm beispielhaft angeführten "varnamebit0", "varnamebit1", "varnamebit2", … waren diesbezüglich verwirrend. Besser wären "foo", "bar", "baz", … gewesen. Oder gleich das, was diese Flags bezeichen.

                Jetzt verstehe ich's.

                Dann ist ein Objekt am sinnvollsten.

                function parseByte(byte) {  
                    // prüfen ob byte ein gültiger Wert ist  
                    return {  
                       x: byte & 1,  
                       y: byte & 2,  
                       status: byte & 3,  
                       // usw. ...  
                    }  
                }  
                
                

                Struppi.

                1. @@Struppi:

                  nuqneH

                  Dann ist ein Objekt am sinnvollsten.

                  Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion parseByte(byte) erzeugen, sondern diese Funktion als Methode des Objekts implementieren.

                  status: byte & 3,

                  Du meintest 4?

                  Qapla'

                  --
                  Volumen einer Pizza mit Radius z und Dicke a: pi z z a
                  1. Dann ist ein Objekt am sinnvollsten.

                    Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion parseByte(byte) erzeugen, sondern diese Funktion als Methode des Objekts implementieren.

                    Ich nicht, das Object Objekt sollte nur zur Not verändert werden.

                    status: byte & 3,

                    Du meintest 4?

                    Stimmt.

                    Struppi.

                    1. @@Struppi:

                      nuqneH

                      Ja. Ich würde dieses aber nicht als Rückgabewert einer Funktion parseByte(byte) erzeugen, sondern diese Funktion als Methode des Objekts implementieren.

                      Ich nicht, das Object Objekt sollte nur zur Not verändert werden.

                      Nein, ich meinte nicht eine Methode des Object-Objekts, sondern eine Methode des eigenen Objekts (Flags?).

                      Qapla'

                      --
                      Volumen einer Pizza mit Radius z und Dicke a: pi z z a