Une ligne de commande avec FOR que je comprends pas - C - Programmation
Marsh Posté le 29-03-2005 à 20:41:13
Surement que L est la longueur de la chaine que tu vas recuperer sur ta ligne de commande, non ?
Marsh Posté le 29-03-2005 à 20:48:08
Ou sinon, c'est peut etre :
avec
for ( <init.> ; <cond. répétition> ; <compteur> )
Pour L=0 on incrémente, tant que TXT[L] ... je ne sais pas cette condition de répitition!
Marsh Posté le 29-03-2005 à 20:49:42
WhatDe a écrit : Tant que TXT[L] est vrai. |
Bref tant que TXT[0] != '\0' ...
Marsh Posté le 29-03-2005 à 20:51:27
WhatDe a écrit : Tant que TXT[L] est vrai. |
Ok merci !
Mais comment peut il etre vrai ou faux? C'est pas encore concret...
TXT[L] est bien un caractere ?
Marsh Posté le 29-03-2005 à 21:14:33
WhatDe a écrit : Bref tant que TXT[0] != '\0' ... |
ce n'est pas plutot tant que TXT[L] != '\0' ?
Car TXT[0] = caractere contenue en 0, dans la premiere case (premiere lettre de la chaine) donc il est fixe.
Pourquoi on ecrit pas plutot :
for (L=0; TXT[L] != '\0'; L++)
?
Marsh Posté le 29-03-2005 à 21:52:19
zaynyy a écrit : Ok merci ! |
Oui, mais quand il vaut 0 (ou '\0, c'est pareil) il est 'faux' (En C : 0=faux et <>0=vrai). Il vaut 0 quand on tombe sur le marqueur de fin de chaine.
Marsh Posté le 29-03-2005 à 21:54:04
zaynyy a écrit :
|
On pourrait. Mais les codeurs C aiment bien le code compact... Parfois ça devient illisible...
Marsh Posté le 29-03-2005 à 21:54:42
zaynyy a écrit : |
Parce que c'est pareil, et ça fait 8 caractères en moins
Marsh Posté le 29-03-2005 à 22:17:33
Humm OK, bien reçu.
Donc TXT[L] dans cette ligne de commande peut etre traduite par "tant que TXT[L] est vrai, soit tant qu'il n'est pas égal à 0, marqueur de fin de chaine" .
Marsh Posté le 30-03-2005 à 02:50:03
zaynyy a écrit : Humm OK, bien reçu. |
Exact
En fin de boucle, L contient le nb de caractères significatifs de "TXT" (sans compter l'octet valant '\0')
Marsh Posté le 30-03-2005 à 04:24:17
matafan a écrit : Il connaissait pas strlen() le gars ? |
nettement moins performant
Marsh Posté le 30-03-2005 à 08:28:41
zaynyy a écrit : |
Te plains pas, il aurait même pu écrire
for (L=0; TXT[L++]; )
voire, s'il est vraiment tordu
L = 0;
for (;L[TXT++]; )
(tiens, un ancien jocebug qui est revenu, le ; final a disparu si je ne mets pas d'espace avant la parenthèse)
JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire.
Marsh Posté le 30-03-2005 à 08:58:23
el muchacho a écrit : |
|
Citation : JagStang > en quoi strlen est moins performant ? Je dirais plutôt le contraire. |
Bof, je dirais que c'est pareil mais tant qu'on a pas fait les mesures...
Marsh Posté le 30-03-2005 à 09:47:32
Emmanuel Delahaye a écrit :
|
Oui. Ca dépend des libs, je crois que certaines mettent une pincée d'asm derrière. Par contre, il est vrai que faire un strlen pour faire un strncpy derrière n'est pas forcément une bonne idée vu qu'on parcourt deux fois la même chaine.
Marsh Posté le 30-03-2005 à 15:41:14
Emmanuel Delahaye a écrit :
|
ben tu parcours une fois la chaine pour trouver la len, puis une autre fois pour modifier.
Marsh Posté le 30-03-2005 à 15:56:32
JagStang, stp explique ce qui te fais dire que strlen est "nettement moins performant".
Marsh Posté le 30-03-2005 à 16:31:46
je t'explique comme je vois la chose.
strlen parcours la chaine pour trouver sa taille (n itérations)
ensuite, tu parcours de 0 à strlen()-1 (à nouveau n itérations)
==> 2n
tandis que si tu te contente de faire ce test, tu ne fais que n itérations.
tout ceci valable sous réserver que la taille de la chaine ne peut être connue par le compilateur ou l'executable sans parcourir celle-ci à la recherche de '\0'
Marsh Posté le 31-03-2005 à 19:36:37
jagstang a écrit : je t'explique comme je vois la chose. |
Le top du top:
for (L=0; L < strlen(TXT); L++) |
G gagné...
Marsh Posté le 31-03-2005 à 22:02:54
Faut gaffer avec les compilos de merde qui te retestent strlen à chaque bouclage
Marsh Posté le 01-04-2005 à 09:02:23
Sve@r a écrit : Le top du top:
|
Ah oui, là effectivement... le pire, c'est qu'on tombe de temps en temps sur ce genre de code.
Citation : Faut gaffer avec les compilos de merde qui te retestent strlen à chaque bouclage |
A mon avis, la majorité des compilos vont te recalculer strlen à chaque tour. Le compilo ne peut pas prévoir toutes les conneries que tu écris.
Marsh Posté le 01-04-2005 à 09:37:41
Surtout que la longueur de la chaine pourrait changer dans la boucle.
Marsh Posté le 01-04-2005 à 09:44:13
Vinx a écrit : Surtout que la longueur de la chaine pourrait changer dans la boucle. |
En fait, le problème est là. Si la longueur change, on est obligé de laiser le strlen() dans le test, à moins de gérer la longueur à la main avec une variable...
Par contre, si la taille est fixe, il est préférable d'appeler le strlen() avant et de mettre la variable (invariante) dans la boucle:
|
Marsh Posté le 01-04-2005 à 10:36:48
el muchacho a écrit :
|
Genre le compilo .NET te sort le test de la boucle en passant par une variable temporaire
Marsh Posté le 01-04-2005 à 12:59:33
Citation : je t'explique comme je vois la chose. |
Bonjour
Je ne parviens pas à saisir l'intéret de parcourir deux fois la chaine pour calculer sa longueur.
Je pense que le temps d'exécution doit être le même avec un léger avantage sur la boucle si le compilateur est bon car il y a l'économie d'un appel de fonction et de gestion du cadre de pile.
Quand on en est à ce genre d'optimisation qui ne favorise pas la lisibilité du code, il est temps de passer à l'assembleur.
Cordialement
Marsh Posté le 01-04-2005 à 13:04:37
db__ a écrit : Bonjour |
justement, y'en a pas.
le fait de ne pas coder en ASM ne justifie pas un minimum d'optimisation
Amicalement
Marsh Posté le 01-04-2005 à 13:14:53
pour JagStang
Qu'est-ce qui te fait penser que strlen parcourt 2 fois la chaine ?
Il la parcourt une fois pour chercher le 0 ce qui lui permet de conaitre la longueur soit par itération d'un compteur pendant le parcourt soit par différence de pointeur entre l'arrivé et le départ.
A quoi peut bien servir le deuxième passage ?
Marsh Posté le 01-04-2005 à 13:20:39
strlen une fois, la boucle une seconde fois.
la je parle de la version
taille = strlen(chaine) // n fois
for i=0 to taille // n fois
Marsh Posté le 01-04-2005 à 13:21:10
donc, pas justifié de passer 2 fois bien entendu. j'espère qu'on s'est compris
Marsh Posté le 01-04-2005 à 17:46:53
C'est clair, mais c'est pas ce qui est fait ici... Il parcourt une fois la chaine a la main, pour trouver la longueur. En utilisant strlen c'est strlen qui aurait parcouru une fois la chaine, pour trouver la longueur. Comme il ne profite pas de son parcours pour faire autre chose avec sa chaine, strlen etait la meilleure solution, point. Evidemment si on a autre a faire en parcourant la chaine, il vaut evidemment mieux le faire a la main et s'arreter sur le '\0' final... Ce n'est pas le cas ici.
Marsh Posté le 29-03-2005 à 20:37:54
Bonsoir,
désolé mais je ne savais pas ou mettre ce topic.
Il y a une ligne de commande que je n'arrive pas a saisir :
#include <stdio.h>
main()
{
/* Déclarations */
char TXT[201]; /* chaîne donnée */
int I,J; /* indices courants */
int L; /* longueur de la chaîne */
int C; /* compteur des lettres 'e' */
int AIDE; /* pour l'échange des caractères */
/* Saisie des données */
printf("Entrez une ligne de texte (max.200 caractères) :\n" );
gets(TXT); /* L'utilisation de scanf est impossible pour */
/* lire une phrase contenant un nombre variable de mots. */
/* a) Compter les caractères */
/* La marque de fin de chaîne '\0' est */
/* utilisée comme condition d'arrêt. */
for (L=0; TXT[L]; L++)
;
printf("Le texte est composé de %d caractères.\n",L);
getch();
return 0;
}
La boucle for se traduit comment svp?
Moi je lis, "pour l'entier L allant de 0 au caractere contenu en TXT[L] par pas de 1"
Et ce je ne comprends pas comment on peut partir d'un entier et arriver a un type caractere.
J'ai surement mal traduit cette ligne.
Cela se lit peut être pour le charactere contenu en TXT[0] au charactere contenue en TXT[L] non?
Message édité par zaynyy le 29-03-2005 à 20:41:27