Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

debutant : pointeur pointé n'a plus acces aux pointé du pointeur

13 réponses
Avatar
Sébastien
Slt,

je tente de comprendre un trucbizarre avec les ppointeur.

j'ai une fonction qui initialise un pointeur de type usb_dev_handle et do=
nt je
ne peux pas en parcourrir le contenu, alors ue les fonction de la bibliot=
heque
(libusb) le font sans erreur. regarder comme suit.

/*extrait usbi.h*/

struct usb_dev_handle {
int fd;

struct usb_bus *bus;
struct usb_device *device;

int config;
int interface;
int altsetting;

/* Added by RMT so implementations can store other per-open-device dat=
a */
void *impl_info;
};


/*end usbi.h*/

/*extrait usb.h*/


/* Data types */
struct usb_device;
struct usb_bus;

struct usb_device {
struct usb_device *next, *prev;

char filename[PATH_MAX + 1];

struct usb_bus *bus;

struct usb_device_descriptor descriptor;
struct usb_config_descriptor *config;

void *dev; /* Darwin support */
};

struct usb_bus {
struct usb_bus *next, *prev;

char dirname[PATH_MAX + 1];

struct usb_device *devices;
u_int32_t location;
};

struct usb_dev_handle;
typedef struct usb_dev_handle usb_dev_handle;

/* Variables */
extern struct usb_bus *usb_busses;


/*end usb.h*/

/*extrait usb.h*/
usb_dev_handle *usb_open(struct usb_device *dev)
{
usb_dev_handle *udev;

udev =3D malloc(sizeof(*udev));
if (!udev)
return NULL;

udev->fd =3D -1;
udev->device =3D dev;
udev->bus =3D dev->bus;
udev->config =3D udev->interface =3D udev->altsetting =3D -1;

if (usb_os_open(udev) < 0) {
free(udev);
return NULL;
}

return udev;
}

/*end usb.h*/

tres logiquement je me lance dans l'ecriture d'un truc qui vas me permett=
re
d'acceder au champ:

struct usb_dev_handle *my_usb_dev;

/* etc.... for(dev =3D dev->next) ... */
my_usb_dev =3D usb_open(dev);


/* etc.... */

fprintf(stderr, " opened ref %x , device struct pointer at %x\n",my_usb_d=
ev->fd
,my_usb_dev->device);




ce qui a mon esprit donne acces aux membres fd et device.

et bien non le compilateur me donne une erreur : "dereferencing pointer t=
o
incomplete type"



qu'es ce qui cloche, merci de m'eclairer.




S=E9bastien

10 réponses

1 2
Avatar
Jean-Marc Bourguet
Sébastien writes:

ce qui a mon esprit donne acces aux membres fd et device.

et bien non le compilateur me donne une erreur : "dereferencing pointer to
incomplete type"


Tu n'as pas la definition du type. Inclus usbi.h.

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
Sébastien wrote on 26/10/04 :
j'ai une fonction qui initialise un pointeur de type usb_dev_handle et dont
je
ne peux pas en parcourrir le contenu, alors ue les fonction de la
bibliotheque
(libusb) le font sans erreur. regarder comme suit.

/*extrait usbi.h*/



Le 'i' de 'usbi' signifie probablement 'interne' (n'est pas à la
disposition de l'utilisateur). Par contre, il y a fort à parier qu'il
existe un 'usb.h' qui, lui, est à la disposition de l'utilisateur.

struct usb_dev_handle {
int fd;

struct usb_bus *bus;
struct usb_device *device;

int config;
int interface;
int altsetting;

/* Added by RMT so implementations can store other per-open-device data */
void *impl_info;
};


Définition complète de la structure.


/*end usbi.h*/

/*extrait usb.h*/


et voila!

/* Data types */
struct usb_device;


Définition incomplète. Seul un pointeur de ce type peut être défini.

struct usb_bus;

struct usb_device {
struct usb_device *next, *prev;


comme ça, par exemple.


char filename[PATH_MAX + 1];

struct usb_bus *bus;

struct usb_device_descriptor descriptor;
struct usb_config_descriptor *config;

void *dev; /* Darwin support */
};

struct usb_bus {
struct usb_bus *next, *prev;

char dirname[PATH_MAX + 1];

struct usb_device *devices;
u_int32_t location;
};

struct usb_dev_handle;
typedef struct usb_dev_handle usb_dev_handle;

/* Variables */
extern struct usb_bus *usb_busses;


/*end usb.h*/

/*extrait usb.h*/
usb_dev_handle *usb_open(struct usb_device *dev)
{
usb_dev_handle *udev;

udev = malloc(sizeof(*udev));
if (!udev)
return NULL;

udev->fd = -1;
udev->device = dev;
udev->bus = dev->bus;
udev->config = udev->interface = udev->altsetting = -1;

if (usb_os_open(udev) < 0) {
free(udev);
return NULL;
}

return udev;
}

/*end usb.h*/

tres logiquement je me lance dans l'ecriture d'un truc qui vas me permettre
d'acceder au champ:

struct usb_dev_handle *my_usb_dev;


Ben non, tu n'as pas le droit. Le code est en quelque sorte sécurisé.
Tu n'as pas le droit d'aller fouiller là où il ne faut pas. Seul
l'implémen,teur a ce droit, et c'est ltôt logique. Pour voir les
données, il faut une fonction (accesseur) qui pourrait ytrès bien te
demander de montrer patte blanche, enregistrer les accès etc...

/* etc.... for(dev = dev->next) ... */
my_usb_dev = usb_open(dev);


/* etc.... */

fprintf(stderr, " opened ref %x , device struct pointer at
%xn",my_usb_dev->fd
,my_usb_dev->device);

ce qui a mon esprit donne acces aux membres fd et device.

et bien non le compilateur me donne une erreur : "dereferencing pointer to
incomplete type"


Normal.

qu'es ce qui cloche, merci de m'eclairer.


Le C permet d'utiliser une technique dite de données opaques' qui
permet de ne fournir à l'utilisateur qu'un pointeur vers les données,
mais d'un type incomplet, ce qui interdit l'accès aux données. C'est
une technique bien connue d'encapsulation des données.

http://mapage.noos.fr/emdel/tad.htm

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"

Avatar
Emmanuel Delahaye
Jean-Marc Bourguet wrote on 26/10/04 :
Sébastien writes:

ce qui a mon esprit donne acces aux membres fd et device.

et bien non le compilateur me donne une erreur : "dereferencing pointer to
incomplete type"


Tu n'as pas la definition du type. Inclus usbi.h.


T'as rien compris à l'encapsulation des données. T'es prof de quoi déjà
?

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Jean-Marc Bourguet
Emmanuel Delahaye writes:

T'es prof de quoi déjà ?


Où as-tu vu que j'étais prof?

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Emmanuel Delahaye
Jean-Marc Bourguet wrote on 26/10/04 :
Emmanuel Delahaye writes:

T'es prof de quoi déjà ?


Où as-tu vu que j'étais prof?


Ah, bon, ça me rassure... Je me perd un peut dans tous les intervenants
de fclc... (Je crois que j'ai confondu avec Marc Boyer. Il est bien
prof, lui ?)

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
cedric
Emmanuel Delahaye wrote:
Le 'i' de 'usbi' signifie probablement 'interne'


C'est standard ca comme notation ?
(standard au sens d'usuel bien sur).

Avatar
Emmanuel Delahaye
cedric wrote on 26/10/04 :
Emmanuel Delahaye wrote:
Le 'i' de 'usbi' signifie probablement 'interne'


C'est standard ca comme notation ?
(standard au sens d'usuel bien sur).


C'est une regle d'usage (State of art ...). Personnellement, je mets un
suffixe _i.

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"C is a sharp tool"


Avatar
Gabriel Dos Reis
Emmanuel Delahaye writes:

| Jean-Marc Bourguet wrote on 26/10/04 :
| > Emmanuel Delahaye writes:
| >
| >> T'es prof de quoi déjà ?
| >
| > Où as-tu vu que j'étais prof?
|
| Ah, bon, ça me rassure...

À choisir entre un prof et Jean-Marc, je choisis Jean-Marc.
Et cela n'est pas une insulte aux profs.
Savoir programmer n'est simplement pas une question de prof.

-- Gaby
Avatar
Jean-Marc Bourguet
cedric writes:

Emmanuel Delahaye wrote:
Le 'i' de 'usbi' signifie probablement 'interne'


C'est standard ca comme notation ? (standard au sens d'usuel bien
sur).


D'avoir une notation pour ca oui. Le "i" je ne l'avais jamais vu
(j'ai vu P et Pvt, pour PriVaTe).

A+

--
Jean-Marc
FAQ de fclc: http://www.isty-info.uvsq.fr/~rumeau/fclc
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
cedric
Jean-Marc Bourguet wrote:
Le 'i' de 'usbi' signifie probablement 'interne'



C'est standard ca comme notation ? (standard au sens d'usuel bien
sur).


D'avoir une notation pour ca oui. Le "i" je ne l'avais jamais vu
(j'ai vu P et Pvt, pour PriVaTe).


Moi je fait carrément un sous repertoire "priv" mais c'est un peut lourd
je trouve.




1 2