$strstr(%codec_profile%,$or('V0','V1','V2'))

Begonnen von dRsrb, 23. Februar 2007, 21:47:41

Vorheriges Thema - Nächstes Thema

dRsrb

Hallo! :)

Ich würde gerne wissen, warum der oben genannte Code nicht funktioniert? Ich arbeite mit MP3s.

Bei mir funktioniert es nur, wenn ich $or() weglasse. Dadurch wird der Code auch länger, aber genau das möchte ich ja damit eigentlich verhindern.

Darf man im Fall von $strstr() kein $or() verwenden?

MfG,
dRsrb

Frank Bicking

#1
Hier liegt ein Missverständnis der Funktionsweise von $or (siehe Referenz) und vor allem der Auswertungsreihenfolge vor.

Beim Titleformatting hat jeder Ausdruck immer einen textualen Wert, das ist das was du am Ende auf dem Bildschirm siehst, und einen Wahrheitswert, der für den Endbenutzer meist nicht so offensichtlich ist. Nehmen wir z.B. $if(%album%,Album vorhanden,nicht vorhanden), dann liefert %album% beim Vorhandensein eines solchen Feldes dessen Inhalt, aber intern auch den Wert TRUE zurück. Dieser wird vom $if berücksichtigt, um zu entscheiden, ob der zweite oder dritte Parameter zurückgegeben wird.

Einfacher Text hat dagegen immer den Wahrheitswert FALSE:

$if(text,1,2) liefert 2.

Erst durch einen vorhandenen Tag wird der Wahrheitswert zu TRUE:

$if(text %album%,1,2) liefert bei vorhandenem Album-Tag 1, sonst 2.

--

Was machst du nun mit deinem $or? Du verknüpfst die Wahrheitswerte von drei einfachen Zeichenfolgen, und lässt dir einen Wahrheitswert zurückgeben.

$strstr(%codec_profile%,$or('V0','V1','V2'))
$strstr(%codec_profile%,$or(<FALSE>,<FALSE>,<FALSE>))
$strstr(%codec_profile%,$or(<FALSE>,<FALSE>,<FALSE>))
$strstr(%codec_profile%,<FALSE>)

Das ist die Auswertungsreihenfolge. Der zweite Parameter vom $strstr hat nach den ersten Schritten den Wahrheitswert FALSE, ist jedoch nur noch eine leere Zeichenfolge. Die Frage, ob eine leere Zeichenfolge in einer anderen vorhanden ist, wird von $strstr mit FALSE beantwortet. Unter den Parametern von $or einen Tag zu verwenden, würde daran nichts ändern. Der Wahrheitswert könnte dann zwar TRUE werden, würde aber nichts daran ändern, dass die von einem $or zurückgegebene Zeichenfolge immer leer ist. Die logischen Funktionen $and, $or, $not und $xor liefern nur einen Wahrheitswert zurück, aber keinen Text.

Ich hoffe ich konnte dir das einigermaßen begreiflich machen.

Besitzt du Programmierkenntnisse? Anhand des foobar2000-SDKs ist die Funktionsweise möglicherweise leichter zu verstehen.

dRsrb

Ich danke Dir für Deine sehr ausführliche Antwort, die mir einiges klar gemacht hat, auch den Denkfehler! :top:

Das SDK werde ich mir gleich mal anschauen! Ich habe es mir bisher nicht angeschaut, weil ich kein C++, aber Grundkenntnisse in C habe.

MfG,
dRsrb