Alex-_-_-91: Array aus einer Function abrufen (JS)

Moin zusammen,

ich versuche gerade ein Script zuschreiben, indem ich mehrere Unterfunktionen habe, welche bestimmte Werte auslesen sollen. Hier wird zum Beispiel eine Drehzahl einer Welle ausgelesen und in n gespeichert..

function get_rpm()
{
	var n = new Array();  //  Drehzahlen
	for (i=0;i<wellen.length;i++) {
		n[i] = getAttr('nominal rotational speed', wellen[i], RDAT);
	}
	return n;
}

Wie kann ich nun auf n außerhalb der Funktion zugreifen? Bzw ein einzelnes Array von n ansprechen? [Falls nötig, Kleine Erklärung: getAttr('benötigte Attribut', 'Komponenten-ID', RAD für READ)]

  1. Hallo,

    function get_rpm()
    {
    	var n = new Array();  //  Drehzahlen
    	for (i=0;i<wellen.length;i++) {
    		n[i] = getAttr('nominal rotational speed', wellen[i], RDAT);
    	}
    	return n;
    }
    

    Wie kann ich nun auf n außerhalb der Funktion zugreifen? Bzw ein einzelnes Array von n ansprechen?

    mit

    var ergebnis = get_rpm();
    

    kommst du an das, was die Funktion zurückgibt (return).

    Gruß
    Jürgen

    1. Hi, danke für eure schnellen Antworten. Gibt es keine andere möglichkeit die einzelnen Werte anzusprechen, außer diese in extra angelegte Variablen zu packen?

      Ich habe das Problem, dass die Umgebung, in der ich den Code ausführen möchte, eine bestimmte Grenze besitzt was den ByteCode angeht.

      Ich werde es erstmal so versuchen, in der Hoffnung, dass die Variablen das alles nicht zu sehr aufpusten (der Code ist schon etwas länger - weshalb ich auch jetzt erst von der Grenze erfahren habe 😂). Abhilfe sollen Unterfunktionen verschaffen, sowie möglichst wenige/keine globalen Variablen.

      Gibt es hier noch andere möglichkeiten n abzufragen?

      PS: Oder habe ich auf diese Weise bereits eine gewisse Ersparnis, da ich die Funktion nun extern deklariert habe und die Rechnung der for-Schleife nun nicht mehr in der Eigentlichen bzw. Haupt-Umgebung/Funktion abläuft?

      1. Hallo

        Hi, danke für eure schnellen Antworten. Gibt es keine andere möglichkeit die einzelnen Werte anzusprechen, außer diese in extra angelegte Variablen zu packen?

        Nein. Eine Funktion tut etwas und stellt, wie hier, eventuell einen Rückgabewert bereit. That's it, erst einmal.

        Variablen, die in einer Funktion mit var n deklariert werden, stehen auch nur in ihr zur Verfügung. Du könntest, solltest aber nicht, die Variable ohne das Schlüsselwort var deklarieren (n = 'irgendwas';). Der Wert steht dir dann auch außerhalb der Funktion zur Verfügung. Allerdings steht er dir dann auch außerhalb zur Verfügung. Der Wert einer vorher außerhalb der Funktion deklarierte Variable würde überschrieben. Eine spätere Deklarierung der Variablen n außerhalb der Funktion würde zu einem Fehler führen. Später, auerßhalb der Funktion zugewiesene Werte für n würden den aus der Funktion stammenden Wert überschreiben ….

        Das will man alles nicht, selbst wenn das in einem kurzen Skript behandelbar bleibt. Irgendwann schlägt eines der oben beschriebenen Szenarien oder ein anderes zu und man beginnt, sich einen Wolf zu suchen, um die Ursache zu ermitteln.

        Ich habe das Problem, dass die Umgebung, in der ich den Code ausführen möchte, eine bestimmte Grenze besitzt was den ByteCode angeht.

        Einen Variablennamen um den Preis möglicher neuer Fehler einsparen zu wollen, ist mMn Unfug. Wo liegen denn überhaupt die Grenzen und nach welchen Kriterien sind sie definiert?

        PS: Oder habe ich auf diese Weise bereits eine gewisse Ersparnis, da ich die Funktion nun extern deklariert habe und die Rechnung der for-Schleife nun nicht mehr in der Eigentlichen bzw. Haupt-Umgebung/Funktion abläuft?

        Die Funktion wird ja im aufrufenden Skript verwendet. Sie ist bei ihrer Ausführung also diesem zuzuschlagen. Wird sie an mehreren Stellen benutzt, spart sie aber Dateigröße. Inwieweit das einen relevanten Einfluss auf die Größe des Gesamtskripts im RAM hat, kann ich nicht beurteilen.

        Tschö, Auge

        --
        Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
        Toller Dampf voraus von Terry Pratchett
        1. Zu den Grenzen: der eingebaute JavaScript Interpreter in der von mir Verwendeten Umgebung erlaubt max. 64KB für die Anzahl der Instruktionen einer Methode.

          Konsequenz: wenn für eine Script-Funktion mehr als 64K Bytecode erzeugt wird, tritt eine Fehlermeldung auf, dass der Code nicht ausgeführt werden kann (weil dieser eben eine Grenze überschreitet).

          1. Hallo Alex,

            das klingt irgendwie nach den Speichermodellen aus der schlechten alten 16-Bit Zeit. Für die richtige Optimierung ist die Frage nun, wie dein Speichermodell genau aussieht.

            • Wieviel RAM hast Du insgesamt?
            • Müssen sich Bytecode und Arbeitsobjekte (=Variableninhalte) diesen RAM teilen?
            • Hast Du 64KB Bytecode für alle Funktionen zusammen (Modelle small/compact) oder 64KB Bytecode für jede Funktion einzeln (Modelle medium/large/huge)?
            • Ist dein Variablenspeicher auf 64KB begrenzt (Modelle small/medium) oder darf eine einzelne Variable maximal 64KB enthalten (Modelle compact/large) oder dürfen Variablen auch größer als 64KB sein (Modell huge)?

            Abgesehen davon… Du schreibst:

            Hier wird zum Beispiel eine Drehzahl einer Welle ausgelesen und in n gespeichert..

            Nein. Du liest die Drehzahlen aller Wellen und speicherst sie als Array in n. Wenn du das musst - ok, dann musst Du das. Die Frage ist, was Du damit dann weiter machst. Die von Jürgen vorgeschlagene Speicherung der Rückgabe

            var ergebnis = get_rpm();

            kostet erstmal kaum Speicher, weil das Array nicht kopiert wird. get_rpm liefert ein JavaScript-Array zurück, das ist erstmal nur ein Objekt. Würdest Du es nicht speichern, kannst Du damit auch nichts tun. Und wenn der Aufrufer von get_rpm seinerseits in einer Funktion liegt, dann lebt das Array nicht länger als die aufrufende Funktion.

            Natürlich kann es sein, dass deine Umgebung eine andere Speicherverwaltung hat als wir es aus dem Browser kennen. Dafür wäre es gut zu wissen, was genau Du da hast. Kann man Infos dazu im Netz finden?

            Code sparen kannst Du auch, wenn Du für Standardaufgaben fertige Methoden deiner Laufzeitumgebung verwendest. Dazu müsstest Du wissen, welche JavaScript-Funktionen bereit stehen. Neuere JavaScripts kennen z.B. eine .map Methode auf Arrays, dann brauchst Du die for-Schleife nicht selbst zu programmieren und die Übertragung in ein Array auch nicht. Statt dessen schreibst Du einfach

            return wellen.map(function(w) { return getAttr("nominal rotational speed", w, RDAT); });

            oder - wenn dein JS bereits Pfeilfunktionen versteht

            return wellen.map(w => getAttr("nominal rotational speed", w, RDAT));

            Rolf

            --
            sumpsi - posui - clusi
            1. Hallo Rolf,

              danke für deinen Beitrag!

              Die Umgebung die ich zur Ausführung des Scriptes nutze ist eigentlich ein Konstruktions/Berechnungs Programm für den Maschinenbau, welches - gütigerweise muss man schon fast sagen - erlaubt eigene Skripte auszuführen. Das skript, das ich geschrieben habe bzw schreiben möchte soll im Grunde nur die Rechnenkerne des Programms starten, die Ergebnisse abrufen und in einer HTML Datei schön ordentlich gegliedert wiedergeben.

              Im letzten Skript Abschnitt (bei der Ausgabe) läuft es anscheinend über die bereits genannte Grenze. So kann ich leider auch nicht genau beurteilen, welches Speichermodell hier vorliegt. Ich gehe jedoch davon aus, dass die gesamt Variablenmenge die Berenzung darstellt - da ich schon sehr viele Werte abrufe, habe ich auch dementsprechend viele Variablen.

              PS: Ich hatte vorher wohl auch einen Fehler, wodurch die Ausgaben nicht als For-Schleifen programmiert werden konnten (bin nicht vom Fach, kann daher garnicht genau sagen was der Fehler war 😂, jedoch habe ich durch änderung des Zählerinkrements von i auf k das Problem gelöst (for(k=0;...)) dadurch kann ich nicht nur gewaltig viele Zeilen entfernen, sondern evt. auch einige Variablen, wodurch ich nun auch mit den Unterfunktionen hoffentlich unter die Grenze rutsche

              1. Tatsache, es funktioniert schon 😂 Vielen Dank für eure Antworten und Hilfe

                Gruß, Alex

  2. Hallo,

    Wie kann ich nun auf n außerhalb der Funktion zugreifen?

    Es handelt sich um eine Funktion mit Rückgabewert.

    Gruß
    Kalk

  3. Mahlzeit,

      n[i] = getAttr('nominal rotational speed', wellen[i], RDAT);
    

    ich würde das wellen-Array entsprechend erweitern. D.h., der Funktion das Array übergeben und danach ist es erweitert um die gewünschten Eigenschaften. Die Struktur des Arrays wellen könnte so aussehen:

    wellen = [{attribute:value}, {}..]

    MfG