J'ai honte de cette syntaxe [Résolu]

Signaler
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
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

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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;
}
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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)
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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?
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
pas | pour un 'ou', mais ||.

+2(p - n)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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") )
}
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

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.)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
1 | 2 =3 (=00000001 | 00000010 =00000011)
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

Ooops mes excuses... merci pour la précision vecchio56
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

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 !!)
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

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 ??
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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 ||
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
georgeduke >> tu peux mettre for(int i = 0; i <9; i++)

vecchio56 >> && est un ET logique. J'aimerais bien comprendre cette optimisation.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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?
Messages postés
167
Date d'inscription
dimanche 6 février 2005
Statut
Membre
Dernière intervention
13 avril 2007

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