last-variable in interner Funktion

  • Nachdem ich das Variablenkonzept einigermassen verstanden hatte (siehe meine Frage zu implizit / explizit) ist mir nun doch wieder etwas unklar.

    Beim Aufruf einer internen Funktion übergebe ich als ersten Parameter eine Variable vom Typ clip. Wenn ich diese Variable nicht angebe wird automatisch die Variable last an die Funktion übergeben.

    Nun frage ich mich wie innerhalb der aufgerufenen Funktion mit der Variable last umgegangen wird.

    Wird diese mit der ersten übergebenen clip-Variable gleichgesetzt?

    Was passiert, wenn ich keine clip-Variable übergebe und auch keine in den Übergabeparametern angegeben ist?
    Ist sie dann initial oder wird sie vielleicht mit der last-Variable der übergeordneten Ebene gefüllt?

    Die betroffene Funktion sieht im aktuellen Entwicklungsstand so aus und soll eigentlich nur dazu dienen das nachschärfen von Testvideos bezüglich Qualität, Codierungslaufzeit und Dateigröße zu untersuchen:

    Ob die Funktion so läuft ist noch offen, vor allem wegen dem letzten Befehl mit mergechroma, der ja automatisch last ziehen sollte, falls ich das richtig verstanden habe. Und daraus entstand dann meine Frage.

    Beste Grüße Michael

    Einmal editiert, zuletzt von Mike99 (25. Februar 2009 um 04:59)

  • Ich glaube nicht, dass die Funktion so läuft, wenn die geschweiften Klammern fehlen.

    Des weiteren hast du vergessen, dass es zwei gleichwertige Formate gibt, Funktionen auf Clips anzuwenden:

    a) ErgebnisClip = MergeChroma(LumaClip, ChromaClip)

    b) ErgebnisClip = LumaClip.MergeChroma(ChromaClip)

  • Hallo Ligh,

    die Klammern habe ich mal noch nachgetragen, danke für den Hinweis.

    Die Funktion ist aber sowieso noch nicht ganz fertig, mit der Kämpfe ich auch inhaltlich noch:huh:.

    Bezüglich mergechroma ging es mir nur darum, dass mergechroma(clip1) identisch sein sollte zu mergchroma(last, clip1) zu last = mergechroma(last, clip1) zu last = last.mergechroma(clip1). Analog müsste dann FSC = shrp.mergechroma(smA) identisch sein zu FSC = shrp.mergechroma(last, smA).

    Und in dem Moment als ich darüber nachdachte fiel mir auf, dass mir dieser generelle Umgang mit last bzw. deren Inhalt in der aufgerufenen Funktion noch nicht verständlich ist, daher die Fragen.

    Beste Grüße Michael

  • Bezüglich mergechroma ging es mir nur darum, dass mergechroma(clip1) identisch sein sollte zu mergchroma(last, clip1) zu last = mergechroma(last, clip1) zu last = last.mergechroma(clip1).

    So weit noch richtig...

    Analog müsste dann FSC = shrp.mergechroma(smA) identisch sein zu FSC = shrp.mergechroma(last, smA).

    Nein.

    "FSC = shrp.mergechroma(smA)" entspricht "FSC = mergechroma(shrp, smA)"; mehr nicht.

    "last" kommt nur ins Spiel, wenn du bei zwei erwarteten Clips nur einen Clip (den zweiten) explizit angibst, aber in deinem Beispiel hast du beide angegeben.

  • So weit noch richtig...


    Nein.

    "FSC = shrp.mergechroma(smA)" entspricht "FSC = mergechroma(shrp, smA)"; mehr nicht.

    "last" kommt nur ins Spiel, wenn du bei zwei erwarteten Clips nur einen Clip (den zweiten) explizit angibst, aber in deinem Beispiel hast du beide angegeben.

    Da hasst Du natürlich recht, es war wohl noch ein wenig früh heute morgen:hm:.

    Was mich aber im Moment noch am meisten interessieren würde ist die Frage, ob innerhalb der aufgerufenen Funktion die Variable last dann mit der ersten clip-Variable aus dem Funktionsaufruf belegt wird oder ev. sonstwie?

  • Innerhalb der Funktion ist die Variable "last" zunächst lokal undefiniert. Wenn du eine Funktion aufrufst, ohne deren Ergebnis einer Clip-Variablen zuzuweisen, dann wird die lokale Variable "last" innerhalb der Funktion das Ergebnis übernehmen.

  • Innerhalb der Funktion ist die Variable "last" zunächst lokal undefiniert. Wenn du eine Funktion aufrufst, ohne deren Ergebnis einer Clip-Variablen zuzuweisen, dann wird die lokale Variable "last" innerhalb der Funktion das Ergebnis übernehmen.

    Das sorgt für Klarheit, danke.

    Ersteres hatte ich fasst erwartet, letzteres nicht unbedingt.
    Wenn die lokale Variable last den Wert in diesem Fall zugewiesen bekommt, dann müsste sie sich aber anschließend, da nur lokal und Funktion beendet, sozusagen in Luft auflösen.

    Eigentlich schade, dass es hierfür keine Entwicklungsumgebung mit Debugger gibt, da könnte man das alles schön zur Laufzeit analysieren. Allerdings muss ich auch zugeben, dass mir Script- und Makrosprachen schon immer ein wenig suspekt waren.

  • Jede Variable hat ihren Geltungsbereich.

    Die Deklaration einer Funktion ist abstrakt. Da sie mehrfach aufgerufen werden könnte, ist es im Allgemeinen sinnvoll, Daten (Clips, Zahlen, Texte) als Parameter zu übergeben und Ergebnisse als Funktionswert zu hinterlassen.

    Globale Variablen, die auch in den Funktionen ihre Gültigkeit haben, sind in AviSynth auch möglich. Jedoch muss man dann sehr genau aufpassen, dass diese Konstruktion dann auch in jedem Zusammenhang funktioniert. Es kann nötig sein, wenn durch eine Funktion mehrere Werte geändert zurückgegeben werden müssen, da AviSynth keine Felder kennt.

  • Jede Variable hat ihren Geltungsbereich.

    Die Deklaration einer Funktion ist abstrakt. Da sie mehrfach aufgerufen werden könnte, ist es im Allgemeinen sinnvoll, Daten (Clips, Zahlen, Texte) als Parameter zu übergeben und Ergebnisse als Funktionswert zu hinterlassen.

    Globale Variablen, die auch in den Funktionen ihre Gültigkeit haben, sind in AviSynth auch möglich. Jedoch muss man dann sehr genau aufpassen, dass diese Konstruktion dann auch in jedem Zusammenhang funktioniert. Es kann nötig sein, wenn durch eine Funktion mehrere Werte geändert zurückgegeben werden müssen, da AviSynth keine Felder kennt.

    Letzteres hat mich am Anfang mindestens mal eine Stunde aufgehalten, bis ich festgestellt habe, dass es avsi-files gibt die automatisch laden und eine davon jene besagten Glabalvariablen enthielt, wird sicher nicht das letzte Rätsel gewesen sein ....

  • Daher auch die Empfehlung, Plugins und Skriptfunktionen lieber nicht direkt in das Autoload-Verzeichnis "AviSynth 2.5\plugins" zu speichern (sondern evtl. in Unterverzeichnissen darunter), und immer nur das explizit einzubinden, was man wirklich braucht.

  • Diese Empfehlung würde ich sogar noch ein Stück erweitern.

    Ich bin mittlerweile soweit, dass ich für beinahe jede neue Scriptversion welchen Tools auch immer ein eigenes Unterverzeichnis anlege, allerdings nicht unterhalb des Avisynth-Plugin-Verzeichnisses sondern auf meinem Datenlaufwerk. Letzteres muss man nicht, da ich aber aus aktuellem Experemtierwahn auch Windows öfter platt mache ist das ganz sinnvoll weil es dann erhalten bleibt.

    So kann ich in jedem Script durch explizite Verweise immer genau das laden was ich möchte und kann jederzeit wieder auf als funktionierend bekannte Konfigurationen zurückgreifen. Damit kann man dann prüfen, ob das aktuelle Problem mit einer "guten" Konfiguration auch Auftritt. In der letzten Woche waren das z.B. ein YV12-Cropping-Problem und ein fehlerhafter X264-Build.

    Beste Grüße Michael

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!