2013-07-03 9 views
6

Mit apple's example aus der DokumentationBlock-Syntaxfehler von Apple Beispiel 'Erstellen eines Block'

float (^oneFrom)(float); 


oneFrom = ^(float aFloat) { 

    float result = aFloat - 1.0; 

    return result; 

}; 

ich zwei Fehler:

  1. Neudefinition von 'oneFrom' mit einem anderen Typ: 'int' vs 'Schwimmer (^) (float)'
  2. Typspezifizierer fehlt, ist standardmäßig 'int'

Als o vom doc ..

Wenn Sie den Rückgabewert eines Blocks Ausdruck nicht explizit deklarieren, kann er automatisch aus dem Inhalt des Block geschlossen werden. Wenn der Rückgabetyp abgeleitet ist und die Parameterliste ungültig ist, können Sie auch die Parameterliste (void) weglassen. Wenn oder wenn mehrere Rücksendeanweisungen vorhanden sind, müssen sie genau übereinstimmen (unter Verwendung von Casting, falls erforderlich).

Antwort

3

Sie können nicht definieren Blöcke gehen im Dateiumfang, nur in Funktionen. Dies funktioniert wie erwartet:

void foo (void) 
{ 
    float (^oneFrom)(float); 
    oneFrom = ^(float aFloat) { 
     float result = aFloat - 1.0; 
     return result; 
    }; 
} 
+0

Mein Verständnis war, dass Blöcke C-Funktionszeiger ähnlich sind. Kann ich das nicht in der Header-Datei deklarieren? – estobbart

+0

@estobbart Nein, Blöcke sind ein viel komplexeres Konzept als Funktionszeiger. Am wichtigsten: Sie tragen Daten, also müssen sie dynamisch auf dem Stapel oder Haufen verteilt werden. C erlaubt keine Initialisierung von Objekten mit statischer Speicherdauer, sodass Sie keinen Block für den Dateibereich definieren können. –

+0

@estobbart Sie können natürlich eine Blocktypvariable mit 'extern' in einer Header-Datei deklarieren. Sie können jedoch keinen Block definieren. –

-1

, die doesnt einen Rückgabetyp haben blockieren, und die Standard-Rückgabetyp ist ungültig, müssen Sie

float (^oneFrom)(float); 

oneFrom =^float (float aFloat) { 

    float result = aFloat - 1.0; 

    return result; 

}; 

here ist eine bessere Blöcke Beispiel

+0

Dieses Beispiel meldet immer noch die gleichen Fehler. Fehle ich etwas Offensichtliches? – estobbart

+0

Nein. Der Block hat einen Rückgabetyp, der von der tatsächlichen Anweisung 'return' abgezogen wird. Es hat den richtigen Typ von "float". –

+0

ah, ja mein Fehler, ich habe es immer implizit aus irgendeinem Grund getan. Ihre Antwort ist wahrscheinlich auch hier die echte Lösung, dachten nicht darüber nach, wo der Block definiert werden würde – Fonix

Verwandte Themen