Récupérer la valeur (NSInteger) d'un objet dans un NSArray ?

apocaalypsoapocaalypso Membre
02:14 modifié dans API UIKit #1
Bonsoir,

J'ai deux NSArray, l'une contenant 45 UIImageView et l'autre contenant tout autant de NSInteger. Ce que je souhaite c'est de récupérer l'entier de ce deuxième NSArray au même index qu'une UIImageView préalablement choisie.
Pour l'instant j'ai :
-(NSInteger)displayFleetsOfPlanet:(UIImageView *)planet<br />{<br />	NSInteger indexOfPlanet = [cases indexOfObject:planet];<br />	NSInteger indexOfFleet = [fleetsByPlanets objectAtIndex:indexOfPlanet];<br /><br />	return indexOfFleet;<br />}


Mais j'ai le warning : initialization makes integer from pointer without a cast.
J'ai chercher sur internet d'où pouvait provenir mon erreur en vain.

Merci d'avance !

Guillaume.

Réponses

  • schlumschlum Membre
    02:14 modifié #2
    Tu n'a certainement pas un NSArray contenant des NSInteger... c'est impossible (NSInteger n'est pas un objet).

    Des NSNumber éventuellement...
  • apocaalypsoapocaalypso Membre
    02:14 modifié #3
    D'accord.
    J'ai changé ma fonction mais sans supprimer l'erreur :
    -(NSNumber *)displayFleetsOfPlanet:(UIImageView *)planet<br />{<br />	NSUInteger indexOfPlanet = [cases indexOfObject:planet];<br />	NSNumber *numberOfFleets = [fleetsByPlanets objectAtIndex:indexOfPlanet];<br /><br />	return numberOfFleets;<br />}
    


    Je ne l'appelle peut-être pas de la bonne façon :

    NSNumber *number = [self displayFleetsOfPlanet:planet];<br />NSString *string = [NSString stringWithFormat:@&quot;%d&quot;, number];
    


    Merci de ton aide schlum.
  • schlumschlum Membre
    mai 2009 modifié #4
    Cette fois ci, c'est l'inverse... NSNumber est un objet, tu ne peux pas l'afficher avec %d !
    NSNumber a déjà  une méthode adéquate pour ça : "stringValue".

    Et puis, j'ai parlé de NSNumber parce qu'en général c'est ce qu'on utilise pour mettre des nombres dans un tableau, mais rien ne garantit que c'est ce que tu as dans ton tableau...
  • apocaalypsoapocaalypso Membre
    02:14 modifié #5
    Voici mon tableau contenant les chiffres à  récupérer (pour l'instant il n'y a que des zéros) :
    fleetsByPlanets = [[NSArray alloc] initWithObjects:0,0,0,0,0,0,0,0,0,0,<br />														0,0,0,0,0,0,0,0,0,0,<br />														0,0,0,0,0,0,0,0,0,0,<br />														0,0,0,0,0,0,0,0,0,0,<br />														0,0,0,0,0,<br />														nil];<br />
    

  • AliGatorAliGator Membre, Modérateur
    02:14 modifié #6
    Depuis quand "zéro" est un objet ?
    C'est là  ton erreur, tu essayes de mettre des entiers dans ton NSArray qui ne sait contenir que des objets (id, NSObjet et toutes les classes Cocoa dérivant de NSObject... mais pas les types primitifs comme float ou int)

    D'où l'intérêt de passer par NSNumber pour encapsuler tes int dans des objets Cocoa.
  • apocaalypsoapocaalypso Membre
    02:14 modifié #7
    Merci beaucoup Ali, j'ai donc remplacer l'entier 0 par sa valeur NSNumber :
    fleetsByPlanets = [[NSArray alloc] initWithObjects:[NSNumber numberWithInteger:0], ...
    


    Et tout à  l'air de marcher, merci beaucoup à  tous les deux !
  • AliGatorAliGator Membre, Modérateur
    02:14 modifié #8
    D'autant plus que quand tu mets 0 c'est interprété comme un "nil" (car en fait "nil" c'est un pointeur nul, un peu comme NULL qui vaut zéro... casté en type "void*". (nil ça doit être 0 casté en type "id" je suppose).
    Du coup arrayWithObjects:0,0,0,nil est équivalent à  arrayWithObjects:nil,nil,nil,nil enfin du moins il est interprété comme ça (avec, y'a des chances, un warning disant que tu as fourni un entier là  où il attendait un pointeur, et ce "without a cast")
  • schlumschlum Membre
    02:14 modifié #9
    dans 1241371502:

    D'autant plus que quand tu mets 0 c'est interprété comme un "nil" (car en fait "nil" c'est un pointeur nul, un peu comme NULL qui vaut zéro... casté en type "void*". (nil ça doit être 0 casté en type "id" je suppose).
    Du coup arrayWithObjects:0,0,0,nil est équivalent à  arrayWithObjects:nil,nil,nil,nil enfin du moins il est interprété comme ça (avec, y'a des chances, un warning disant que tu as fourni un entier là  où il attendait un pointeur, et ce "without a cast")


    Pire que ça... Il s'arrête au premier "nil", donc ça fournira un NSArray totalement vide, et ce sans aucun warning !
  • apocaalypsoapocaalypso Membre
    02:14 modifié #10
    Oui, vous avez raison, dans mon erreur, la console m'indiquait que mon NSArray avait 0 index.
  • AliGatorAliGator Membre, Modérateur
    02:14 modifié #11
    dans 1241381563:

    dans 1241371502:

    D'autant plus que quand tu mets 0 c'est interprété comme un "nil" (car en fait "nil" c'est un pointeur nul, un peu comme NULL qui vaut zéro... casté en type "void*". (nil ça doit être 0 casté en type "id" je suppose).
    Du coup arrayWithObjects:0,0,0,nil est équivalent à  arrayWithObjects:nil,nil,nil,nil enfin du moins il est interprété comme ça (avec, y'a des chances, un warning disant que tu as fourni un entier là  où il attendait un pointeur, et ce "without a cast")


    Pire que ça... Il s'arrête au premier "nil", donc ça fournira un NSArray totalement vide, et ce sans aucun warning !
    Je sous-entendais bien justement, en mettant les 4 "nil", montrer que du coup il interprétait donc bien ça comme un tableau vide au final (c'était le but de mon post lol)... Mais j'imagine qu'il met quand même un warning, pour dire que le premier "0" rencontré est interpréter comme un "nil" (mais c'est tout puisqu'il va pas aller parser plus loin les autres 0 / nil) et donc que là  le premier 0 qu'il trouve est un integer mais qu'il interprète ça comme un pointer (nil) sans cast explicite... non ?
  • schlumschlum Membre
    02:14 modifié #12
    nil et Nil sont des macros sur __DARWIN_NULL qui est une macro sur "((void *)0)"

    Cela dit, dans les conditions normales de pression et de température de warnings, 0 est castable en (void*) sans cast explicite et sans warnings si je ne m'abuse, donc pas de warnings... (on peut créer un array vide avec cette méthode ; même si c'est pas malin, c'est pas interdit  :) ).
  • Philippe49Philippe49 Membre
    02:14 modifié #13
    Conceptuellement, quand utilisez-vous nil, NULL et Nil ?
  • AliGatorAliGator Membre, Modérateur
    02:14 modifié #14
    nil pour des objects Cocoa (id)
    NULL pour des pointeurs C (void*)
    Nil je ne l'utilise jamais mais conceptuellement ça serait pour des Class nulles ([tt]Class c = Nil; if (...) c = [toto class];[/tt])

    C'est comme ça que j'écris par exemple : [tt][UIView beginAnimations:nil context:NULL][/tt] car le premier param est un NSString donc j'utilise "nil" si je veux rien mettre, et le 2e est un void* donc j'utilise NULL.

    En réalité il n'y a aucune différence, mais ça me paraà®t tellement naturel, vu que pour moi "nil" représente un objet cocoa nul que je me suis jamais trop posé la question...
  • Philippe49Philippe49 Membre
    mai 2009 modifié #15
    dans 1241423249:

    nil pour des objects Cocoa (id)
    NULL pour des pointeurs C (void*)
    Nil je ne l'utilise jamais mais conceptuellement ça serait pour des Class nulles ([tt]Class c = Nil; if (...) c = [toto class];[/tt])

    J'ai la même pratique, si ce n'est que je n'ai jamais eu l'occasion d'utiliser Nil.
  • apocaalypsoapocaalypso Membre
    02:14 modifié #16
    J'ai un autre petit soucis, mais d'un autre ordre cette fois-ci.
    Je voudrais ajouter un petit UILabel au centre de chacune de mes UIImageView, j'ai donc naturellement fais :
    for(UIImageView *subview in cases) {<br />		// We verify if the case is not empty<br />		if(subview.image != empty)<br />		{<br />			/*// We display the fleets<br />			UILabel *fleets = [[UILabel alloc] initWithFrame:subview.bounds];<br />			[fleets setTextColor:[UIColor blackColor]];<br />			[fleets setBackgroundColor:[UIColor clearColor]];<br />			// We set the number of fleets<br />			NSNumber *fleetsNumber = [self displayFleetsOfPlanet:subview];<br />			fleets.text = [NSString stringWithFormat:@&quot;%d&quot;, [fleetsNumber integerValue]];<br />			[self addSubview:fleets];<br />			<br />			// We release the UILabel<br />			[fleets release];*/<br />		}<br />	}	<br />
    


    Mais ce code ne me crées qu'un seul UILabel.
    C'est parce que j'initialise toujours le même UILabel c'est ça ?
  • Philippe49Philippe49 Membre
    02:14 modifié #17
    Ils sont tous créés au même endroit, donc tu n'en vois qu'un.
    En effet subview.bounds c'est un rect (0.,0.,width,height)
    mets subview.frame dont l'origine est pris dans le système de coordonnées de la subview.
  • Philippe49Philippe49 Membre
    mai 2009 modifié #18
    Dans ce genre de situations, j'aurais mis le message d'observation :
    NSLog(@%@",[cases subviews]);
    après être sorti de la boucle for, afin d'observer le nombre de UILabel créés.
Connectez-vous ou Inscrivez-vous pour répondre.