2010-12-03 19 views
1

Je construis un en-tête avec un tas de fonctions pour faire des maths d'astronomie et jusqu'ici tout va bien, sauf que ces deux fonctions plantent le débogueur avec un message Debugging terminated. et rien d'autre. Les instructions NSLog s'impriment correctement sur la console avec les bonnes réponses, mais elles tombent en panne. Des idées?Ces deux fonctions d'Objective-C se bloquent sans message

float calcTimeJulianCent(float julianDate) { 
NSLog(@" -calcTimeJulianCent"); 
float tCentury = (julianDate - 2451545.0)/36525.0; 
NSLog(@" -calculation complete, tCentury = %1.4f", tCentury); 
return tCentury; 
} 

float calcJDFromJulianCent(float tCentury) { 
NSLog(@" -calcJDFromJulianCent"); 
float julianDate = tCentury * 36525.0 + 2451545.0; 
NSLog(@" -calculation complete, tCentury = %1.4f", julianDate); 
return julianDate; 
} 

Et voici la méthode qui appelle les fonctions:

- (IBAction)doMath { 
NSLog(@"-%@:%s called", [self class], _cmd); 

    // other calls that work 

float julianCentury = calcTimeJulianCent(julianDay); 
NSLog(@" -calcTimeJulianCent called: %@", julianCentury); 

float backToJulianDate = calcJDFromJulianCent(0.1092); 
NSLog(@" -calcJDFromJulianCent called: %@", backToJulianDate); 

    // more calls that work 
} 

EDIT: Answer - erreur stupide. Les fonctions renvoient floats et j'ai utilisé %@ dans le NSLog qui est pour les chaînes. On pourrait penser que Xcode pourrait faire plus que juste s'écraser dessus.

+2

Si vous parcourez avec le débogueur, quelle ligne ne l'accident se produit sur? –

+0

Sur quelle plateforme êtes-vous? Utiliser GDB? Est-ce que ça dit "Debugging terminé" ou "Debugger arrêté"? Y a-t-il un statut de retour imprimé? Se pourrait-il que l'erreur soit dans un code en dehors de ces fonctions? Vos fonctions reviennent-elles? –

+0

C'est intéressant - je mets un point d'arrêt dans la méthode qui appelle ces fonctions, puis franchi. Je ne recevais pas toutes les informations de débogage jusqu'à ce que je fasse ça. Maintenant, je peux voir qu'il se bloque après le retour de la fonction. Mise à jour de la question pour montrer à quoi ressemble l'appel ... – Steve

Répondre

2

J'ai vu votre modification. La raison en est que les plantages sont dus au fait que NSLog s'attend à trouver un pointeur vers un objet - c'est-à-dire un emplacement de mémoire - lorsqu'il trouve le spécificateur de format %@. Évidemment, un nombre à virgule flottante ne peut pas être une adresse mémoire valide, de sorte que le programme se bloque. Xcode ne le corrige pas car NSLog prend une chaîne et une liste d'arguments variable. Cependant, en C, vous ne pouvez pas spécifier les types pour varargs, donc il n'y a aucun moyen de dire quel type d'arguments NSLogdevrait prendre, dans le cas général.

(gcc fournit une vérification-spécificateur de format lorsque vous appelez printf, mais le même ne se produit pas avec NSLog.)

+0

Merci pour la perspicacité! C'est sympa de résoudre un problème, mais encore mieux de savoir "pourquoi" ça a été résolu! – Steve