C qui peut m'expliquer le pourquoi ??

C qui peut m'expliquer le pourquoi ?? - C - Programmation

Marsh Posté le 21-04-2005 à 22:18:41    

http://membres.lycos.fr/zonefullnight/arf.JPG
le résultat à l'affichage est EDDE
mais pourquoi le deuxieme D ?????
et pourquoi le deuxieme E ???


Message édité par fullnight le 21-04-2005 à 23:44:16
Reply

Marsh Posté le 21-04-2005 à 22:18:41   

Reply

Marsh Posté le 21-04-2005 à 22:22:11    

fullnight a écrit :

le résultat à l'affichage est EDDE
 
mais pourquoi le deuxieme D ?????
et pourquoi le deuxieme E ???
 
 
 
 

Code :
  1. #include "stdio.h"
  2. #include "string.h"
  3. void fct(char *);
  4. void main()
  5. {
  6. char mess[10],*p;
  7. strcpy(mess,"Epb" );
  8. p=mess;
  9. fct(mess);
  10. }
  11. void fct(char *ch)
  12. {
  13. printf("%c%c%c%c\n",*ch,(*ch-1),*ch-1,*ch);
  14. }



*ch pointe vers un caractère.
Si tu veux afficher toute la chaine: %s au lieu de %c


---------------
[:whatde]
Reply

Marsh Posté le 21-04-2005 à 22:24:22    

je ne veux pas afficher toute la chaine !!
 
je veux afficher un caractère !
 
mais je ne comprend pas pq il me sort un DE

Reply

Marsh Posté le 21-04-2005 à 22:26:43    

parce que mess pointe vers le debut de la chaine et que tu imprimes le caractère avant le debut de la chaine...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:29:25    

mais que fait donc *ch-1
 
ca n'a aucun sens  
on est a l'élément [0] du vecteur
soit on décrémente le ptr et on passe a l'élément du vecteur v[-1] ( impossible )
soit on décrémente le caractère et on passe de E a D
t'es d'accord avec moi?


Message édité par fullnight le 21-04-2005 à 22:31:00
Reply

Marsh Posté le 21-04-2005 à 22:30:38    

fullnight a écrit :

ca n'a aucun sens  
on est a l'élément [0] du vecteur
soit on décrémente le ptr et on passe a l'élément du vecteur v[-1] ( impossible )
soit on décrémente le caractère et on passe de E a D
t'es d'accord avec moi?


c'est effectivement pour ca :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:31:35    

on est d'accord pour le 1er D de EDDE
 
mais c'est le second que je ne comprend pas !!

Reply

Marsh Posté le 21-04-2005 à 22:34:34    

c'est la meme chose :o
 
et pour info, v[-1] est possible :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:36:03    

cf priorité des opérateurs.

Reply

Marsh Posté le 21-04-2005 à 22:36:39    

dans un vecteur on commence a zero
 
ca m'étonne qu'on puisse tripoter a -1
 
g jamais essayé mais soit, la n'est pas le problème..
 
 
 
 
si tu dis que c'est la même chose
 
alors le E est passé a D
 
par un phénomène de -1 du code ascii de la lettre E !
ce qui donne le D  
 
et comme tu dis que c pareil
 
l'affichage suivant doit faire pareil.. cad -1 au code ascii de D
 
et donc afficher C !!
 
hors c pas le cas
 
pq??

Reply

Marsh Posté le 21-04-2005 à 22:36:39   

Reply

Marsh Posté le 21-04-2005 à 22:37:58    

fullnight a écrit :

dans un vecteur on commence a zero
 
ca m'étonne qu'on puisse tripoter a -1
 
g jamais essayé mais soit, la n'est pas le problème..
 
 
 
 
si tu dis que c'est la même chose
 
alors le E est passé a D
 
par un phénomène de -1 du code ascii de la lettre E !
ce qui donne le D  
 
et comme tu dis que c pareil
 
l'affichage suivant doit faire pareil.. cad -1 au code ascii de D
 
et donc afficher C !!
 
hors c pas le cas
 
pq??


arrete de boire...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:39:21    

jusqu'a preuve du contraire
 
tu n'as rien compris ni même rien expliqué de correct..puisque je n'ai toujours pas ma réponse.
 
j bois pas


Message édité par fullnight le 21-04-2005 à 22:39:41
Reply

Marsh Posté le 21-04-2005 à 22:39:35    

explique moi pourquoi il devrait afficher "C"...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:40:15    

pas de problèmes je t'explique !
 
ca s'appelle suivre ton raisonnement
tu dis que c "pareil"

Reply

Marsh Posté le 21-04-2005 à 22:41:40    

quand je dit c'est pareil je veux juste dire

(*ch-1) == *ch-1


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:42:02    

ca se passe en 4 étapes : on démarre avec E
 
1/ *ch              va afficher le premier E
2/ (*ch-1)          va afficher E-1   donc D
3/ *ch-1            devrait faire D-1 donc C
4/ *ch              devrait afficher C

Reply

Marsh Posté le 21-04-2005 à 22:42:30    

je sais que c'est ce que tu voulais dire.
 
donc .. ca devrait ENCORE enlever 1 au caract.. mais il le fait pas


Message édité par fullnight le 21-04-2005 à 22:43:30
Reply

Marsh Posté le 21-04-2005 à 22:43:14    

fullnight a écrit :

ca se passe en 4 étapes : on démarre avec E
 
1/ *ch              va afficher le premier E
2/ (*ch-1)          va afficher E-1   donc D
3/ *ch-1            devrait faire D-1 donc C
4/ *ch              devrait afficher C


Ca ne modifie pas *ch heh coco.


---------------
[:whatde]
Reply

Marsh Posté le 21-04-2005 à 22:43:50    

KangOl a écrit :

parce que mess pointe vers le debut de la chaine et que tu imprimes le caractère avant le debut de la chaine...


Non.

(*ch - 1) != *(ch - 1)



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-04-2005 à 22:43:59    

whatde  
 
 
ca modifie quoi alors?


Message édité par fullnight le 21-04-2005 à 22:44:26
Reply

Marsh Posté le 21-04-2005 à 22:44:00    

fullnight a écrit :

ca se passe en 4 étapes : on démarre avec E
 
1/ *ch              va afficher le premier E
2/ (*ch-1)          va afficher E-1   donc D
3/ *ch-1            devrait faire D-1 donc C
4/ *ch              devrait afficher C


voila la différence : ca affiche, ca modifie pas...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:44:46    

fullnight a écrit :

whatde  
 
 
ca modifie quoi alors?


Rien du tout.


---------------
[:whatde]
Reply

Marsh Posté le 21-04-2005 à 22:44:55    

Emmanuel Delahaye a écrit :

Non.

(*ch - 1) != *(ch - 1)



effectivement, je me suis appercu de mon erreur apres et j'ai pas penser a éditer...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:45:28    

fullnight a écrit :

mais que fait donc *ch-1


Pareil que (*ch) - 1
 
*ch retourne 'E'
 
'E' - 1 = 'D' (en ASCII)


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-04-2005 à 22:45:55    

elle va afficher mais elle ne modifie pas..??
 
keske c que cette histoire de parenthèses "préservante"??
 
 
please arretez de modifier ske j'ai tapé !
 
il s'agit de  
 
(*ch-1)  
puis de
*ch-1


Message édité par fullnight le 21-04-2005 à 22:47:17
Reply

Marsh Posté le 21-04-2005 à 22:46:26    

fullnight a écrit :

elle va afficher mais elle ne modifie pas..??
 
keske c que cette histoire de parenthèses "préservante"??


Va revoir un bon coup les pointeurs.


---------------
[:whatde]
Reply

Marsh Posté le 21-04-2005 à 22:47:05    

finteur !
c ske je fais justement

Reply

Marsh Posté le 21-04-2005 à 22:47:24    

fullnight a écrit :

elle va afficher mais elle ne modifie pas..??
 
keske c que cette histoire de parenthèses "préservante"??


c'est pas a cause, de parenthese...
c'est parce que tu ne fais aucune affectation... (ni de post/pré-incrémentation)


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 22:52:05    

fullnight a écrit :

dans un vecteur on commence a zero


En C, on dit tableau (array)

Citation :

ca m'étonne qu'on puisse tripoter a -1


Exact, c'est interdit, mais ce n'est pas ce que tu fais.

Citation :


alors le E est passé a D
 
par un phénomène de -1 du code ascii de la lettre E !
ce qui donne le D  


Exactement.

Citation :

et comme tu dis que c pareil, l'affichage suivant doit faire pareil.. cad -1 au code ascii de D


Ben non. Reprenons. Tu as une chaine
 
char s[] = "Ebp";
un pointeur char *p = s;
 
et tu te demandes ce que font:


*p
*p-1
(*p-1)
*p


C'est simple.  
 
*p c'est comme p[0], c'est à dire 'E'
*p - 1  c'est comme p[0] - 1, c'est à dire 'D'
(*p - 1)  c'est comme (p[0] - 1), c'est à dire 'D'
*p c'est comme p[0], c'est à dire 'E'
 
Aucun mystère là dedans.  
 
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 21-04-2005 à 22:57:52    

t'es en train de me dire qu'il ne modifie pas le caractère pointé ( pas d'affectation )
 
 
pas d'affectation.. pas d'affectation..
 
cmt faire pour qu'il y'aie affectation ?
le fait de faire -1 a E je veux que ca écrase le D existant !

Reply

Marsh Posté le 21-04-2005 à 23:00:49    

post/pre-incrémentation :spamafote:


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 23:07:17    

donc j'aurais du faire  soit un
 
 ++(*ch-1)        
 
 soit un
 
  (*ch-1)++
 
mhhhhhh sans ca il modifie rien !
 
mais pour "juste afficher le caractere "modifié"" il doit bien modifier qqch quelque part?
y'aurait il une "copie" quelque part?
c étrange


Message édité par fullnight le 21-04-2005 à 23:09:05
Reply

Marsh Posté le 21-04-2005 à 23:09:06    

c'est pas le contenu qu'il faut incrementer, c'est le pointeur...


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 23:10:25    

si j'incrémente le pointeur je me déplace de case
 
c pas ca que je veux
 
moi je veux incrémenter ce que pointe le ptr
donc un nbre ! (le code ascii de la lettre )

Reply

Marsh Posté le 21-04-2005 à 23:13:15    

*ch-2 alors et fait pas chier :o


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 21-04-2005 à 23:17:34    

dans un printf
 
*ch   il y'a E dans la case et il affiche E
--(*ch) fait passer le E en D et affiche D
(*ch)-- fait passer le E en D et affiche E
*ch-1   affiche D alors qu'il y'a E dans la case
(*ch-1) affiche D alors qu'il y'a E dans la case
*(ch-1) affiche E alors qu'il y'a E dans la case ( quel intérêt de faire -1 alors?)

Reply

Marsh Posté le 21-04-2005 à 23:19:08    

[quote]

KangOl a écrit :

*ch-2 alors et fait pas chier :o


 
reste cool dans ton slip y'en a qui ont du mal la comprendure :p

Reply

Marsh Posté le 21-04-2005 à 23:22:17    

je sens naitre la tentation du comportement indéfini (ou défini par l'implémentation, j'ai un doute)
 

Code :
  1. printf("%c%c%c%c\n",*ch,--(*ch),--(*ch),*ch); /* a ne pas faire */

Reply

Marsh Posté le 21-04-2005 à 23:26:57    

++fab a écrit :

je sens naitre la tentation du comportement indéfini (ou défini par l'implémentation, j'ai un doute)
 

Code :
  1. printf("%c%c%c%c\n",*ch,--(*ch),--(*ch),*ch); /* a ne pas faire */



 
 
beuhhh ca donne CCDE
a ne pas faire je l'ai fait qd meme tiens
 
mais keske c que ces conneries  :fou:  :fou:  
 
d'ou vient ce C !! il devait y avoir un E ca dépasse mes compétences de compréhension :cry:


Message édité par fullnight le 21-04-2005 à 23:30:01
Reply

Marsh Posté le 21-04-2005 à 23:37:12    

Vous l'avez trouvé où celui là ?
 
Sinon les paramètres d’une fonction sont évalués dans l'ordre défini par l'implémentation comme dit ci-dessus et dans ce cas c'est de droite à gauche.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed