IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Ma fonction memmove


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut Ma fonction memmove
    bonjour
    J'ai fais une petite fonction memmove. Mais je ne sais pas ce qu'il cloche
    si quelqu'un peut m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    void * memmove(void *,void * ,size_t );
     
    int main()
    {
    char *s="abcdefghijklmnopqrstuvwxyz";
    char d[26];
    char *p=memmove(d,s,26);
    printf("%s",d);
    return (0);
    }
     
    void * memmove(void * dest,void * source ,size_t n)
    {
    	size_t i;
     
     
    	if(&source!=&dest)
    	{	if(&source>&dest)
    		{
    			for(i=0;i<n;i++)
    			{
    			dest[i]=dest[i];
     
    			}
     
    		}else
    		{
     
    			for((i=n-1);i>=0;i--)
    			{
    			dest[i]=source[i];
    			}
     
     
    		}
    	}
    	return dest;
    }
    d'avance merci.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bird12358 Voir le message
    d'avance merci.
    Faut jamais remercier d'avance. Ca induit une obligation chez ton interlocuteur...

    Citation Envoyé par bird12358 Voir le message
    bonjour
    J'ai fais une petite fonction memmove. Mais je ne sais pas ce qu'il cloche
    si quelqu'un peut m'aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    void * memmove(void *,void * ,size_t );
    
    int main()
    {
    char *s="abcdefghijklmnopqrstuvwxyz";
    char d[26];
    char *p=memmove(d,s,26);
    printf("%s",d);
    return (0);
    }
    
    void * memmove(void * dest,void * source ,size_t n)
    {
    	size_t i;
    	
    	
    	if(&source!=&dest)
    	{	if(&source>&dest)
    		{
    			for(i=0;i<n;i++)
    			{
    			dest[i]=dest[i];
    		
    			}
    		
    		}else
    		{
    		
    			for((i=n-1);i>=0;i--)
    			{
    			dest[i]=source[i];
    			}
    		
    
    		}
    	}
    	return dest;
    }


    => source et dest sont déjà des adresses. Faut pas de "&"
    => dest[i]=dest[i] => tu la sens bien cette instruction ???

    Sinon pour plus de rapidité, vaut mieux éviter les [i] et passer par des pointeurs...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut re
    merci de ta reponse mais ca me fait tjrs les meme erreur

    mem.c:23: attention : dereferencing «void *" pointer
    mem.c:23: attention : dereferencing «void *" pointer
    mem.c:23: erreur: utilisation invalide d'expression void
    mem.c:32: attention : dereferencing «void *" pointer
    mem.c:32: attention : dereferencing «void *" pointer
    mem.c:32: erreur: utilisation invalide d'expression void
    make: *** [mem] Erreur 1

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bird12358 Voir le message
    merci de ta reponse mais ca me fait tjrs les meme erreur

    mem.c:23: attention : dereferencing «void *" pointer
    mem.c:23: attention : dereferencing «void *" pointer
    mem.c:23: erreur: utilisation invalide d'expression void
    mem.c:32: attention : dereferencing «void *" pointer
    mem.c:32: attention : dereferencing «void *" pointer
    mem.c:32: erreur: utilisation invalide d'expression void
    make: *** [mem] Erreur 1
    Oui évidemment. J'aurais pu le remarquer (j'ai pas de compilo, je corrige juste à la lecture)
    Etant donné que tu travailles avec des pointeurs void * donc des pointeurs universels, les éléments dest[i] sont de type "void" et ne sont pas manipulables. Le compilo ne sait pas que tu veux manipuler ici des octets. D'ailleurs l'opération[i] implique un déplacement d'éléments mais comme le compilo ne connait pas l'élément lui-même, il sait évidemment pas de combien d'octets faut décaler en mémoire pour atteindre l'élément [i].
    Rappel de l'arithmétique des pointeurs: tab[i] => déplacement de i * sizeof(*tab) octets

    Chaque fois que tu travailles sur var[i], vaut d'abord caster var en char * pour que var[i] soit vu comme char

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((char*)dest)[i]=((char*)source)[i];
    Ou alors tu utilises deux pointeurs de type char qui partent de source et dest et qui s'incrémentent (ou qui décrémentent selon le cas)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il faut caster en char* pour pouvoir faire de l'arithmétique de pointeurs.
    Essaie ce code corrigé:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #include <stdio.h>
     
    void * memmove(void *,void const * ,size_t );
     
    int main()
    {
    	char const *s="abcdefghijklmnopqrstuvwxyz";
    	char d[27]; /* 26 lettres + caractère nul */
    	char *p=memmove(d,s,27);
    	printf("%s",d);
    	return (0);
    }
     
    void * memmove(void * pvDest,void const * pcvSource, size_t n)
    {
    	char * pDest = pvDest;
    	char const * pcSource = pcvSource;
    	size_t i;
     
    	if(pcSource!=pDest)
    	{
    		if(pcSource>pDest)
    		{
    			for(i=0 ; i<n ; i++)
    			{
    				pDest[i]=pcSource[i];
    			}
    		}
    		else
    		{
    			/* Attention, un size_t est toujours >=0 
    			for((i=n-1) ; i>=0 ; i--) */
    			for(i=n ; i>0 ; i++)
    			{
    				pDest[i-1]=pcSource[i-1];
    			}
    		}
    	}
    	return dest;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut re
    je vous remercie ma focntionne fonctionne lol

    par contre la focntion memmove ne doit-elle pas deplacer une partie de la memoire (c 'est a dire n'importe quelle type de donnée)?
    Dans ce cas ma fonction ne fait pas ce que memmove doit faire ?

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Essaie ce code corrigé:
    Meuh ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : D:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:6: warning: function declaration isn't a prototype
    main.c: In function `main':
    main.c:9: warning: unused variable `p'
    main.c: In function `memmove':
    main.c:39: error: `dest' undeclared (first use in this function)
    main.c:39: error: (Each undeclared identifier is reported only once
    main.c:39: error: for each function it appears in.)
    Process terminated with status 1 (0 minutes, 0 seconds)
    3 errors, 2 warnings

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bird12358 Voir le message
    J'ai fais une petite fonction memmove. Mais je ne sais pas ce qu'il cloche
    si quelqu'un peut m'aider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    void * memmove(void *,void * ,size_t );
     
    int main()
    {
    char *s="abcdefghijklmnopqrstuvwxyz";
    char d[26];
    char *p=memmove(d,s,26);
    printf("%s",d);
    return (0);
    }
     
    void * memmove(void * dest,void * source ,size_t n)
    {
    	size_t i;
     
     
    	if(&source!=&dest)
    	{	if(&source>&dest)
    		{
    Je t'arrête toute de suite. Bug majeur de conception.

    1 - On a pas le droit de donner à une fonction le nom d'une fonction existante (comportement indéfini). my_memmove() est OK.

    2 - On ne peut comparer des pointeurs que si ils appartiennent au même objet. Il faut donc passer UNE adresse, un ou des indices et une longueur. Point.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void * my_memmove (void const* buffer, size_t from, size_t to, size_t n)
    mais c'est une autre fonction

    Pour memmove(), je ne sais pas si on peut la coder en C standard sans passer par un buffer relais alloué, ce qui n'est pas du tout efficace.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. limitation fonction memmove
    Par jamescook dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2007, 11h31
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo