2010-07-19 3 views
1

J'essaie d'appeler une méthode avec un paramètre float mais la valeur obtenue par la méthode n'est pas celle que j'ai envoyée.Problème de transmission des paramètres aux méthodes

Voici le code pour l'appel (l'appel réel est la dernière partie de la dernière ligne, [setFaceDirection des enfants: Direção];):

direcao = dirRadianos * 180/M_PI; // direcao = The value I send 

NSLog(@"Value Sent: %f", direcao); // Log what I'm sending 

for (CCNode *child in super.children) if([child respondsToSelector: @selector(setFaceDirection:)]) [child setFaceDirection: direcao]; 

Voici le code pour la méthode:

-(void) setFaceDirection: (float) angle { 
    NSLog(@"Value Recieved: %f", angle); 
    [theSprite setRotation: - angle ]; 
} 

Voici la déclaration de la variable flottante Direção

@interface PersControlNode : CCNode <CCTargetedTouchDelegate> { 
      // ... 
     float direcao; 
      // ... 

} 
// ... 
@end 

Voici la sortie de NSLog:

Value Sent:  -16.699266 
Value Recieved: 0.000000 
Value Sent:  -16.699301 
Value Recieved: 36893488147419103232.000000 
Value Sent:  -16.699625 
Value Recieved: -0.000000 
Value Sent:  48.366463 
Value Recieved: 2.000000 
Value Sent:  48.366451 
Value Recieved: -36893488147419103232.000000 
Value Sent:  48.366428 
Value Recieved: 0.000000 
Value Sent:  48.366444 
Value Recieved: -0.000000 
Value Sent:  14.036244 
Value Recieved: -0.000000 
Value Sent:  14.036238 
Value Recieved: -2.000000 
Value Sent:  14.036201 
Value Recieved: -36893488147419103232.000000 
Value Sent:  14.036191 
Value Recieved: -0.000000 
Value Sent:  14.036273 
Value Recieved: 36893488147419103232.000000 
Value Sent:  12.528809 
Value Recieved: 0.000000 
Value Sent:  12.528766 
Value Recieved: 36893488147419103232.000000 
Value Sent:  12.528852 
Value Recieved: -2.000000 
Value Sent:  12.528863 
Value Recieved: 0.000000 
Value Sent:  -101.309929 
Value Recieved: -36893488147419103232.000000 
Value Sent:  -101.309860 
Value Recieved: -2.000000 

Qu'est-ce que je fais mal? Je suis nouveau à l'objectif C. Merci à tous ceux qui essaient d'aider.

PS. Cela fonctionne mieux si j'utilise int au lieu de float, mais même alors, il y a encore quelques erreurs.

+1

Il fonctionne mieux si le paramètre est de type int ... mais même alors, ne est pas parfait – Jose

Répondre

1

J'ai rencontré le même problème lors de la transmission de valeurs flottantes à des méthodes qui sont implémentées uniquement dans les fichiers * .m mais non déclarées dans les fichiers * .h.

Exemple:

si vous utilisez d'appeler la méthode:

  • (void) updateScreen: (float) valeur; { ...}

assurez-vous qu'il est déclaré dans le fichier d'interface respective de cette classe. et assurez-vous que vous n'avez pas d'avertissement comme: "objet peut ne pas répondre à - (void) updatedScreen ....."

J'ai déclaré n'importe quelle fonction qui ne fonctionnait pas dans mon fichier d'interface et il travaillé parfaitement.

1

Je crois que cela a à voir avec les conversions de type automatique du côté du compilateur, mais quelqu'un de mieux informé sur C devra l'expliquer. Pour résoudre le problème, remplacez le type du paramètre angle par double.

+0

Merci ... Je vais essayer – Jose

1

Avez-vous d'autres méthodes appelées setFaceDirection: qui prennent différents types?

Avez-vous des avertissements de compilateur zéro?

+0

Salut .. Je l'ai d'autres méthodes appelées setFaceDirection mais ils prennent aussi des flotteurs La seule avertissement que j'avais l'habitude d'obtenir est "CCNode peut ne pas répondre à setFaceDirection", ce qui est vrai, c'est pourquoi je vérifie qu'il répond en premier. Mais maintenant que j'ai converti tout en int, l'avertissement est parti ... – Jose

+0

Juste clarifier: J'ai eu quelques classes avec setFaceDirection: (float) angle {..}. Ils ont tous pris le flotteur. Puis, à cause de ce problème, j'ai tout changé en int et c'est (un peu) de travail. Mais je dois être capable de passer des flotteurs comme paramètres néanmoins. Chose intéressante, l'avertissement est parti quand tout est int. Je n'avais pas remarqué ça jusqu'à maintenant. Merci mec. – Jose

0

J'ai eu le même problème. Dans le fichier HEADER (.h), les arguments étaient int. Mais dans le fichier IMPLEMENTATION (.m) les arguments étaient float ou double.

@interface ... 
{} 
- (void) resizeImage:(UIImage *)imageToResize ToFitWidth:(int)max_width andHeight:(int)max_height; 


@implementation ... 
- (void) resizeImage:(UIImage *)imageToResize ToFitWidth:(float)max_width andHeight:(float)max_height { 
    NSLog(@"max_width: %f", max_width); 
    ... 

Les valeurs étaient toujours 0,000000000. La solution pourrait être: Donc, vous pourriez ne pas avoir déclaré la méthode dans l'en-tête (.h) ou vous avez juste oublié de changer le type des arguments dans l'en-tête (.h), donc la mise en œuvre de la méthode utilise le type d'arguments de l'en-tête!

Questions connexes