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 :

Fonction bzero et (void*)


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 17
    Points : 19
    Points
    19
    Par défaut Fonction bzero et (void*)
    Bonjour a tous et toutes,

    Alors voilà, vous connaissez sûrement la fonction bzero qui met a 0 les n premiers octets du bloc pointé par s.
    On m'a conseillé pour m'améliorer et mieux comprendre la programmation, d'essayer de re-coder les fonctions que j'utilise histoire de bien comprendre comment elles fonctionnent.
    Pour le moment, je dois avouer que c'est un bon conseil, il permet surtout de pratiquer, même sans projet concret derrière.

    Bref, le prototype de bzero est le suivant : void bzero (void *s, size_t n);.

    Le principe de la fonction ne me pose aucun problème particulier mais je me retrouver "bloquer" par ce void*. Comment accéder aux "n" premiers éléments d'un void* ?
    J'étais parti pour tenter un simple s[i] = 0, mais j'ai alors un problème de déréférencement de void*. J'ai donc tenté de faire le même procéder via les calculs de pointeurs directement.
    J'ai donc tenté un (&s + i) = 0. Mais bon, ce n'est que peu concluant puisque au lieu d'avoir une erreur de déréférencement, j'ai une erreur de type
    lvalue required as left operand of assignment (&s + i) = 0;
    Donc première question : Si je comprends bien ma deuxième erreur, le compilateur me dit qu'il ne peut pas assigner quelque chose à "rien", donc il ne reconnaît pas mon expression (&s + i) c'est bien ça ?

    Deuxième question : Comment je peux manipuler mon void* pour pouvoir le parcourir jusqu'à son "n" élément, et assigner des valeurs au passage ?

    Merci d'avoir lu mon message et du temps que vous prendrez pour y répondre.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Il me semble qu'il faut le caster

    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
    #include<stdlib.h>
    #include<stdio.h>
     
     
    void bzero(void* s, size_t n) {
        size_t pos = 0;
     
        for(; pos < n; pos++) {
            ((char*) s)[pos] = 0;
        }
    }
     
     
    int main() {
        int i_array[10]   = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7};
        short s_array[12] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
        size_t pos = 0;
     
        bzero(i_array, (6 * sizeof(int)));
        bzero(s_array, (10 * sizeof(short)));
     
        for(; pos < 10; pos++) {
            printf("%d: %d\n", (pos + 1), i_array[pos]);
        }
     
        for(pos = 0; pos < 12; pos++) {
            printf("%d: %d\n", (pos + 1), s_array[pos]);
        }
     
        return 0;
    }

  3. #3
    Membre à l'essai
    Homme Profil pro
    Lycéen
    Inscrit en
    Août 2014
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Août 2014
    Messages : 17
    Points : 19
    Points
    19
    Par défaut
    Ah Ha !

    J'avais pourtant tenté le cast, mais j'essayais de cast l'emplacement avec le pointeur ((char*)s[i]) au lieu de ((char*)s)[i].

    En tous les cas, merci du coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  2. Réponses: 3
    Dernier message: 12/01/2008, 16h44
  3. passage d'un argument void* dans une fonction
    Par angel46 dans le forum C
    Réponses: 3
    Dernier message: 25/11/2007, 17h53
  4. différence entre fonction() et fonction(void)
    Par ram-0000 dans le forum C++
    Réponses: 8
    Dernier message: 07/11/2007, 17h31
  5. utiliser une fonction VOID pour des blocs relationnels ?
    Par ctobini dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 11/09/2006, 16h16

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