Structure C taille
Résolu/Fermé
shreg
-
24 oct. 2007 à 15:41
c-moi Messages postés 81 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 6 juillet 2011 - 25 oct. 2007 à 17:16
c-moi Messages postés 81 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 6 juillet 2011 - 25 oct. 2007 à 17:16
A voir également:
- Structure C taille
- Comment réduire la taille d'un fichier - Guide
- Comment reduire la taille d'une photo - Guide
- Regle taille reel - Guide
- Taille iphone 14 - Guide
- Logiciel calcul structure métallique gratuit - Télécharger - Architecture & Déco
3 réponses
c-moi
Messages postés
81
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
6 juillet 2011
10
24 oct. 2007 à 16:19
24 oct. 2007 à 16:19
Bonjour,
A ma connaissance, il n'est pas possible de faire ce que tu veux.
Tu dois obligatoirement passer par une déclaration dynamique de tes tableaux, de type
Une astuce que je vois rapidement :
déclarer ta structure comme suit :
typedef struct {
sema_t mysema;
int et;
int dir;
int free;
int *ar;
SUser *user;
} buf_t;
puis implémenter une fonction de création d'instance
Ensuite, dans ton code, tu appelles la fonction create_buf avec les paramètres qu'il faut (et donc argv[1] pour ar_size et argv[2] pour user_size, dans le cas où tu es dans main() ).
Evidemment, qui dit malloc dit gestion des erreurs, avec arrêt du programme en cas de défaillance malloc-esque :)
En espérant avoir aidé,
c-moi
A ma connaissance, il n'est pas possible de faire ce que tu veux.
Tu dois obligatoirement passer par une déclaration dynamique de tes tableaux, de type
int * ar = (int *) malloc(a * sizeof int);où a est le premier argument du programme ( argv[1] donc).
Une astuce que je vois rapidement :
déclarer ta structure comme suit :
typedef struct {
sema_t mysema;
int et;
int dir;
int free;
int *ar;
SUser *user;
} buf_t;
puis implémenter une fonction de création d'instance
struct buf_t * create_buf_t(struct sema_t mysema, int et, int dir, int free, int ar_size, int user_size) { struct buf_t *mybuff = (struct buf_t *) malloc(sizeof mybuff); /* or malloc( sizeof (struct buf_t) ) */ mybuff->mysema = mysema; mybuff->et = et; mybuff->dir = dir; mybuff->free = free; mybuff->ar = (int *) malloc( ar_size * sizeof int); mybuff->user = (int *) malloc( user_size = sizeof int); return mybuff; }
Ensuite, dans ton code, tu appelles la fonction create_buf avec les paramètres qu'il faut (et donc argv[1] pour ar_size et argv[2] pour user_size, dans le cas où tu es dans main() ).
Evidemment, qui dit malloc dit gestion des erreurs, avec arrêt du programme en cas de défaillance malloc-esque :)
En espérant avoir aidé,
c-moi
Bonjour,
Merci de ta réponse rapide.
C'est tout a fait à ce genre de résultat que je voulais arriver. Cela va me faciliter la tache.
Je voulais savoir si je devais faire une déclaration dynamique de tableaux en mémoire partagé, car il doit être accessible depuis d'autre processus.
Etant donné que pour une structure statique je fais ceci :
En suivant le même raisonnement que tu as fais, je devrais faire ceci :
Est-ce que tu crois que cela peur fonctionner ?
merci d'avance,
shreg
Merci de ta réponse rapide.
C'est tout a fait à ce genre de résultat que je voulais arriver. Cela va me faciliter la tache.
Je voulais savoir si je devais faire une déclaration dynamique de tableaux en mémoire partagé, car il doit être accessible depuis d'autre processus.
Etant donné que pour une structure statique je fais ceci :
int fd = open("/dev/zero", O_RDWR); buf=(buf_t *)mmap(NULL,argv[3]* sizeof(struct buf_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
En suivant le même raisonnement que tu as fais, je devrais faire ceci :
int fd,fd1,fd2; fd = open("/dev/zero", O_RDWR); fd1 = open("/dev/mem", O_RDWR); fd2 = open("/dev/mixer", O_RDWR); create_buf_t(struct sema_t mysema, int et, int dir, int free, int ar_size, int user_size, int fd, int fd1, int fd2) { struct buf_t *mybuff = (buf_t *) mmap(NULL,argv[3]* sizeof(struct buf_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); mybuff->mysema = mysema; mybuff->et = et; mybuff->dir = dir; mybuff->free = free; mybuff->ar = (int *) mmap(NULL,ar_size* sizeof int, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0); mybuff->user = (SUser *) mmap(NULL,ar_size* sizeof (struct SUser), PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0); return mybuff; }
Est-ce que tu crois que cela peur fonctionner ?
merci d'avance,
shreg
c-moi
Messages postés
81
Date d'inscription
dimanche 1 août 2004
Statut
Membre
Dernière intervention
6 juillet 2011
10
25 oct. 2007 à 17:16
25 oct. 2007 à 17:16
Bonjour,
Je ne suis pas sûr, ne connaissant pas trop mmap(), mais a priori, si tu n'as pas besoin des informations dans les /dev, oui, ton code me parait bon.
Ne pas oublier de spécifier le type de retour de la fonction create_buf_t et de ne pas faire de copier coller : tu as deux fois la variable ar_size.
Lorsque tu appelles create_buf_t spécifie aussi les bons arguments.
Bon courage,
c-moi
Je ne suis pas sûr, ne connaissant pas trop mmap(), mais a priori, si tu n'as pas besoin des informations dans les /dev, oui, ton code me parait bon.
Ne pas oublier de spécifier le type de retour de la fonction create_buf_t et de ne pas faire de copier coller : tu as deux fois la variable ar_size.
Lorsque tu appelles create_buf_t spécifie aussi les bons arguments.
Bon courage,
c-moi