Un if/else qui ne marche pas...

allianallian Membre
03:13 modifié dans API UIKit #1
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

- (void) getInitialDataToDisplay:(NSString *)dbPath andSpotId:(NSInteger)spotId{<br />	<br />	//recuperation de la langue de l&#39;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], &amp;database) == SQLITE_OK) {<br />		<br />		NSLog(idLocale);<br />		<br />		if (idLocale == @&quot;fr&quot;)<br />		{<br />			NSLog(@&quot;jsui francais&quot;);<br />			const char *sql = &quot;select * from spot_fr where SPOT_ID = ?&quot;;<br />			<br />			int returnValue;<br />			sqlite3_stmt *selectstmt = nil;<br />			<br />			if (selectstmt == nil) <br />			{<br />				returnValue = sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL);<br />			}<br />			<br />			sqlite3_bind_int(selectstmt, 1, spotId);<br />			//NSLog(@&quot;erreur %i et spot num %i&quot;, huh, spotId);<br />			<br />			while(sqlite3_step(selectstmt) == SQLITE_ROW)<br />			{<br />				//NSLog(@&quot;jsui dans le while&quot;);<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 == @&quot;es&quot;)<br />		{<br />			NSLog(@&quot;jsui espagnol&quot;);<br />			const char *sql = &quot;select * from spot_es where SPOT_ID = ?&quot;;<br />			<br />			int returnValue;<br />			sqlite3_stmt *selectstmt = nil;<br />			<br />			if (selectstmt == nil) <br />			{<br />				returnValue = sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL);<br />			}<br />			<br />			sqlite3_bind_int(selectstmt, 1, spotId);<br />			//NSLog(@&quot;erreur %i et spot num %i&quot;, huh, spotId);<br />			<br />			while(sqlite3_step(selectstmt) == SQLITE_ROW)<br />			{<br />				//NSLog(@&quot;jsui dans le while&quot;);<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 == @&quot;pt&quot;)<br />		{<br />			NSLog(@&quot;jsui portugais&quot;);<br />			const char *sql = &quot;select * from spot_pt where SPOT_ID = ?&quot;;<br />			<br />			int returnValue;<br />			sqlite3_stmt *selectstmt = nil;<br />			<br />			if (selectstmt == nil) <br />			{<br />				returnValue = sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL);<br />			}<br />			<br />			sqlite3_bind_int(selectstmt, 1, spotId);<br />			//NSLog(@&quot;erreur %i et spot num %i&quot;, huh, spotId);<br />			<br />			while(sqlite3_step(selectstmt) == SQLITE_ROW)<br />			{<br />				//NSLog(@&quot;jsui dans le while&quot;);<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(@&quot;jsui anglais&quot;);<br />			const char *sql = &quot;select * from spot_en where SPOT_ID = ?&quot;;<br />			<br />			int returnValue;<br />			sqlite3_stmt *selectstmt = nil;<br />			<br />			if (selectstmt == nil) <br />			{<br />				returnValue = sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL);<br />			}<br />			<br />			sqlite3_bind_int(selectstmt, 1, spotId);<br />			//NSLog(@&quot;erreur %i et spot num %i&quot;, huh, spotId);<br />			<br />			while(sqlite3_step(selectstmt) == SQLITE_ROW)<br />			{<br />				//NSLog(@&quot;jsui dans le while&quot;);<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(@&quot;non connecte&quot;);<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:

Réponses

  • olofolof Membre
    03:13 modifié #2
    et si tu fais :

    <br />if ([idLocale isEqualToString:@&quot;fr&quot;])<br />
    


    Ca marche pas mieux ?
  • Eric P.Eric P. Membre
    03:13 modifié #3
    Bonjour,

    Il faut utiliser ([idLocale isEqualToString:@fr] == TRUE).

    Eric
  • Eric P.Eric P. Membre
    mai 2009 modifié #4
    Haaa

    Pour une fois que je connais la réponse, je me fais griller sur le fil.

    Eric

  • allianallian Membre
    03:13 modifié #5
    youpiiiii ca marche merci beaucoup.
    c'est con mais quand on le sait pas..
    Au passage pourquoi cela marche uniquement avec equalToString ? il compare quoi sinon ?
  • CéroceCéroce Membre, Modérateur
    mai 2009 modifié #6
    dans 1242143116:

    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.
  • allianallian Membre
    03:13 modifié #7
    cool merci pour la précision. Je le serais pour l'avenir.
  • Philippe49Philippe49 Membre
    03:13 modifié #8
    Remarque que c'est pareil en C . Le programme ci-dessous répond "chaà®nes différentes" car ce sont les adresses qui sont comparées, pas les contenus.
    &nbsp; &nbsp;  char s1&#91;]=&quot;Bonjour&quot;;<br />&nbsp; &nbsp;  char s2[10];<br />&nbsp; &nbsp;  strcpy(s2,s1);<br />&nbsp; &nbsp;  if(s2==s1) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; puts(&quot;chaà®nes égales&quot;);<br />&nbsp; &nbsp;  } else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; puts(&quot;chaà®nes différentes&quot;);<br />&nbsp; &nbsp;  }
    
  • allianallian Membre
    03:13 modifié #9
    Oue tu as raison, mais j'ai jamais trop suivi en cours de C  :)
  • Philippe49Philippe49 Membre
    03:13 modifié #10
    dans 1242205607:

    Oue tu as raison, mais j'ai jamais trop suivi en cours de C  :)

    Tout se paye un jour, eh, eh ,éééééh  >:D
  • allianallian Membre
    03:13 modifié #11
    c'est sur !!  :o
  • psychoh13psychoh13 Mothership Developer Membre
    03:13 modifié #12
    dans 1242142787:

    Il faut utiliser ([idLocale isEqualToString:@fr] == TRUE).


    dans 1242142865:

    Pour une fois que je connais la réponse, je me fais griller sur le fil.


    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.
  • Eric P.Eric P. Membre
    03:13 modifié #13
    Merci psychoh13 pour cette remarque didactique et agréable.

    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
  • psychoh13psychoh13 Mothership Developer Membre
    03:13 modifié #14
    >:)

    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" :
    <br />typedef signed&nbsp; &nbsp; char BOOL;<br />typedef unsigned char Boolean;<br />
    

  • CéroceCéroce Membre, Modérateur
    03:13 modifié #15
    Programmer Cocoa demande beaucoup de connaissances dans des domaines larges et variés. Personne ne peut prétendre connaà®tre toutes les subtilités: c'est une bonne raison pour être à  la fois indulgent et modeste.

    (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.

  • Philippe49Philippe49 Membre
    03:13 modifié #16
    Expérience en C (et donc en Objective-C) illustrant ce que dit Psycho :

    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.

    <br />#include &lt;stdio.h&gt;<br />#define TRUE 1<br />#define FALSE 0<br /><br />int main(void) {<br />	// en C un nombre non nul est vrai, 0 est faux.<br />	if(12) puts(&quot;12 est vrai&quot;);<br />	if(2009) puts(&quot;2009 est vrai&quot;);<br />	if( ! 0 ) puts(&quot;0 est faux&quot;);<br />	<br />	printf(&quot;%d&#092;n&quot; , strcmp(&quot;abc&quot;,&quot;abd&quot;) );<br />	printf(&quot;%d&#092;n&quot; , strcmp(&quot;abc&quot;,&quot;aab&quot;) );<br /><br />	<br />	if( strcmp(&quot;abc&quot;,&quot;abd&quot; ) == TRUE ) {<br />		printf(&quot;les chaà®nes %s et %s sont différentes&#092;n&quot;,&quot;abc&quot;,&quot;aab&quot;);<br />	} else {<br />		printf(&quot;les chaà®nes %s et %s sont égales&#092;n&quot;,&quot;abc&quot;,&quot;aab&quot;);<br />	}<br />	return 0;<br />}<br />
    


    Résultat :
    <br />% gcc pgm.c -o pgm<br />% pgm<br />12 est vrai<br />2009 est vrai<br />0 est faux<br />-1<br />1<br />les chaà®nes abc et aab sont égales<br />% <br />
    



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