Erreur Xcode depuis le passage à  2.2

UniXUniX Membre
06:29 modifié dans Vos applications #1
Salut.

Je viens d'installer Xcode 2.2, et j'ai maintenant l'erreur suivante :
error : nested functions are not supported on MacOSX


Le code :
- (void)writeDataInBackgroundThread:(NSData *)data<br />{<br />	<br />#if AMSerialDebug<br />	NSLog(@&quot;writeDataInBackgroundThread&quot;);<br />#endif<br />	void *localBuffer;<br />	unsigned int pos;<br />	unsigned int bufferLen;<br />	unsigned int dataLen;<br />	unsigned int written;<br />	NSDate *nextNotificationDate;<br />	BOOL notificationSent = NO;<br />	long speed;<br />	long estimatedTime;<br />	BOOL error = NO;<br /><br />	void reportProgress(int progress)<br />		{&nbsp; // l&#39;erreur est ici<br />#if AMSerialDebug<br />		NSLog(@&quot;send AMSerialWriteInBackgroundProgressMessage&quot;);<br />#endif<br />		[delegate performSelectorOnMainThread:@selector(serialPortWriteProgress:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:self, @&quot;serialPort&quot;, [NSNumber numberWithInt:progress], @&quot;value&quot;, [NSNumber numberWithInt:dataLen], @&quot;total&quot;, nil] waitUntilDone:NO];<br />		}<br />	<br />	NSAutoreleasePool *localAutoreleasePool = [[NSAutoreleasePool alloc] init];<br /><br />	[data retain];<br />	localBuffer = malloc(AMSER_MAXBUFSIZE);<br />...


Je mets pas la suite, l'erreur se produit dans ce morceau de code.

C'est pas moi qui ai écrit ça. C'est une classe qui gère les ports série.
Ca passe en Xcode 2.1, je me dis que ça doit être un pb d'options de compilation à  modifier.

Réponses

  • BruBru Membre
    06:29 modifié #2
    C'est un bug connu de GCC 4.0 qui a été résolu par la suite.

    Maintenant, tu as 3 solutions pour résoudre ton problème :

    1. installer la dernière version de GCC.
    2. utiliser GCC 3.x dans ton projet Xcode.
    3. ne plus utiliser de fonctions imbriquées car c'est MAL.

    Les fonctions imbriquées sont une hérésie qu'il faut éradiquer dès que l'on en voit une.
    Dans ton cas, sort la fonction reportProgress de la fonction writeDataInBackgroundThread
    (mets là  avant cette dernière).
    Modifie les paramètres pour recevoir les variables communes aux 2 fonctions (dataLen par exemple),
    puis recompile.
    Normalement, tu n'auras plus d'erreur.

    .
  • UniXUniX Membre
    06:29 modifié #3
    Super Bru.
    Je vais essayer d'éradiquer tout ça alors ....

    Merci pour ton aide toujours pointue  :p
  • BruBru Membre
    06:29 modifié #4
    dans 1132042354:

    C'est un bug connu de GCC 4.0 qui a été résolu par la suite.


    En fait, il ne semble pas que ce soit un bug, mais plutôt une volonté des programmeurs
    responsables de l'implémentation de GCC pour OSX.

    La limitation aurait été introduite depuis GCC 4.0.1 (livré avec XCode 2.2),
    ce qui fait que GCC 4.0.0 accepterait toujours les fonctions imbriquées.
    Quant à  la dernière version, GCC 4.0.2, je ne sais pas...

    Le motif de cette limitation serait purement sécuritaire : en effet, les fonctions
    imbriquées sont vues par GCC comme des déclarations de variable, c'est à  dire
    que le code de la fonction imbriquée est déposée sur la pile.
    Or, l'exécution du code machine en dehors des espaces mémoire "traditionnels"
    peut paraà®tre comme être du code malicieux (virus...). La pile ne sert normalement
    qu'au stockage de données temporaraires, et non à  du code, d'où la limitation.

    Cet accès de fièvre sécuritaire reste bizarre : il n'y a que OSX qui a cette limitation
    en place, or GCC est utilisé dans d'autres systèmes (par exemple Linux), sans que
    cela pose de problème particulier.

    .
  • UniXUniX Membre
    06:29 modifié #5
    Bon, j'ai suivi tes conseils, j'ai sorti la fonction imbriquée, et ça roule, plus d'erreur ...!

    Merci Bru  :)
Connectez-vous ou Inscrivez-vous pour répondre.