2 Stimmen

CMTime / CMTimeMake Frage für Anfänger

CMTimeMake liefert mir nicht die Ergebnisse, die ich erwarte. Der folgende Code:

CMTime testTime = CMTimeMake(0, 30);
NSLog(@"testTime w/ input 0, 30: value: %d, timescale %d, seconds: %f",
       testTime.value, testTime.timescale,
      (float) testTime.value / testTime.timescale);

testTime = CMTimeMake(1, 30);
NSLog(@"testTime w/ input 1, 30: value: %d, timescale %d, seconds: %f",
      testTime.value, testTime.timescale,
      (float) testTime.value / testTime.timescale);

testTime = CMTimeMake(15, 30);
NSLog(@"testTime w/ input 15, 30: value: %d, timescale %d, seconds: %f",
      testTime.value, testTime.timescale,
      (float) testTime.value / testTime.timescale);

erzeugt die folgende Ausgabe:

testTime w/ input 0, 30: Wert: 0, Zeitskala 0, Sekunden: 0.000000

testTime w/ input 1, 60: Wert: 1, Zeitskala 0, Sekunden: 0.000000

testTime w/ input 15, 60: Wert: 15, Zeitskala 0, Sekunden: 0.000000

Warum ist testTime.timescale immer Null?

3voto

jhabbott Punkte 17551

Dies ist ein Problem mit der Formatzeichenfolge für NSLog . Da der Titel Ihrer Frage darauf hinweist, dass Sie ein " Neuling ", nehme ich mir etwas Zeit, um zu erklären, was hier vor sich geht.

Funktionen, die eine variable Anzahl von Argumenten annehmen, wie NSLog(NSString* format, ...) die zusätzlichen Argumente auf der Grundlage des Formatstrings lesen müssen...

  • %d bedeutet: Vier Bytes (32 Bits) lesen und als dezimale Ganzzahl behandeln.
  • %f bedeutet: Vier Bytes (32 Bits) lesen und als Gleitkommazahl behandeln.

Schauen wir uns Ihr letztes Beispiel an:

Sie passieren gerade %d %d %f in der Formatzeichenfolge, gefolgt von:

testTime.value     // A 64-bit integer (8 bytes) with the value 15
testTime.timescale // A 32-bit integer (4-bytes) with the value 30
(float)15 / 30     // A 32-bit float (4-bytes) with the value 0.5f

Aufgrund der Art und Weise, wie diese Zahlen übergeben werden, liest man am Ende die niedrigstwertigen 32-Bits von testTime.value für die erste %d was zufällig korrekt als 15 interpretiert wird, dann für die zweite %d et le %f Sie lesen die oberen 32 Bits (0) und wahrscheinlich einige Auffüllungsbytes, um 0,0 zu erhalten. Ich bin eigentlich ein wenig verwirrt, warum Sie 0,0 anstelle einer kleinen Zahl erhalten, da ich erwarten würde, dass die 30 als Float interpretiert werden, die 4.2E-44 wäre - wenn jemand weiß, lassen Sie es mich bitte wissen.

Wie auch immer, die Lösung des Problems besteht darin, die erste %d en %lld und dies wird die Werte korrekt anzeigen. Die testTime Variable eigentlich die ganze Zeit die richtigen Werte hatte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X