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 :

Pointeur void *


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut Pointeur void *
    Bonjour,

    voilà mon problème : je souhaiterais pouvoir entrer les données référencées par un pointeur de type short *** dans un pointeur de type void *.

    Avant de débuter le "transfert" des données, je sauvegarde dans un autre pointeur void * l'adresse de début de mon pointeur. Mais je ne suis pas sûr que ma façon de faire soit correcte.

    Mais mon principal souci se situe surtout au niveau du "transfert" des données entre les deux pointeurs : en effet, je ne suis pas sûr qu'au bout du compte, le pointeur void * référence bien un tableau contenant les données du pointeur short ***.

    Comme ce que je raconte n'est peut-être pas très clair (je m'embrouille un peu ), voilà mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    dataToSave->data = malloc(dataToSave->nvox * dataToSave->nbyper);
     
        debutData = dataToSave->data;
     
        for(i=0; i<image->width; i++){
            for(j=0; j<image->height;j++){
                for(k=0; k<image->depth; k++){
                    dataToSave->data = &(image->mri[i][j][k]);
                    dataToSave->data++;
                }
            }
        }
     
        dataToSave->data = debutData;
    Ici, data est le fameux pointeur de type void * et mri celui de type short ***.

    L'allocation de data donne un tableau de taille égale au nombre de données contenues dans mri[width][height][depth], nvox étant width*height*depth et nbyper le nombre de bytes pour une donnée.

    Je suis par-contre dans l'obligation d'allouer data à cette taille, étant donné qu'il est défini dans une bibliothèque que je n'ai pas programmée.


    J'ai essayé un autre moyen qui me paraissait plus juste, mais cela engendrait des erreurs :
    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
    dataToSave->data = (short *)malloc(dataToSave->nvox * dataToSave->nbyper);
    
        debutData = dataToSave->data;
    
        for(i=0; i<image->width; i++){
            for(j=0; j<image->height;j++){
                for(k=0; k<image->depth; k++){
                    (*dataToSave->data) = image->mri[i][j][k];
                    dataToSave->data++;
                }
            }
        }
    
        dataToSave->data = debutData;
    Cela produit une erreur qui me dit :
    file_nifti.c:607: warning: dereferencing `void *' pointer
    file_nifti.c:607: void value not ignored as it ought to be

    La ligne 607 étant celle où se fait l'affectation.

    Je me retrouve donc complètement bloqué là-dessus. Si qqn sait ce qu'il faut faire, je le remercie d'avance

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Quelle est le type de dataToSave->data?

    Montre nous ta structure.

    Moi j'aurai mis un short* et pas besoin d'allocation.

    image->mri[i][j][k] est un short on est d'accord?

    Tu met un & devant donc tu prends l'adresse, donc un simple short* suffit.

  3. #3
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    OK, le problème est que : dans le premier script, tu ne modifies que le pointeur, donc tu perds l'adresse de l'espace mémoire et tu ne stocke rien... à la fin data vaut : l'adresse du dernier élément + 1

    dans le second cas, tu déréférences un void* (strictement interdit !)

    essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        dataToSave->data = malloc(dataToSave->nvox * dataToSave->nbyper);
     
        debutData = dataToSave->data;
     
        for(i=0; i<image->width; i++){
            for(j=0; j<image->height;j++){
                for(k=0; k<image->depth; k++){
                    (*(short*)dataToSave->data) = image->mri[i][j][k];
                    dataToSave->data += dataToSave->nbyper;
                }
            }
        }
     
        dataToSave->data = debutData;
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Merci swoog, je vais essayer ceci... je me doutais justement que quelque chose clochait dans ma première méthode.

    Pour te répondre skyrunner, data est déclaré de type void *, la structure où il se trouve est :
    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
    typedef struct {                /*!< Image storage struct **/
     
      int ndim ;                    /*!< last dimension greater than 1 (1..7) */
      int nx ;                      /*!< dimensions of grid array             */
      int ny ;                      /*!< dimensions of grid array             */
      int nz ;                      /*!< dimensions of grid array             */
      int nt ;                      /*!< dimensions of grid array             */
      int nu ;                      /*!< dimensions of grid array             */
      int nv ;                      /*!< dimensions of grid array             */
      int nw ;                      /*!< dimensions of grid array             */
      int dim[8] ;                  /*!< dim[0]=ndim, dim[1]=nx, etc.         */
      int nvox ;                    /*!< number of voxels = nx*ny*nz*...*nw   */
      int nbyper ;                  /*!< bytes per voxel, matches datatype    */
      int datatype ;                /*!< type of data in voxels: DT_* code    */
     
      float dx ;                    /*!< grid spacings      */
      float dy ;                    /*!< grid spacings      */
      float dz ;                    /*!< grid spacings      */
      float dt ;                    /*!< grid spacings      */
      float du ;                    /*!< grid spacings      */
      float dv ;                    /*!< grid spacings      */
      float dw ;                    /*!< grid spacings      */
      float pixdim[8] ;             /*!< pixdim[1]=dx, etc. */
     
      float scl_slope ;             /*!< scaling parameter - slope        */
      float scl_inter ;             /*!< scaling parameter - intercept    */
     
      float cal_min ;               /*!< calibration parameter, minimum   */
      float cal_max ;               /*!< calibration parameter, maximum   */
     
      int qform_code ;              /*!< codes for (x,y,z) space meaning  */
      int sform_code ;              /*!< codes for (x,y,z) space meaning  */
     
      int freq_dim  ;               /*!< indexes (1,2,3, or 0) for MRI    */
      int phase_dim ;               /*!< directions in dim[]/pixdim[]     */
      int slice_dim ;               /*!< directions in dim[]/pixdim[]     */
     
      int   slice_code  ;           /*!< code for slice timing pattern    */
      int   slice_start ;           /*!< index for start of slices        */
      int   slice_end   ;           /*!< index for end of slices          */
      float slice_duration ;        /*!< time between individual slices   */
     
      /*! quaternion transform parameters
        [when writing a dataset, these are used for qform, NOT qto_xyz]   */
      float quatern_b , quatern_c , quatern_d ,
            qoffset_x , qoffset_y , qoffset_z ,
            qfac      ;
     
      mat44 qto_xyz ;               /*!< qform: transform (i,j,k) to (x,y,z) */
      mat44 qto_ijk ;               /*!< qform: transform (x,y,z) to (i,j,k) */
     
      mat44 sto_xyz ;               /*!< sform: transform (i,j,k) to (x,y,z) */
      mat44 sto_ijk ;               /*!< sform: transform (x,y,z) to (i,j,k) */
     
      float toffset ;               /*!< time coordinate offset */
     
      int xyz_units  ;              /*!< dx,dy,dz units: NIFTI_UNITS_* code  */
      int time_units ;              /*!< dt       units: NIFTI_UNITS_* code  */
     
      int nifti_type ;              /*!< 0==ANALYZE, 1==NIFTI-1 (1 file),
                                                     2==NIFTI-1 (2 files),
                                                     3==NIFTI-ASCII (1 file) */
      int   intent_code ;           /*!< statistic type (or something)       */
      float intent_p1 ;             /*!< intent parameters                   */
      float intent_p2 ;             /*!< intent parameters                   */
      float intent_p3 ;             /*!< intent parameters                   */
      char  intent_name[16] ;       /*!< optional description of intent data */
     
      char descrip[80]  ;           /*!< optional text to describe dataset   */
      char aux_file[24] ;           /*!< auxiliary filename                  */
     
      char *fname ;                 /*!< header filename (.hdr or .nii)         */
      char *iname ;                 /*!< image filename  (.img or .nii)         */
      int   iname_offset ;          /*!< offset into iname where data starts    */
      int   swapsize ;              /*!< swap unit in image data (might be 0)   */
      int   byteorder ;             /*!< byte order on disk (MSB_ or LSB_FIRST) */
      void *data ;                  /*!< pointer to data: nbyper*nvox bytes     */
     
      int                num_ext ;  /*!< number of extensions in ext_list       */
      nifti1_extension * ext_list ; /*!< array of extension structs (with data) */
     
    } nifti_image ;


    Et je ne peux pas changer son type, étant donné que la structure est dans une bibliothèque déjà toute faite que je ne peux pas redéfinir.

  5. #5
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    tu as oublié la balise code
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    91
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 91
    Par défaut
    Encore merci à toi swoog, je viens de tester et cela fonctionne parfaitement, et cette fois-ci je suis sûr que les données sont bien présentes intégralement dans data

    Edit : oui, dsl pour la balise, c'est rectifié

  7. #7
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    No problem

    Bonne continuation ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. Pointeur, void ?
    Par Erast dans le forum Débuter
    Réponses: 6
    Dernier message: 16/04/2010, 00h33
  2. Réponses: 4
    Dernier message: 04/02/2009, 16h08
  3. Pointeur void *
    Par coberle dans le forum C++
    Réponses: 7
    Dernier message: 12/12/2008, 20h11
  4. Paramètres de PostMessage et pointeur void ?
    Par tintin72 dans le forum Windows
    Réponses: 8
    Dernier message: 17/06/2008, 13h36
  5. tableau de pointeurs void
    Par CerbeRGD dans le forum Débuter
    Réponses: 10
    Dernier message: 15/02/2008, 18h38

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