NSLog incomplet

RocouRocou Membre
16:41 modifié dans API AppKit #1
Bonjour,

Soit le bout de code suivant:
for(NSDictionary * fiche in result)<br />		{ <br />		 NSLog(@&quot;Cette fiche a %@ pour client.&quot; , [fiche valueForKey: @&quot;client&quot;]);<br />		}<br />


Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.

Réponses

  • Philippe49Philippe49 Membre
    16:41 modifié #2
    dans 1216977885:

    Bonjour,

    Soit le bout de code suivant:
    for(NSDictionary * fiche in result)<br />		{ <br />		 NSLog(@&quot;Cette fiche a %@ pour client.&quot; , [fiche valueForKey: @&quot;client&quot;]);<br />		}<br />
    


    Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.



    C'est que  [fiche valueForKey: @client] vaut nil, ou que la variable d'instance "client" ne répond pas à  la méthode "description".
  • RocouRocou Membre
    16:41 modifié #3
    dans 1216988444:

    dans 1216977885:

    Bonjour,

    Soit le bout de code suivant:
    for(NSDictionary * fiche in result)<br />		{ <br />		 NSLog(@&quot;Cette fiche a %@ pour client.&quot; , [fiche valueForKey: @&quot;client&quot;]);<br />		}<br />
    


    Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.



    C'est que  [fiche valueForKey: @client] vaut nil, ou que la variable d'instance "client" ne répond pas à  la méthode "description".

    Je sais que [fiche valueForKey: @client] ne vaut pas nil puisque les données s'affichent.
    Mais qu'est-ce que la "méthode description"?
  • schlumschlum Membre
    16:41 modifié #4
    dans 1216988444:

    dans 1216977885:

    Bonjour,

    Soit le bout de code suivant:
    for(NSDictionary * fiche in result)<br />		{ <br />		 NSLog(@&quot;Cette fiche a %@ pour client.&quot; , [fiche valueForKey: @&quot;client&quot;]);<br />		}<br />
    


    Tout fonctionne sauf que la fin de la chaà®ne "pour client" n'apparaà®t pas.



    C'est que  [fiche valueForKey: @client] vaut nil, ou que la variable d'instance "client" ne répond pas à  la méthode "description".


    Non, j'en doute... %@ est capable d'afficher "nil", et si "client" ne répondait pas à  "description", ça enverrait une exception et rien ne s'afficherait...
  • Philippe49Philippe49 Membre
    16:41 modifié #5
    description est la méthode utilisée lors d'un NSLog() .
    Elle peut être redéfinie dans tout objet héritant de NSObject.

    description : NSObject
    Returns a string that describes the contents of the receiver.
    - (NSString *)description

    dans 1216989346:

    Je sais que [fiche valueForKey: @client] ne vaut pas nil puisque les données s'affichent.

    Alors là  c'est effectivement un mystère.
    Pour qu'un fprintf() s'arrête en cours de format, je ne vois que la présence d'un '\0' dans le format.
    Essaye d'autres arguments ...

  • Philippe49Philippe49 Membre
    16:41 modifié #6
    dans 1216989881:

    Non, j'en doute... %@ est capable d'afficher "nil", et si "client" ne répondait pas à  "description", ça enverrait une exception et rien ne s'afficherait...


    Effectivement

    #import <Foundation/Foundation.h>

    int main(int argc, char**argv){
    NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
    NSLog(@Coucou %@ pour client ",nil);
    [pool drain];
    return 0;
    }

    répond
    % gcc pgm.m -o pgm -framework Foundation
    % pgm
    2008-07-25 14:48:54.654 pgm[871:10b] Coucou (null) pour client


    alors que
    #import <Foundation/Foundation.h>

    int main(int argc, char**argv){
    NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
    NSLog(nil);
    [pool drain];
    return 0;
    }

    n'écrit rien du tout
  • RocouRocou Membre
    16:41 modifié #7
    dans 1216989986:

    description est la méthode utilisée lors d'un NSLog() .
    Elle peut être redéfinie dans tout objet héritant de NSObject.

    description : NSObject
    Returns a string that describes the contents of the receiver.
    - (NSString *)description

    dans 1216989346:

    Je sais que [fiche valueForKey: @client] ne vaut pas nil puisque les données s'affichent.

    Alors là  c'est effectivement un mystère.
    Pour qu'un fprintf() s'arrête en cours de format, je ne vois que la présence d'un '\0' dans le format.
    Essaye d'autres arguments ...



    Quand j'essaie d'afficher autre chose (un entier par exemple), ça fonctionne.
    Veux-tu dire que dans ma variable "client" j'ai probablement un '\0'? Mais comment en être sur et comment le supprimer?
  • Philippe49Philippe49 Membre
    16:41 modifié #8
    C'est une instance de quelle classe ta variable "client" ?
    Elle hérite de NSString * ?
  • RocouRocou Membre
    16:41 modifié #9
    dans 1216991650:

    C'est une instance de quelle classe ta variable "client" ?
    Elle hérite de NSString * ?

    Pour voici le bout de code complet que j'ai un peu remanié afin de le rendre plus clair (pour moi) mais cela ne change rien:

    NSString *query = @select clients.nom as client from clients;
       
    NSMutableArray *result = nil;
                 
    PGSQLRecordset *rs = [connection open:query];
        if (rs != nil) {
                if (![rs isEOF])
                  {
                      if (result != nil)
                      {
                          [result release];
                          result = nil;
                      }
                      result = [[NSMutableArray alloc] init];
                      int i=0;
                      while (![rs isEOF])
                      {
                        [result addObject:[rs dictionaryFromRecord]];
                        NSString* valeur = [[result objectAtIndex:i] valueForKey:@client];
     
                        NSMutableDictionary * maligne=[NSMutableDictionary dictionaryWithObjectsAndKeys:valeur,@first,nil];
                        model=[[NSArray alloc] initWithObjects:maligne,nil];
       
                        tableView:objectValueForTableColumn:row:
     
                              NSLog(@Cette fiche a %@ pour client.", valeur);
     
                              i++;
                            [rs moveNext];
                      }               
                  }

  • Philippe49Philippe49 Membre
    juillet 2008 modifié #10
    1) Voilà  un bout de code où le NSLog() stoppe en cours de message

    #import <Foundation/Foundation.h>

    int main(int argc, char**argv){
    NSAutoreleasePool * pool =[[NSAutoreleasePool alloc]init];
    NSLog(@Coucou %@ pour client ",@ma\0chin");
    [pool drain];
    return 0;
    }

    % gcc pgm.m -o pgm -framework Foundation
    % pgm
    2008-07-25 17:35:23.153 pgm[1459:10b] Coucou ma
    %

    2) Fait un code plus simple.
    Pour voir la classe de valeur,
    id valeur = [[result objectAtIndex:i] valueForKey:@client];
    et
    NSLog(@classe :%@",[value class]);
    NSLog(@hérite de : %@",[value superclass]); 
    et/ou simplement fouiller dans le framework que tu as dû inclure
  • RocouRocou Membre
    16:41 modifié #11
    dans 1217000617:

    2) Fait un code plus simple.
    Pour voir la classe de valeur,
    id valeur = [[result objectAtIndex:i] valueForKey:@client];
    et
    NSLog(@classe :%@",[value class]);
    NSLog(@hérite de : %@",[value superclass]); 
    et/ou simplement fouiller dans le framework que tu as dû inclure



    Voici ce que cela a donné:
    classe :NSCFString
    hérite de : NSMutableString

  • 16:41 modifié #12
    Au vu du code, il semble que l'erreur ne provienne pas du NSLog mais plutôt de la ligne précédente.

    NSMutableDictionary * maligne=[NSMutableDictionary dictionaryWithObjectsAndKeys:valeur,@&quot;first&quot;,nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  model=[[NSArray alloc] initWithObjects:maligne,nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [color=red]tableView:objectValueForTableColumn:row:[/color]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  NSLog(@&quot;Cette fiche a %@ pour client.&quot;, valeur);
    

  • Philippe49Philippe49 Membre
    16:41 modifié #13
    dans 1217003199:

    Voici ce que cela a donné:
    classe :NSCFString
    hérite de : NSMutableString

    c'est curieux. une "string" hérite d'une "NSMutableString".
    D'habitude, c'est le contraire.

    NSCFString est une classe privée utilisée pour rendre compatible les "...String" définies selon les API
    faire une recherche sur toll-free bridge
  • RocouRocou Membre
    16:41 modifié #14
    dans 1217008082:

    Au vu du code, il semble que l'erreur ne provienne pas du NSLog mais plutôt de la ligne précédente.

    NSMutableDictionary * maligne=[NSMutableDictionary dictionaryWithObjectsAndKeys:valeur,@&quot;first&quot;,nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;model=[[NSArray alloc] initWithObjects:maligne,nil];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[color=red]tableView:objectValueForTableColumn:row:[/color]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NSLog(@&quot;Cette fiche a %@ pour client.&quot;, valeur);
    



    La ligne en question est effectivement mauvaise mais elle n'est pas responsable du problème sur le NSLog (j'essaie de résoudre deux problèmes bien distincts)
  • Philippe49Philippe49 Membre
    16:41 modifié #15
    Effectivement, tableview:objectValueForTableColumn:row: est alors une succession de trois étiquettes inutilisées, et le code ne s'en occupe pas. Voir exemple

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