2010-12-08 35 views
0

Ceci est ma première question alors s'il vous plaît pardonnez-moi si c'est évident. J'ai appris à programmer en Pascal il y a quelques années, donc ma terminologie est peut-être éteinte. J'ai regardé un tas de messages, mais rien ne semble résoudre mon problème de base.Objectif C question: la méthode ne retournera pas une chaîne

J'ai une table de conversion que j'utilise pour convertir les nombres décimaux en fractions. J'appelle cette méthode ...

-(void) convertToFractions:(float *)float2 aString:(NSMutableString *) myString; 

... avec ce ..

[self convertToFractions:&float1 aString:outputFraction]; 

L'idée est que float2 est la virgule que je passe à la méthode, et myString est la fraction de retour .

Ce court après la recherche:

myString = [NSString stringWithString:[[decimalInchArray objectAtIndex:x]objectAtIndex:1]]; 
NSLog(@"myString = %@",myString); 

Le journal montre myString est la fraction correcte à savoir myString affiche correctement la fraction que je veux revenir, mais outputFraction est nulle.

Je pense que c'est un problème de pointeur. J'ai essayé *myString, mais le compilateur génère une erreur (types incompatibles).

Toutes les suggestions sont vraiment appréciées.

+0

Bienvenue à SO, @Jeremy, veuillez formater votre code lors de la publication. Aussi, n'oubliez pas de sélectionner la réponse qui vous a aidé. – Moshe

+2

Alors que tout cela est réparable, s'il vous plaît vous faire une faveur et prenez un bon livre d'introduction dans Objective-C. – Eiko

+0

BTW: Votre chaîne ne change pas car vous en affectez une nouvelle à la variable passée au lieu de changer son contenu. – Eiko

Répondre

1

Où définissez-vous votre outputFraction? Nulle part dans le code ci-dessus vous le mentionnez. En cas de doute, votre méthode de conversion est déclarée comme (void), ce qui signifie qu'elle ne renverra rien.

Si vous en avez besoin pour retourner le résultat comme un NSString déclarer comme

-(NSString*) convertToFractions:(float *)float2 aString:(NSMutableString *) myString; 

Et assurez-vous que vous retournez un NSString avant d'arriver à la fin de la méthode avec

return MyNSStringVariable; 

[EDIT]

Je peux voir que vous espérez que outputFraction sera retourné par votre méthode mais ce n'est pas le cas avec Objective-C (pas sûr de Pascal). Vous passez simplement outputFraction en tant que deuxième variable dans votre méthode.

Ainsi, la « bonne » façon de le faire serait d'avoir une méthode

-(NSString*)convertToFraction:(float*)float2 { 
    ...// Do your float to fraction calculation here 
    ...// Make sure fraction is formatted as NSString 
    return YourFractionVariable; 
} 

Ensuite, vous pouvez affecter la valeur de retour à une variable de votre choix, par exemple:

NSString *fraction = [self converToFraction:aFloatNumber]; 
NSLog (@"fraction is %@", fraction); 

Salutations, Rog

+0

Il obtiendra vraisemblablement 'myString' du paramètre' aString: 'pour quelque raison. – BoltClock

+0

Merci Rog. C'était très utile. Une chose cependant. J'ai trouvé que je devais ajouter le signe & devant unFloatVariable. Fonctionne parfaitement maintenant. – Jeremy

0

Pourquoi ne pas simplement retourner la chaîne?

- (NSString*)convertToFractions:(float)float { 
    //Bla bla do everything 
    return [myString autorelease]; //Autorelease is for memory-management 
} 

Btw: Vous avez sérieusement besoin de lire dans ObjC. N'essayez pas d'utiliser vos anciennes connaissances pascal sur ObjC. C'est différent, et vos connaissances ne sont pas vraiment applicables.

Je recommanderais d'acheter un livre sur ObjC ou de lire quelques bons tutoriels.(Apple lui-même en a de très bons)

+0

Merci. La suggestion autorelease est très utile. – Jeremy

+0

Si vous voulez en savoir plus sur la gestion de la mémoire dans ObjC, je vous recommande de lire http://interfacelab.com/objective-c-memory-management-for-lazy-people/ –

0

Si vous ne voulez pas renvoyer NSString de votre méthode comme d'autres l'ont suggéré, vous pouvez passer un pointeur sur le pointeur NSString à votre fonction (de la même façon que vous passez NSError ** à certains par exemple, les api callsm dans les méthodes NSFileManager). Votre code ressemblera à quelque chose comme:

NSString *outputFraction; 
[self convertToFractions:&float1 aString:&outputFraction]; 

-(void) convertToFractions:(float *)float2 aString:(NSMutableString **) myString{ 
    ... 
    if (myString) 
     *myString = [NSString stringWithString:[[decimalInchArray objectAtIndex:x]objectAtIndex:1]]; 
} 
+0

Merci Vlad. Les doubles pointeurs me déroutaient vraiment mais votre exemple est une aide précieuse. – Jeremy

2

Vous voulez changer la sortie de votre méthode convertToFractionsvoid-NSString. Il renvoie null car le type de retour de votre méthode est void, il ne renvoie donc rien.

Le type de retour d'une méthode Objective-C se trouve entre parenthèses, au début du nom de la méthode.

Voici un exemple, mais je ne vois pas où vous définissez convertToString alors, je vais utiliser pseudocode.

- (NSString *) convertToFractions:(float *)float2{ 
    NSString *fraction = *some code to lookup fraction from table;* 
    return fraction; 
} 

myString = [self convertToFractions:(float *)float2]; 

EDIT:

Comme d'autres l'ont suggéré, vous devez donner Objective-C un nouveau regard. Je vous suggère de lire this Objective-C Primer écrit par Apple.

+0

@Moshe Vous voulez probablement utiliser la fraction 'NSString * ici ... –

+0

@JacobRelkin - merci, corrigé. – Moshe

+0

@Moshe En passant, vous et moi avons un ami commun, il semble. –