Warning bizarre

2»

Réponses

  • FloFlo Membre
    03:32 modifié #32
    Chez moi :
    return (anItem) ?  [anItem childAtIndex: 0] : @does not exist; (pas de warning)
    return (anItem) ?  [anItem childAtIndex: 0] : (NSString *)@does not exist; (warning)
  • Philippe49Philippe49 Membre
    03:32 modifié #33
    dans 1231087254:

    Chez moi :
    return (anItem) ?  [anItem childAtIndex: 0] : @does not exist; (pas de warning)
    return (anItem) ?  [anItem childAtIndex: 0] : (NSString *)@does not exist; (warning)



    Là , c'est plus logique, la méthode renvoie (id) un type imprécis, et le cast (NSString*) mérite un warning.
  • Philippe49Philippe49 Membre
    03:32 modifié #34
    dans 1231086391:

    Dans mon cas, c'est comme si AppController avait une variable d'instance héritant de Truc, du coup se donnerait :

    <br />-(id)string:(id) item{<br />&nbsp;&nbsp; return ( item )? <br />&nbsp;&nbsp; [item childAtIndex:0] :&nbsp; // renvoie un Truc *<br />&nbsp;&nbsp; [unSousTruc childAtIndex:0]; // demande au sousTruc(var d&#39;instance) de renvoyer un Truc *<br />}<br />
    


    Est-ce que ça pourrait changer la donne ?


    Essai ==> pareil

    @implementation Truc
    -(Truc *) childAtIndex:(NSUInteger) n {
    return self;
    }
    @end
    =========================================
    #import "Truc.h"
    @interface TrucFils : Truc {
    }
    @end
    #import "TrucFils.h"
    @implementation TrucFils
    -(TrucFils *) childAtIndex:(NSUInteger) n {
    return self;
    }
    @end
    =========================================
    #import "AppController.h"
    #import "Truc.h"
    #import "TrucFils.h"

    @implementation AppController
    -(void) awakeFromNib {

    }
    -(id)string:(id) item{
    return ( item )?
    [item childAtIndex:0] :  // renvoie un Truc *
    [item childAtIndex:1];
    }
    -(IBAction) buttonAction:(id)sender {
    TrucFils * truc=[[TrucFils alloc]init];
    NSLog(@%@",[self string:nil]);
    NSLog(@%@",[self string:0]);
    NSLog(@%@",[self string:truc]);
    }
    @end




  • FloFlo Membre
    03:32 modifié #35
    C'est plutôt cette situation que je décrivais :

    @implementation Truc
    -(Truc *) childAtIndex:(NSUInteger) n {
      return self;
    }
    @end
    =========================================
    #import "Truc.h"
    @interface TrucFils : Truc {
    }
    @end
    #import "TrucFils.h"
    @implementation TrucFils
    -(TrucFils *) childAtIndex:(NSUInteger) n {
      return self;
    }
    @end
    =========================================
    #import "AppController.h"
    #import "Truc.h"
    #import "TrucFils.h"

    @interface AppController : Object {
        TrucFils *trucFils;
    }
    @end

    @implementation AppController
    - (id) init {
      trucFils = [[TrucFils alloc] init];
    }

    -(void) awakeFromNib {

    }
    -(id)string:(id) item{
      return ( item )?
      [item childAtIndex:0] :  // renvoie un Truc *
      [trucFils childAtIndex:1];
    }
    -(IBAction) buttonAction:(id)sender {
      Truc * truc = [[Truc alloc]init];
      NSLog(@%@",[self string:nil]);
      NSLog(@%@",[self string:truc]); 
    }
    @end
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #36
    Et là , effectivement, on a le warning ... Warning : comparison of distinct Objective-C Objects lacks a cast

    Le premier qui sait pourquoi a gagné !!


    Quelle comparaison ? celle de item avec nil l'idée d'Ali ? ou celle de trucFils avec item en recherche d'optimisation du code ?

    Indice : Si de nouveau je mets
    -(id)string:(id) item{
      return ( item )?
      [item childAtIndex:0] :  // renvoie un Truc *
      @coucou;
    }
    il n'y a pas warning
  • FloFlo Membre
    03:32 modifié #37
    Peut-etre que tout simplement chacha à  raison, devant l'ambiguà¯té que représente
    [item childAtIndex:0], le compilo ne sait que choisir car il existe plusieurs méthodes childAtIndex: pour le type id (celle de Truc, celles présentes dans le fundation framework).

    La seule solution serait donc de renommer childAtIndex: en bidule: ou alors de caster...
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #38
    Chacha is the winner    o:)

    Dans ta méthode
    - (id) outlineView: (NSOutlineView *)outlineView child: (NSInteger)anIndex ofItem: (id)anItem
    {
             return (anItem) ? [anItem childAtIndex: anIndex] : [dataSource childAtIndex: anIndex];
    }
    Le problème est que [dataSource childAtIndex:anIndex] possède un type bien défini par le fait que dataSource est parfaitement déclaré dans l'instance. Alors que  [anItem childAtIndex: anIndex] est de type indéterminé donc id.

    - Pour un opérateur ternaire, une comparaison est faite entre les deux types de l'alternative (peut-être simplement pour attribuer un type au résultat de l'expression que constitue l'ensemble de l'opérateur ternaire). Le warning indique simplement la différence de type. Ce qui trompe ici est que l'on pense que anItem va être de même type (ou quasiment) que dataSource, mais à  la compilation, ceci n'a évidemment pas de sens.

    - En changeant childAtIndex: par biduleAtIndex: , le compilateur vérifie dans toutes les interfaces disponibles si il y a plusieurs méthodes biduleAIndex: , et n'en voyant qu'une, il ne met pas le warning.


    - L'exemple qui ne présente pas de warning : return ( item )? [item bidule] :[NSString stringWithFormat:@Hello World %d,2009]; vient sans doute de la particularité dans la représentation des NSString en NSCFString.



  • schlumschlum Membre
    janvier 2009 modifié #39
    Vous avez réussi à  discuter 3 pages sur un problème de cast ?  :fouf): :) ;)
  • AliGatorAliGator Membre, Modérateur
    03:32 modifié #40
    Ben oui, le casting, c'est important : regarde, un film qui a un bon scénario mais un mauvais casting, ça plombe tout  :o
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #41
    Restons sérieux , messieurs >:)

    Trouvant que ce post était un peu court sur le fond, j'ai fait quelques essais en C :
    Quelles sont les lignes du code ci-dessous où l'opérateur ternaire provoque un Warning (-Wall -Wextra) de la part de gcc ?

    #include <stdio.h>
    int val(int n, double x) {
    return n ?  : x ;
    }

    int main(void){
    double x=2009.;
    int n=2;
    char c= x? n : x ;
    void * p = n ? &n : (void*)&x ;
    void * q = n ? &n : &x ;
    printf( n?  &n : (void*) " Hello\n");
    return 0;
    }


    [move]Je ramasse les copies dans 5 minutes.  >:) [/move]
  • schlumschlum Membre
    03:32 modifié #42
    Aucun n'a de sens... À quoi sert de savoir lesquels renverront un warning ?  :P
  • AliGatorAliGator Membre, Modérateur
    03:32 modifié #43
    [move]:brule: Et puis t'as pas un peu fini de faire mumuse avec la balise move ? :brule:
    ;D :) :o  ;D :) :o  ;D :) :o  ;D :) :o ;D :) :o ;D :) :o[/move]
  • schlumschlum Membre
    03:32 modifié #44
    Qui est d'ailleurs une balise "marquee" © Micro$oft  :P
    Qu'est-ce qu'elle fout sur ce forum ?  :o
  • Philippe49Philippe49 Membre
    03:32 modifié #45
    dans 1231160920:

    [move] ;D :) :o  ;D :) :o  ;D :) :o  ;D :) :o ;D :) :o ;D :) :o
        :brule: :brule: :brule:  Pourquoi, elle est ty pas marrante ?  :brule: :brule: :brule:
    [/move]

  • AntilogAntilog Membre
    03:32 modifié #46
    Arrêtez!!

    Maintenant, j'ai mal à  la tête...
  • Philippe49Philippe49 Membre
    03:32 modifié #47
    Oui, mais toi qui es tout frais sur le coup, reconnais quand même
    [move][size=13pt]Il est vraiment bizarre[/size][/move]
    [move] <3 [glow=red,2,300][size=16pt]                          ce                        Warning                  [/size][/glow] <3 [/move]<br />[move][size=13pt]Hein ?[/size][/move]


  • Philippe49Philippe49 Membre
    03:32 modifié #48
    La réponse : Le choix du warning pour l'opérateur ternaire est obscur

    Pourquoi mettre un warning pour void * q = n ? &n : &x ; et ne pas en mettre pour void * p = n ? &n : (void*)&x ;. Ce choix peu logique en première analyse, et même en deuxième, est le schéma qui nous a fait écrire 4 pages sur le sujet, et il y a effectivement de quoi s'en plaindre  :P

    On n'en met pas pour char c= x? n : x ; . Ok les promotions ou casts automatiques vont faire le travail.

    On n'a pas de warning pour int val(int n, double x) { return n ?  : x ;}, admettons mais il n'y en n'a pas pour printf( n?  &n : (void*) " Hello\n");. Les warnings sont là  pour prévenir d'erreurs potentielles, mêmes absurdes ( surtout absurdes ).  ;)



    dans 1231152486:

    Quelles sont les lignes du code ci-dessous où l'opérateur ternaire provoque un Warning (-Wall -Wextra) de la part de gcc ?
    #include <stdio.h>
    int val(int n, double x) {
    return n ?  : x ;
    }

    int main(void){
    double x=2009.;
    int n=2;
    char c= x? n : x ;
    void * p = n ? &n : (void*)&x ;
    void * q = n ? &n : &x ;
    printf( n?  &n : (void*) " Hello\n");
    return 0;
    }
  • ChachaChacha Membre
    03:32 modifié #49
    dans 1231221544:

    La réponse : Le choix du warning pour l'opérateur ternaire est obscur

    Extrait wikipedia
    since C does not have a type hierarchy for pointer types, pointer operands may only be used if they are of the same type (ignoring type qualifiers) or one is void or NULL.

    void* fait donc figure d'exception apparemment.
    ça n'explique pas pourquoi @... fait pareil en obj-c, mais bon...
  • mouvicielmouviciel Membre
    03:32 modifié #50
    dans 1231223574:

    ça n'explique pas pourquoi @... fait pareil en obj-c, mais bon...


    Peut-être parce que obj-c existe indépendamment de Cocoa ou OpenStep et donc que @... n'est pas nécessairement lié à  NSString.
  • Philippe49Philippe49 Membre
    03:32 modifié #51
    Je pense que cela doit être plus ou moins directement lié à 

    CFTypeRef
    An untyped "generic" reference to any Core Foundation object.

    typedef const void * CFTypeRef;

Connectez-vous ou Inscrivez-vous pour répondre.