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 :

error: invalid use of void expression, fonction memalloc


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Ecole 42
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ecole 42
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 2
    Points
    2
    Par défaut error: invalid use of void expression, fonction memalloc
    bonjour,
    j'ai recodé une fonction qui devrais malloc autotmatiquement, la voici :
    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
    void		*ft_memalloc(size_t size)
    {
      /*  char *str;
     
      str = (char *) malloc(size * sizeof(*str));
      if (!str)
        return (NULL);
      ft_memset(str, 0, size);
      return ((void *) str);
    }
      */
     
      void		*memory;
      unsigned int	cpt;
      char		*expl;
     
      counter = 0;
      memory = (void *)malloc(size);
      expl = (char *)memory;
      if (memory != NULL)
        {
          while (cpt++ < size)
    	*expl++ = 0;
        }
      return ((void *))memory);
    }
    il y a deux facon différentes je pense qu'elles sont équivalentes, mais quand j'essaye d'appeler ma fonction j'ai l'erreur invalid use of void expression voici la facon dont je l'appelle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = (char **)ft_memalloc(sizeof(char **))
    ou encore :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = (char **)ft_memalloc ( 2 );
    line étant un char **

    voici mon problème, j'ai essayé de caster mais rien à faire.. le problème serait il dans la fonction ?
    mercii d'avance
    Lebijuu

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il nous faudrait un code minimal qui compile avec l'erreur que tu mentionnes.
    La variable "counter" n'est pas déclarée.
    Il y a une parenthèse fermante en trop dans le cast sur la ligne du "return".

    Quel est l'objectif de ta fonction ? C'est un exercice ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Ecole 42
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ecole 42
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    alors oui c'est un exercice vous devez surement connaitre, je dois coder get_next_line. voici le code complet :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    #include "libft/libft.h"
     
    int             ft_strpos(const char *str, char c)
    {
      char *cpstr;
      int i;
     
      i = 0;
      cpstr = (char *)str;
      while (*cpstr != '\0' || *cpstr == c)
        {
          cpstr++;
          i++;
        }
      return (i);
    }
     
    void            ft_add_line(char **line, char **tmp, long len)
    {
      char          *thistmp;
      long          leni;
     
      if (line == NULL)
        line = (char **)ft_memalloc(sizeof(char **));
      leni = ft_strlen(*line);
      *line = (char *)ft_realloc(*line, leni, leni + len + 1);
      if (*line)
        {
          *line[leni + len] = '\0';
          ft_strncat (*line, *tmp, len);
          thistmp = ft_strnew(BUF_SIZE * sizeof(char *));
          if (thistmp)
            {
              ft_strncat(thistmp, (*tmp) + len + 1, BUF_SIZE - len - 1);
              free(*tmp);
              *tmp = thistmp;
    	}
        }
    }
     
    void ft_read(int const *fd, char **line, char **tmp, long *ret)
    {
      int stop;
     
      stop = 0;
      if (*tmp == NULL)
        {
          *tmp = ft_strnew(BUF_SIZE * sizeof(char *));
    *ret = read(*fd, tmp, BUF_SIZE);
        }
      *line = ft_strnew(BUF_SIZE * sizeof(char *));
      while (*line != NULL && *ret == BUF_SIZE && !stop)
        {
          if (ft_strchr(*tmp, '\n') != 0)
            {
              ft_add_line(line, tmp, ft_strpos(*tmp, '\n'));
              stop = 1;
            }
          else
            {
              ft_add_line(line, tmp, BUF_SIZE);
              *ret = read(*fd, *tmp, BUF_SIZE);
            }
        }
    }
     
     
    int             get_next_line(int const fd, char **line)
    {
      long ret;
      static char *current;
     
      if (fd < 0 || line == NULL)
        return (-1);
     
      ret = BUF_SIZE;
    (void)ft_read(&fd, line, &current, &ret);
     
      if (ret != BUF_SIZE && ret > 0)
        ft_add_line (line, &current, ret - 1);
     
      return (1);
    }
     
    int main(void)
    {
      int fd;
      char ** line;
     
      if ( fd > 1 )
        {
          (char **)line = (char **)ft_memalloc ( 2 );
          fd = open("libft/test", O_RDONLY);
          while (get_next_line (fd, line) > 0)
            {
              printf("%s--",*line);
    	}
          free (line);
          close(fd);
        }
      return (0);
    }

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Code minimal, pas complet
    Pas le temps de lire une centaine de lignes...

  5. #5
    Candidat au Club
    Homme Profil pro
    Ecole 42
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ecole 42
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    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
    void            ft_add_line(char **line, char **tmp, long len)
    {
      char          *thistmp;
      long          leni;
     
      if (line == NULL)
        line = (char **)ft_memalloc(sizeof(char **));
      leni = ft_strlen(*line);
      *line = (char *)ft_realloc(*line, leni, leni + len + 1);
      if (*line)
        {
          *line[leni + len] = '\0';
          ft_strncat (*line, *tmp, len);
          thistmp = ft_strnew(BUF_SIZE * sizeof(char *));
          if (thistmp)
            {
              ft_strncat(thistmp, (*tmp) + len + 1, BUF_SIZE - len - 1);
              free(*tmp);
              *tmp = thistmp;
            }
        }
    }
    voila la fonction ou j'ai le problème

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    C'est une soupe pas possible avec des cast intempestifs partout qui empêche le compilateur de faire son travail de vérification.

    Ton premier code commenté
    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
    void *ft_memalloc(size_t size)
    {
      void		*memory;
      unsigned int	cpt;
      char		*expl;
     
    //  counter = 0;                  // pas défini   globale ?  qui sert à quoi ?
      memory = (void *)malloc(size);  // cast inutile
      expl = (char *)memory;
      if (memory != NULL)
        {
          while (cpt++ < size)        // cpt pas initailisé
    	*expl++ = 0;
        }
      return ((void *))memory);       // cast inutile , parenthèses inutiles et fausses
    }
    En purgeant ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void  *ft_memalloc(size_t size)
    {
      char	*memory = malloc(size);
    //  counter = 0;
      if (memory != NULL)
      {
          unsigned int cpt = 0;
          char* expl = memory;
          while (cpt++ < size) *expl++ = 0;
      }
      return memory;
    }
    Ce genre de choses est certainement faux line = (char **)ft_memalloc(sizeof(char **)) : le schéma type d'une allocation de N éléments de type T est T * x = allocation (N*sizeof(T)) .

  7. #7
    Candidat au Club
    Homme Profil pro
    Ecole 42
    Inscrit en
    Mai 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ecole 42
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup j'ai corrigé la fonction, c'est plus clair de ce coté la mais quand je compile, il me met toujours : error: invalid use of void expression
    Mais quand j'essaye d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (char **)line = ft_memalloc(sizeof(char **));
    Le compilateur me dit : error: lvalue required as left operand of assignment.
    Je pense donc qu'il faut que je laisse le char ** devant ft_memalloc.. mais même dans ce cas j'ai toujours l'autre erreur : error: error: invalid use of void expression

    edit : j'ai résolu le problème merci beaucoup il venais de mon .h ou j'avais oublier l'étoile dans le proto... mb sry
    mais sinon merci beaucoup pour l'opti de la fonction

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    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 382
    Points : 41 593
    Points
    41 593
    Par défaut
    Tu n'as pas besoin de caster du tout pour mettre un void* dans une variable pointeur, quel que soit le type pointé.

  9. #9
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par Lebijuu Voir le message
    ...
    Mais quand j'essaye d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     (char **)line = ft_memalloc(sizeof(char **));
    Le compilateur me dit : error: lvalue required as left operand of assignment.
    ...
    Ce qui est permis de caster c'est une valeur, pas un objet : un objet a un type défini à sa création et ne peut en changer. De même, le résultat du cast est une valeur, pas un objet, et on ne peut lui assigner une valeur. il a la valeur qu'il a et ne peut pas en changer. C'est comme si on écrivait 3 = ...

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

Discussions similaires

  1. [XL-2010] Error 94, Invalid use of Null
    Par bundy_al01 dans le forum Excel
    Réponses: 1
    Dernier message: 09/03/2011, 10h30
  2. Error: illegal use of this type as an expression
    Par ncheboi dans le forum Débuter
    Réponses: 8
    Dernier message: 30/08/2010, 00h01
  3. Réponses: 3
    Dernier message: 21/01/2010, 01h24
  4. error:invalid use of undefined type
    Par assif dans le forum C++
    Réponses: 2
    Dernier message: 25/10/2006, 22h11
  5. [VB6] Compile error: Invalide use of New Keyword
    Par ironik dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/05/2006, 13h40

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