Erreur Xcode depuis le passage à 2.2
Salut.
Je viens d'installer Xcode 2.2, et j'ai maintenant l'erreur suivante :
Le code :
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.
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(@"writeDataInBackgroundThread");<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 /> { // l'erreur est ici<br />#if AMSerialDebug<br /> NSLog(@"send AMSerialWriteInBackgroundProgressMessage");<br />#endif<br /> [delegate performSelectorOnMainThread:@selector(serialPortWriteProgress:) withObject:[NSDictionary dictionaryWithObjectsAndKeys:self, @"serialPort", [NSNumber numberWithInt:progress], @"value", [NSNumber numberWithInt:dataLen], @"total", 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.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
.
Je vais essayer d'éradiquer tout ça alors ....
Merci pour ton aide toujours pointue
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.
.
Merci Bru