Un if/else qui ne marche pas...
Bonjour à tous
voila mon soucis du jour, je ne comprends absolument pas, c'est à tomber par terre tellement c'est incompréhensible pour moi, peut etre que mon erreur vient de mon manque de connaissance en Objective-C donc je vais demander votre aide.
voila mon code
Ma variable idLocale prend bien la valeur "fr" par exemple mais je ne rentre jamais dans mon if, il va toujours dans le dernier else.
Au départ je n'avais que des if et un else final, la j'ai essayé avec des else if mais rien n'y fait, toujours le meme résultat.
Quelqu'un pourrait me donner un coup de main ?
Merci encore
:brule:
voila mon soucis du jour, je ne comprends absolument pas, c'est à tomber par terre tellement c'est incompréhensible pour moi, peut etre que mon erreur vient de mon manque de connaissance en Objective-C donc je vais demander votre aide.
voila mon code
- (void) getInitialDataToDisplay:(NSString *)dbPath andSpotId:(NSInteger)spotId{<br /> <br /> //recuperation de la langue de l'utilisateur<br /> NSLocale *locale = [NSLocale currentLocale];<br /> NSString *idLocale = [locale objectForKey:NSLocaleLanguageCode];<br /> <br /> //meme commentaires que dans CountryDB ou AreaDB<br /> if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {<br /> <br /> NSLog(idLocale);<br /> <br /> if (idLocale == @"fr")<br /> {<br /> NSLog(@"jsui francais");<br /> const char *sql = "select * from spot_fr where SPOT_ID = ?";<br /> <br /> int returnValue;<br /> sqlite3_stmt *selectstmt = nil;<br /> <br /> if (selectstmt == nil) <br /> {<br /> returnValue = sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL);<br /> }<br /> <br /> sqlite3_bind_int(selectstmt, 1, spotId);<br /> //NSLog(@"erreur %i et spot num %i", huh, spotId);<br /> <br /> while(sqlite3_step(selectstmt) == SQLITE_ROW)<br /> {<br /> //NSLog(@"jsui dans le while");<br /> NSInteger primaryKey = sqlite3_column_int(selectstmt, 1);<br /> [self initWithPrimaryKey:primaryKey];<br /> <br /> self.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];<br /> self.description = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];<br /> self.bestTide = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];<br /> self.bestSwell = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];<br /> self.bestWind = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 8)];<br /> self.type = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 9)];<br /> <br /> }<br /> <br /> //reset the statement, so it can be used again<br /> sqlite3_reset(selectstmt);<br /> }<br /> <br /> else if (idLocale == @"es")<br /> {<br /> NSLog(@"jsui espagnol");<br /> const char *sql = "select * from spot_es where SPOT_ID = ?";<br /> <br /> int returnValue;<br /> sqlite3_stmt *selectstmt = nil;<br /> <br /> if (selectstmt == nil) <br /> {<br /> returnValue = sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL);<br /> }<br /> <br /> sqlite3_bind_int(selectstmt, 1, spotId);<br /> //NSLog(@"erreur %i et spot num %i", huh, spotId);<br /> <br /> while(sqlite3_step(selectstmt) == SQLITE_ROW)<br /> {<br /> //NSLog(@"jsui dans le while");<br /> NSInteger primaryKey = sqlite3_column_int(selectstmt, 1);<br /> [self initWithPrimaryKey:primaryKey];<br /> <br /> self.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];<br /> self.description = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];<br /> self.bestTide = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];<br /> self.bestSwell = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];<br /> self.bestWind = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 8)];<br /> self.type = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 9)];<br /> <br /> }<br /> <br /> //reset the statement, so it can be used again<br /> sqlite3_reset(selectstmt);<br /> }<br /> <br /> else if (idLocale == @"pt")<br /> {<br /> NSLog(@"jsui portugais");<br /> const char *sql = "select * from spot_pt where SPOT_ID = ?";<br /> <br /> int returnValue;<br /> sqlite3_stmt *selectstmt = nil;<br /> <br /> if (selectstmt == nil) <br /> {<br /> returnValue = sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL);<br /> }<br /> <br /> sqlite3_bind_int(selectstmt, 1, spotId);<br /> //NSLog(@"erreur %i et spot num %i", huh, spotId);<br /> <br /> while(sqlite3_step(selectstmt) == SQLITE_ROW)<br /> {<br /> //NSLog(@"jsui dans le while");<br /> NSInteger primaryKey = sqlite3_column_int(selectstmt, 1);<br /> [self initWithPrimaryKey:primaryKey];<br /> <br /> self.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];<br /> self.description = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];<br /> self.bestTide = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];<br /> self.bestSwell = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];<br /> self.bestWind = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 8)];<br /> self.type = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 9)];<br /> <br /> }<br /> <br /> //reset the statement, so it can be used again<br /> sqlite3_reset(selectstmt);<br /> }<br /> <br /> else <br /> {<br /> NSLog(@"jsui anglais");<br /> const char *sql = "select * from spot_en where SPOT_ID = ?";<br /> <br /> int returnValue;<br /> sqlite3_stmt *selectstmt = nil;<br /> <br /> if (selectstmt == nil) <br /> {<br /> returnValue = sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL);<br /> }<br /> <br /> sqlite3_bind_int(selectstmt, 1, spotId);<br /> //NSLog(@"erreur %i et spot num %i", huh, spotId);<br /> <br /> while(sqlite3_step(selectstmt) == SQLITE_ROW)<br /> {<br /> //NSLog(@"jsui dans le while");<br /> NSInteger primaryKey = sqlite3_column_int(selectstmt, 1);<br /> [self initWithPrimaryKey:primaryKey];<br /> <br /> self.name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)];<br /> self.description = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];<br /> self.bestTide = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 6)];<br /> self.bestSwell = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 7)];<br /> self.bestWind = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 8)];<br /> self.type = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 9)];<br /> <br /> }<br /> <br /> //reset the statement, so it can be used again<br /> sqlite3_reset(selectstmt);<br /> }<br /> <br /> <br /> }<br /> else<br /> NSLog(@"non connecte");<br /> sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.<br />}<br /><br />@end
Ma variable idLocale prend bien la valeur "fr" par exemple mais je ne rentre jamais dans mon if, il va toujours dans le dernier else.
Au départ je n'avais que des if et un else final, la j'ai essayé avec des else if mais rien n'y fait, toujours le meme résultat.
Quelqu'un pourrait me donner un coup de main ?
Merci encore
:brule:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Ca marche pas mieux ?
Il faut utiliser ([idLocale isEqualToString:@fr] == TRUE).
Eric
Pour une fois que je connais la réponse, je me fais griller sur le fil.
Eric
c'est con mais quand on le sait pas..
Au passage pourquoi cela marche uniquement avec equalToString ? il compare quoi sinon ?
Le pointeur sur la NSString.
Quand tu tapes @fr ce que fait le compilateur, c'est instancier une NSString.
Quand tu écris if(maChaine == @fr), les deux pointeurs sont différents.
Tout se paye un jour, eh, eh ,éééééh >:D
En même temps si c'est pour balancer ce genre de truc... En ObjC il vaut mieux utiliser YES plutôt que TRUE... et == TRUE peut ne pas fonctionner si la méthode ne retourne pas TRUE ou YES exactement.
La méthode pourrait retrouver 789639, ce qui veut dire YES en C, mais qui n'est pas égal à YES... Au pire, la comparaison valable c'est "!= NO" ou "== NO", car "faux" en C est toujours représenté par zéro, ce qui est égal à NO ou FALSE.
Mais dans tous les cas, non seulement c'est moche mais en plus c'est inutile et ça n'apporte aucune information complémentaire... Il vaut donc mieux n'utiliser ==, !=, <=, >=, < ou > pour les types utilisées comme des valeurs numériques et !, &&, || pour tout ce qui est de type booléen.
Le C ne vous force en rien à utiliser ces conventions, mais le bon sens si, ne serait-ce que pour la cohérence et la clarté du code.
Maintenant je sais qu'en ObjC, on peut avoir des réponses du style, p't ben qu'oui, p't ben que nan...
Et le bon sens, s'il n'y en avait qu'un seul, cela se saurait...
Quant à la clarté du code en C ?? mais là je lance la polémique n'est-ce pas.
Eric
Le problème du C, c'est qu'il laisse pas mal de liberté notamment pour le typage des variables, ce n'est pas comme en C# où if() n'accepte que le type "bool" ou qu'on est obligé de caster un double en int pour pouvoir le mettre dans une variable de type "int"...
Mais sachant tout de même qu'en général le code est plus souvent lu qu'écrit, il vaut mieux définir des conventions et les utiliser pour ne pas se perdre.
Et ObjC étant un surensemble du C, les mêmes règles s'appliquent.
Et pour info FALSE/TRUE sont de types "Boolean" et sont définis dans CoreFoundation, et à l'inverse de "BOOL" défini dans ObjC, le type Boolean est défini comme un "unsigned char", alors que BOOL est explicitement un "signed char" :
(Ce qui n'est pas une raison pour ne pas chercher une bonne heure au débogueur et dans la doc avant de poser une question ici).
Remarque en passant:
if (maChaine == "toto")
fait bien une comparaison de chaà®nes dans d'autres langages, par exemple en Python.
La fonction strcmp est sensée renvoyer 0 si les chaà®nes sont égales donc
strcmp(string1,string2)== FALSE détecte si les chaà®nes sont égales
et on pourrait faire l'erreur de penser que
strcmp(string1,string2)== TRUE
détecte si les chaà®nes sont différentes. Il n'en est rien car le contraire de FALSE n'est pas (toujours) TRUE.
Résultat :