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....)
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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:
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
georgeduke
Messages postés167Date d'inscriptiondimanche 6 février 2005StatutMembreDernière intervention13 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 !!)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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 ||
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 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?