Déréferencement d'un pointeur de type incomplet

Fermé
ABouras Messages postés 26 Date d'inscription vendredi 16 novembre 2012 Statut Membre Dernière intervention 7 décembre 2012 - Modifié par ABouras le 7/12/2012 à 10:15
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 7 déc. 2012 à 16:25
Bonjour, j'ai des erreurs de déréférencement de pointeur de type incomplet.

J'ai un fichier video_stage_decoder.h où je déclare la structure suivante :
typedef struct _video_decoder_config_t 
{ 
  vp_api_picture_t *src_picture; // vient de la structure vp_api_picture 
  vp_api_picture_t *dst_picture; // vient de la structure vp_api_picture 
  uint32_t num_frames; 
  uint32_t num_picture_decoded; 
  uint32_t rowstride; 
  uint32_t bpp; 
  bool_t vlibMustChangeFormat; 
  vlib_stage_decoding_config_t *vlibConf; 
  vp_api_io_data_t *vlibOut; 
  mp4h264_config_t *mp4h264Conf; 
  vp_api_io_data_t *mp4h264Out; 
} video_decoder_config_t;

et le fichier vlib.h définie la structure suivante :
typedef struct _vp_api_picture_ 
{ 
  enum PixelFormat format;    // camif -> encoder : PIX_FMT_YUV420P 

  uint32_t         width;     // camif -> encoder 
  uint32_t         height;    // camif -> encoder 
  uint32_t         framerate; // camif -> encoder 

  uint8_t         *y_buf;     // camif -> encoder 
  uint8_t         *cb_buf;    // camif -> encoder 
  uint8_t         *cr_buf;    // camif -> encoder 

  uint32_t         y_pad;     // 2* camif_config.y_pad 
  uint32_t         c_pad;     // 2* camif_config.c_pad 

  uint32_t         y_line_size; 
  uint32_t         cb_line_size; 
  uint32_t         cr_line_size; 

  uint32_t         vision_complete; 
  uint32_t         complete; 
  int32_t          blockline; 
} 
vp_api_picture_t;


J'utilise ces structures dans le fichier video_stage_latency_estimation.c (évidement j'ai include les deux headers précédents ...) aux lignes suivantes :
struct video_decoder_config_t * vec; 
if ( cfg->w != vec->dst_picture->width || cfg->h != vec->dst_picture->height) 
        { 
          cfg->w = vec->dst_picture->width; 
          cfg->h = vec->dst_picture->height; 
... 
 switch (vec->dst_picture->format) 
            { 
... 
} 


Voilà, quelqu'un pour m'aider ?

merci d'avance !


2 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 7/12/2012 à 10:55
Salut ABouras,

video_decoder_config_t n'est pas une structure, c'est un type définit avec typedef.

Lorsque tu déclares vec, tu devrais donc écrire :

video_decoder_config_t * vec;

Cependant, je ne comprend pas la suite de ton code, car je ne vois nulle part que tu aies alloué la mémoire nécessaire à ce qui est pointé par dst_picture (qui est un pointeur sur vp_api_picture_t, ni, a fortiori, que tu aies initialisé les valeurs de width et height qui sont contenues dans la structure de type dst_picture et dont tu te sers comme si elles l'étaient.


Dal
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
7 déc. 2012 à 14:30
D'ailleurs, ton code n'alloue pas non plus de mémoire pour ce qui est pointé par vec, qui n'est qu'un pointeur sur video_decoder_config_t (c'est par cela que tu devrais commencer).


Dal
0
ABouras Messages postés 26 Date d'inscription vendredi 16 novembre 2012 Statut Membre Dernière intervention 7 décembre 2012
7 déc. 2012 à 15:15
Si j'ai définit ensuite vec de la manière suivante :
vec = (struct video_decoder_config_t *)cfg->last_decoded_frame_info;
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
7 déc. 2012 à 16:25
Je ne sais pas ce qu'est cfg (ce n'est pas définit dans ce que tu postes). Mais en admettant que ce soit un espace alloué vers lequel peut pointer un pointeur de type video_decoder_config_t, tu ajoutes de nouveau un "struct" qui n'a rien à faire là.

soit tu fais :
video_decoder_config_t * vec;
vec = (video_decoder_config_t *)cfg->last_decoded_frame_info;

et dans ce cas tu utilises l'alias de type que tu as définit avec typedef.

soit du fais :
struct _video_decoder_config_t * vec;
vec = (struct _video_decoder_config_t *)cfg->last_decoded_frame_info;

et dans ce cas, tu utilises l'étiquette de struct qui est préfixée d'un underscore (et ton typedef ne sert à rien).


Dal

PS : et ton pointeur dst_picture, il correspond à de la mémoire allouée ?
0