2010-05-01 7 views
3

Celui-ci m'a rendu fou! J'ai une struct:Comment passer (en valeur) une structure en Objective-C?

typedef struct{ 
    int a; 
}myStruct; 

Puis-je:

myStruct tempStruct; 

Je suis en train de passer le struct à une méthode de classe dont la mise en œuvre est:

- (void) myFunc:(struct myStruct)oneOfMyStructs{}; 

j'appelle la méthode comme ainsi:

[myClass myFunc:(struct myStruct)tempStruct]; 

Le com Piler se plaint de "la conversion en type non-scalaire demandé". Tout ce que je veux faire est de passer une structure dans une méthode de classe, mais la syntaxe m'a un peu confus. Je suis nouveau à Objective-C. S'il vous plaît laissez-moi savoir si vous pouvez voir où je vais mal. Je n'ai pas pu passer par référence non plus, donc si vous pouviez m'aider avec ça, ce serait génial!

Merci!

+0

Il semble que 'tempStruct' dans la portée est en fait un type scalaire (' int', 'char', ...). Vérifiez si vous obtenez un message comme * "Conversion de' int' en type non-scalaire 'myStruct'" *. –

Répondre

3

Puisque vous avez typedef -El à myStruct, vous ne devez pas (ne doit pas en effet) comprennent le mot-clé struct dans la signature de la fonction ou l'appel:

typedef struct tag_myStruct 
{ 
    int a; 
} 
myStruct; 

- (void) myFunc:(myStruct) x {} 

[myClass myFunc:tmpStruct]; 

devrait être suffisant. (Comparez toutes ces fonctions de Cocoa qui prennent des choses comme NSRect s.)

+0

Merci pour le conseil. J'ai mis en forme le code comme vous l'avez suggéré mais le compilateur se plaint quand j'appelle la fonction: "Type incompatible pour l'argument 1 de 'myFunc'" Je suis réticent à poster le tout car il implique OpenGL et est composé de une demi-douzaine de fichiers. Je ne peux pas m'empêcher de penser que je suis en train de faire quelque chose de fondamentalement mauvais ... Est-il important que l'appel à la fonction provienne d'une fonction dans une autre classe? Je ne vois pas pourquoi il devrait comme j'essaye de passer par la valeur. Merci encore. – Striker

+0

Sans le code réel, c'est difficile à dire. Appeler d'une classe à l'autre devrait être bon à condition que la définition de type soit visible dans les deux emplacements. Il ne semble pas que vous essayez de faire quelque chose de fondamentalement faux, juste que certains détails ne correspondent pas. Vérifiez que la déclaration de méthode dans l'interface correspond à l'implémentation, que les bons en-têtes sont inclus, etc. – walkytalky

Questions connexes