Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2772 connectés 

  FORUM HardWare.fr
  Programmation
  C

  C qui peut m'expliquer le pourquoi ??

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

C qui peut m'expliquer le pourquoi ??

n°1055822
fullnight
Posté le 21-04-2005 à 22:18:41  profilanswer
 

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
mood
Publicité
Posté le 21-04-2005 à 22:18:41  profilanswer
 

n°1055829
WhatDe
Posté le 21-04-2005 à 22:22:11  profilanswer
 

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]
n°1055832
fullnight
Posté le 21-04-2005 à 22:24:22  profilanswer
 

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

n°1055836
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:26:43  profilanswer
 

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...
n°1055840
fullnight
Posté le 21-04-2005 à 22:29:25  profilanswer
 

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
n°1055843
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:30:38  profilanswer
 

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...
n°1055846
fullnight
Posté le 21-04-2005 à 22:31:35  profilanswer
 

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

n°1055852
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:34:34  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1055856
push
/dev/random
Posté le 21-04-2005 à 22:36:03  profilanswer
 

cf priorité des opérateurs.

n°1055857
fullnight
Posté le 21-04-2005 à 22:36:39  profilanswer
 

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??

mood
Publicité
Posté le 21-04-2005 à 22:36:39  profilanswer
 

n°1055861
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:37:58  profilanswer
 

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...
n°1055864
fullnight
Posté le 21-04-2005 à 22:39:21  profilanswer
 

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
n°1055865
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:39:35  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1055868
fullnight
Posté le 21-04-2005 à 22:40:15  profilanswer
 

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

n°1055874
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:41:40  profilanswer
 

quand je dit c'est pareil je veux juste dire

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


---------------
Nos estans firs di nosse pitite patreye...
n°1055876
fullnight
Posté le 21-04-2005 à 22:42:02  profilanswer
 

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

n°1055878
fullnight
Posté le 21-04-2005 à 22:42:30  profilanswer
 

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
n°1055881
WhatDe
Posté le 21-04-2005 à 22:43:14  profilanswer
 

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]
n°1055882
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-04-2005 à 22:43:50  profilanswer
 

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/
n°1055884
fullnight
Posté le 21-04-2005 à 22:43:59  profilanswer
 

whatde  
 
 
ca modifie quoi alors?


Message édité par fullnight le 21-04-2005 à 22:44:26
n°1055885
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:44:00  profilanswer
 

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...
n°1055888
WhatDe
Posté le 21-04-2005 à 22:44:46  profilanswer
 

fullnight a écrit :

whatde  
 
 
ca modifie quoi alors?


Rien du tout.


---------------
[:whatde]
n°1055889
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:44:55  profilanswer
 

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...
n°1055891
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-04-2005 à 22:45:28  profilanswer
 

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/
n°1055893
fullnight
Posté le 21-04-2005 à 22:45:55  profilanswer
 

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
n°1055894
WhatDe
Posté le 21-04-2005 à 22:46:26  profilanswer
 

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]
n°1055896
fullnight
Posté le 21-04-2005 à 22:47:05  profilanswer
 

finteur !
c ske je fais justement

n°1055898
KangOl
Profil : pointeur
Posté le 21-04-2005 à 22:47:24  profilanswer
 

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...
n°1055911
Emmanuel D​elahaye
C is a sharp tool
Posté le 21-04-2005 à 22:52:05  profilanswer
 

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/
n°1055923
fullnight
Posté le 21-04-2005 à 22:57:52  profilanswer
 

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 !

n°1055928
KangOl
Profil : pointeur
Posté le 21-04-2005 à 23:00:49  profilanswer
 

post/pre-incrémentation :spamafote:


---------------
Nos estans firs di nosse pitite patreye...
n°1055941
fullnight
Posté le 21-04-2005 à 23:07:17  profilanswer
 

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
n°1055944
KangOl
Profil : pointeur
Posté le 21-04-2005 à 23:09:06  profilanswer
 

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


---------------
Nos estans firs di nosse pitite patreye...
n°1055945
fullnight
Posté le 21-04-2005 à 23:10:25  profilanswer
 

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 )

n°1055956
KangOl
Profil : pointeur
Posté le 21-04-2005 à 23:13:15  profilanswer
 

*ch-2 alors et fait pas chier :o


---------------
Nos estans firs di nosse pitite patreye...
n°1055959
fullnight
Posté le 21-04-2005 à 23:17:34  profilanswer
 

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?)

n°1055963
fullnight
Posté le 21-04-2005 à 23:19:08  profilanswer
 

[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

n°1055966
++fab
victime du syndrome IH
Posté le 21-04-2005 à 23:22:17  profilanswer
 

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 */

n°1055968
fullnight
Posté le 21-04-2005 à 23:26:57  profilanswer
 

++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
n°1055977
Tarabiscot​e
Posté le 21-04-2005 à 23:37:12  profilanswer
 

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.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  C qui peut m'expliquer le pourquoi ??

 

Sujets relatifs
lien de connexion deconnexion. Trop dur a expliquer là[PHP/MYSQL/DELPHI] Test 5 sec et repond ! (trop dur a expliquer)
script photo : difficile à expliquer (dsl pour le titre)Expliquer la transformee de fourier/digitalisation
[débutant total]trop dur a expliquer, venez plutot voir[ASM] qui peut m'expliquer ce prog ?
Des arguments pour expliquer que les normes, c'est bien ?[C]Peut m'expliquer ce tt petit morceau de code SVP ? merci bcp :)
Pouvez-vous m'expliquer moi ce code svp ?[PHP]Dur à expliquer
Plus de sujets relatifs à : C qui peut m'expliquer le pourquoi ??


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)