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

  FORUM HardWare.fr
  Programmation
  C++

  Demande d' aide sur les pointeurs

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Demande d' aide sur les pointeurs

n°1300030
quantic_bl​ade
Posté le 06-02-2006 à 18:51:27  profilanswer
 

Salut à tous et à toutes,
Je ne sais pas comment j'aurais du nommer le topique mais en fait pouvez vous me dire où est l'abbhération informatique là dedans :
 
#include <stdio.h>
 
void CopieChaine(char * pdest, char * psrc)
{
 while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas
      // un ensemble vide
 {
  *pdest = *psrc; // On met la valeur de psrc dans pdest
  *psrc++; // On incremente psrc
  *pdest++; // On incremente pdest
 }
 
 if(*psrc == '\0')
  pdest[*psrc] = '\0';
 
}
 
int main()
{
 char source[512]/*="Un beau dimanche"*/;
 char *destination;
 char indic='o';
 
 do  
 {  
  // on rentre la chaine  
  __fpurge(stdin);
   
  printf("Veuillez rentrer une chaine de caractere :\n" );  
  gets(source);
   
  printf("%s\n", source);
 
  CopieChaine(destination, source);
   
  // on affiche la source et la destination
  printf("Chaine source = %s", source);
  printf("\nChaine destination = %s\n", destination);
 
  __fpurge(stdin);
   
  // on quitte ?  
  fflush(stdin);
   
  printf("'q' pour quitter\n" );  
  scanf("%c", &indic);
   
 }while(indic != 'q');  
 
 return 0;  
}
 
Mon prof prétend que ce qui est écrit en rouge ne devrait théoriquement pas marché, car il nous a dit que *chose renvoie en fait une adresse donc dans cet exemple eh ben , je devrais l'avoir dans l'os, mais si vous compilez ce programme, miracle, il marche à merveille...
 
Pouvez vous m'expliquer en détail ces quelques lignes. Merci...

mood
Publicité
Posté le 06-02-2006 à 18:51:27  profilanswer
 

n°1300046
++fab
victime du syndrome IH
Posté le 06-02-2006 à 19:19:13  profilanswer
 

char* destination ne pointe sur rien de valide, il y a un comportement indéfini.
Sinon, CopieChaine est pour le moins curieuse ...
Ajoutons à cela le double combo de la part du prof apparemment ( gets, fflush(stdin) ), et de plus en plus fort __fpurge(stdin), et j'en oublie ...
Poste dans la cat C, ça va les dérider un peu :)

n°1300056
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-02-2006 à 19:36:25  profilanswer
 

quantic_blade a écrit :

Salut à tous et à toutes,
 
  __fpurge(stdin);
   
  gets(source);
   
   
  __fpurge(stdin);
   
  // on quitte ?  
  fflush(stdin);


putain, un prof pareil, je l'enverrais bien en Afghanistan avec une pancarte à l'effigie de Mahomet en turban en forme de bombe [:petrus75]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1300071
Tarabiscot​e
Posté le 06-02-2006 à 20:00:13  profilanswer
 

La partie en rouge c'est la seule partie qui m'a l'air correcte, c'est normal ?
C'est identique à ça en fait :

Code :
  1. void CopieChaine(char * pdest, char * psrc)
  2. {
  3. while(*psrc) // Tant que le caractere de la chaine source n'est pas  
  4.       // un ensemble vide  
  5. {
  6.   *pdest = *psrc; // On met la valeur de psrc dans pdest  
  7.   psrc++; // On incremente psrc  
  8.   pdest++; // On incremente pdest  
  9. }
  10.  
  11. if(*psrc == 0)
  12.   *pdest = 0; 
  13. }

n°1300081
quantic_bl​ade
Posté le 06-02-2006 à 20:15:46  profilanswer
 

En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que  
 
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
                          // un ensemble vide  
 {  
  *pdest = *psrc; // On met la valeur de psrc dans pdest  
  *psrc++; // On incremente psrc  
  *pdest++; // On incremente pdest  
 }  
   
 if(*psrc == '\0')  
  pdest[*psrc] = '\0';
 
est un illogisme totale

Message cité 1 fois
Message édité par quantic_blade le 06-02-2006 à 20:18:25
n°1300087
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 06-02-2006 à 20:19:58  profilanswer
 

sinon faudrait apprendre à ton prof l'existence de strcpy() aussi
 
edit:  
while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
                          // un ensemble vide  
 
c'est le prof qui appelle ça "ensemble vide" ? [:pingouino]


Message édité par Harkonnen le 06-02-2006 à 20:20:58

---------------
J'ai un string dans l'array (Paris Hilton)
n°1300108
Tarabiscot​e
Posté le 06-02-2006 à 20:34:13  profilanswer
 

Pour le refus d'utiliser strcpy, je suppose que c'est pour apprendre à utiliser les chaînes de caractères.  
Sinon c'est très mal écris mais ce n’est pas faux donc comment tu veux que l'on te dise où est l'erreur ?
Plus sérieusement, compare avec ce que j'ai tapé pour voir où ce que tu fais a l'air étrange.

n°1300125
++fab
victime du syndrome IH
Posté le 06-02-2006 à 20:47:45  profilanswer
 

quantic_blade a écrit :

En fait la partie main(), je l'ai code à l'arrache parce qu'a la base j'utilise scanf que j'ai remplace mais j'ai pas corrige tout le code, non en fait c'est où est l'erreur dans CopieChaine parce que le prof prétend que  
 

Code :
  1. while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
  2.                           // un ensemble vide  
  3. {
  4.   *pdest = *psrc; // On met la valeur de psrc dans pdest  
  5.   *psrc++; // On incremente psrc  
  6.   *pdest++; // On incremente pdest  
  7. }
  8.  
  9. if(*psrc == '\0')
  10.   pdest[*psrc] = '\0';


 
est un illogisme totale


 
le déréférencement aux lignes 5 et 6 est inutile, le test final est inutile, et l'instruction à mettre est : *pdest = 0;
Ce code s'écrit habituellement en une ligne, avec le prototype suivant :
 
void CopieChaine( char* dest, char const* src )
{
    while( *dest++ = *src++ );
}
 
voire en C99 :
 
void CopieChaine( char* restrict dest, char const* restrict src )
{
    while( *dest++ = *src++ );
}


Message édité par ++fab le 06-02-2006 à 20:56:34
n°1300136
skelter
Posté le 06-02-2006 à 20:53:03  profilanswer
 

et aussi
 

Code :
  1. char * CopieChaine( char* dest, char const* src )
  2. {
  3.     while( *p++ = *q++ );
  4.     return dest;
  5. }


 
pratique pour condenser du code, un bon paquet des fonctions de string.h retournent l'adresse de la chaine modifiée


Message édité par skelter le 06-02-2006 à 20:53:41
n°1300156
quantic_bl​ade
Posté le 06-02-2006 à 21:09:51  profilanswer
 

Merci, donc en fait j'avais bon , mais c'etait tres mal codé.
Ce qui est triste dans l'histoire, tu vois c'est que je fais de la prog depuis 1998 et que je commence à coder avec DX9 et DX10.
Alors je connais pas mal de truc sur les pointeurs et tout le toutim, mais le prof s'explique tellement bien ,qu'en fait je ne comprends plus rien de ce que je fait. Enfin de toute façon après le  BTS j'aurais tout le loisir de me repencher sur les points que j'ai admit sans jamais cherché à les comprendre...
 
Enfin le coup du
void CopieChaine(char* pdest, char* psrc)
{
    while(*psrc != '\0') // Tant que le caractere de la chaine source n'est pas  
      // un ensemble vide  
 {  
  *pdest = *psrc; // On met la valeur de psrc dans pdest  
  *psrc++; // On incremente psrc  
  *pdest++; // On incremente pdest  
 }  
   
 if(*psrc == '\0')  
  pdest[*psrc] = '\0';  
}
 
en  
 
void CopieChaine(char* pdest, char* psrc)
{
    while(*psrc) // Tant que le caractere de la chaine source n'est pas  
      // un ensemble vide  
 {  
  *pdest = *psrc; // On met la valeur de psrc dans pdest  
  psrc++; // On incremente psrc  
  pdest++; // On incremente pdest  
 }  
   
 if(*psrc == 0)  
  *pdest = 0;  
}
 
Que le prof ne l'ai pas vu est inacceptable parce qu'un prof linuxien qui dit savoir codé et qui ne voit pas ça, on finirait par se demander s'il vaut vraiment le coup d'être prof  

mood
Publicité
Posté le 06-02-2006 à 21:09:51  profilanswer
 

n°1300167
Trap D
Posté le 06-02-2006 à 21:25:09  profilanswer
 

Tu peux aussi, (comme il t'a déjà été dit) virer le  
if (*psrc == 0)
le test est forcement vrai car pour sortir de la boucle while il faut que *psrc soit égal à 0.


Message édité par Trap D le 06-02-2006 à 21:26:48
n°1300425
trevor
laissez la vie vous étonner...
Posté le 07-02-2006 à 12:49:44  profilanswer
 

bah oui, *pointeur++ = (*pointeur)++ et pas *(pointeur++)
or, pour parcourir la chaine, ca doit "un peu" mieux marcher si on modifie l'indice/l'adresse à laquelle on accède
le dernier test ne sert en effet à rien: si c'est '\0' tu testes la fin de chaine, or on y est deja. si c'est 0, ca doit être une erreur, car je vois pas trop quel sens ça aurait
donc tu mets directement *pdest = '\0'
 
en revanche, tu peux résoudre facilement ce truc-là en l'incluant dans la boucle si tu passes par un do while() au lieun d'un while()

n°1300430
blackgodde​ss
vive le troll !
Posté le 07-02-2006 à 13:00:14  profilanswer
 

trevor a écrit :

bah oui, *pointeur++ = (*pointeur)++ et pas *(pointeur++)


 
 
ah ?

n°1300443
trevor
laissez la vie vous étonner...
Posté le 07-02-2006 à 13:29:47  profilanswer
 

autant pour moi... je me suis trompé

n°1300444
chrisbk
-
Posté le 07-02-2006 à 13:37:24  profilanswer
 

de toute facon c'est naze comme style d'ecriture

n°1310822
Suntzu-mas​ter
Posté le 21-02-2006 à 16:37:01  profilanswer
 

Bonjour,
 
une simple remarque au sujet de ton programme, la variable "char *destination;"  est un pointeur sur une zone de memoire
de type "char" donc si tu copie ta chaine source vers ta chaine destination sans avoir allouer de la memoire avec une
fonction du type malloc or calloc tu vas ecraser tout les donnees et le code de ton programme au moment de l'execution
de ta fonction de copie!
 
Apres avoir alloue la memoire pour ta chaine de destination il faut utiliser une founction de type memset pour initialiser
la zone a 0x00 ce qui evite de gerer le caracter de fin de chaine '\0' dans la fonction de copie.
 
A+ :)  
 

chrisbk a écrit :

de toute facon c'est naze comme style d'ecriture



---------------
Suntzu

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

  Demande d' aide sur les pointeurs

 

Sujets relatifs
Besoin d'aide pour création d'interface graphiqueAide pour développer avec delta3D
aide inseré gif sur photo[PHP] - Aide : Expression Régulière
Information aide bulle jaune : Possible ?Projet de jeu Servlet/Jsp besoin d'un peu d'aide :/
gtk aide pour une scrollbarDocument pour aide CSS
Aide suppression de fichier en PHP >>PLZ<<Aide pour flash
Plus de sujets relatifs à : Demande d' aide sur les pointeurs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR