J'ai honte de cette syntaxe

Résolu
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007 - 24 juil. 2005 à 14:41
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 24 juil. 2005 à 20:16
En fait, je n'ai pas de problème si ce n'est que j'ai codé salement une fonction et j'en suis pas très fier...

voilà ma fonction :



bool rep_mod_existe()

{

if ( fichier_existe("anims") | fichier_existe("diff") |

fichier_existe("maps") | fichier_existe("missions") |

fichier_existe("models") | fichier_existe("records") |

fichier_existe("sounds") | fichier_existe("system") |

fichier_existe("tables") )

{

return true;

}

return false;

}

Pourriez vous m'aider à améliorer ce bout de code ? (en gros
stocker toutes les chaînes dans une variable et faire une boucle pour
chaque chaine de la variable ; je sais le faire en C# mais en cpp : je
découvre un peu....)

24 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 15:02
Pardon, si tu veux faire une boucle:

bool rep_mod_existe()
{
char* files[] = {"anims", "diff", "maps", "missions", "models", "records", "sounds", "system", "tables"};
for(int i = 0; i < sizeof files / sizeof files[0]; i++)
if(fichier_existe(files[i])) return true;
return false;
}
3
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 17:29
Salut,

le || est un ou logique alors que | est un ou binaire. avec le premier,
les operandes peuvent avoir les valeurs FALSE (0) ou TRUE (different de
0). Avec le deuxième, les operandes sont des valeurs quelconques.Voici
un exemple:

1 || 2 1 ( TRUE || TRUE TRUE)

1 | 2 =3 (=00000001 | 00000010)
3
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 18:49
Dans ton cas, les 2 fonctionnent bien. Mais il faut prendre de bonnes
habitudes en programmation. En lisant un code source, on voit ||
dans les operations logiques et | dans les operations binaires. Ca aide
donc à mieux lire et comprendre. Certes, on peut mettre | à
la place de || dans une opération logique alors qu'on ne peut jamais
mettre || dans une opération binaire. Un exemple:

valeur1=0

valeur2=1

valeur3=2

valeur1 || valeur2 || valeur2 = different de 0 donc TRUE

valeur1 | valeur2 | valeur3 = 3 donc TRUE



Mais si on veut récupérer la combinaison de bits des 3 opérandes avec || on obtient 1. Ce qui est faux.
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 19:10
Pour enlever la warning, je verrais plutot
for(unsigned int i = 0; i < sizeof files / sizeof files[0]; i++)
c'est quand même plus propre tu crois pas?
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 19:51
files est un tableau de char*, donc un tableau de int en gros. sizeof files donne la taille en octet, soit 36. On divise par la taille des éléments (le premier par exemple) ce qui donne 9
sizeof n'est pas appelé à l'exécution. Tout est connu au moment de la compilation. Quand tu écris sizeof files / sizeof files[0], le compilo va générer directement 9. C'est comme si tu écrit int a = 2+2; il va te mettre 4 et pas un add.
D'ailleurs aujourd'hui les compilo font des optimisations beaucoup plus poussées que ca (vc++ en tous cas)
Tout ca pour dire qu'a l'exécution c'est du pareil au même
3
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 2
24 juil. 2005 à 14:46
pas | pour un 'ou', mais ||.

+2(p - n)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 14:59
tu mets directement le return:

bool rep_mod_existe()
{
return ( fichier_existe("anims") || fichier_existe("diff") ||
fichier_existe("maps") || fichier_existe("missions") ||
fichier_existe("models") || fichier_existe("records") ||
fichier_existe("sounds") || fichier_existe("system") ||
fichier_existe("tables") )
}
0
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 juil. 2005 à 16:33
Ah merci !! Vecchio56 !! C'est tout à fait ça que je ne savais pas faire !!



(AlexMAN je ne voulais pas faire de "ou" exclusifs c'est pour ça que j'ai mis qu'une seule barre droite.)
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 16:42
le || n'est pas un ou exclusif, il permet juste d'optimiser: dès qu'un des tests est vrai, on sait que le ou est vrai. Avec | tous les tests seront vrais. La boucle que je t'ai donnée a la même sémantique que le || puisqu'on arrête dès qu'un test est vrai
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 17:30
1 | 2 =3 (=00000001 | 00000010 =00000011)
0
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 juil. 2005 à 18:10
Ooops mes excuses... merci pour la précision vecchio56
0
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 juil. 2005 à 18:16
Donc au final, que ça soit un ou "logique" ou un ou "binaire" ; ça
fonctionne ! Et le "ou logique" n'est pas plus optimisé que l'autre
"ou"... Je comprend mieux car je n'avais aucun probleme avec
l'utilisation du ou binaire. (hormis la syntaxe qui était nule -merci
encore vecchio56 ça fonctionne nickel et c'est beaucoup plus propre,
d'autant plus que je réutiliserais souvent ces chaînes de caractères !!)
0
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 juil. 2005 à 18:37
Par contre, j'ai un warning du compilo :

In function `bool rep_mod_existe()':

[Warning] comparison between signed and unsigned integer expressions



Alors là je ne comprend pas pourquoi cette alerte ??
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 18:57
Et le ou logique est bien optimisé par le compilateur: les tests inutiles ne sont pas effectués, et on s'en sert souvent, typiquement vérifier un indice avant d'accéder à un tableau:
while(i < max && tab[i] != 0)

Dans ce cas on obtient un comportement différent selon qu'on utilise | ou ||
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 19:03
georgeduke >> tu peux mettre for(int i = 0; i <9; i++)

vecchio56 >> && est un ET logique. J'aimerais bien comprendre cette optimisation.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 19:09
Oui c'était juste pour expliquer qu'on n'utilise pas l'opérateur binaire à la place du logique, on pourrait trouver des exemples avec le OU
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 19:24
vecchio56 >> c'est peut etre plus propre mais plus long.
Puisqu'il connait le nombre exact de noms de fichiers (9), je pense
qu'il n'a pas besoin d'utiliser sizeof() qui retourne un unsigned int.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 13
24 juil. 2005 à 19:27
Ta méthode est peut être plus longue car tu as été obligé de compter combien il y avait de chaines, ce qui prends un certain temps. Plus sérieusement, si les chaines ne changent jamais, son problème de départ n'existe pas, car ca ne sert à rien de faire un boucle ici
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
24 juil. 2005 à 19:34
vecchio56 >> Mais à l'exécution, ma methode est plus rapide car
pas besoin d'appeler sizeof(). C'est à lui de voir la méthode qui lui
convient le mieux. D'ailleurs, je ne suis pas très sûr que sizeof files / sizeof files[0] retournera la bonne valeur. Tu peux nous expliquer ce qui se fait exactement?
0
georgeduke Messages postés 167 Date d'inscription dimanche 6 février 2005 Statut Membre Dernière intervention 13 avril 2007
24 juil. 2005 à 19:53
sizeof files / sizeof files[0] fait fonctionner correctement la fonction. (semble en tout cas)

Je choisie la fonction de vecchio56 car effectivement le nombre de variable risque d'évoluer peut être...



Effectivement si tu pouvais expliquer le "sizeof files / sizeof files[0]" ça serait très sympa
0
Rejoignez-nous