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
Bonjour,

Je voudrais savoir si il étais possible de définir une structure ou la taille des tableaux interne dépendrais d'un argument passé en paramètre à l'exécution du programme.


Ex : programme simulateur à 2 argument int (a et b):

execution du programme :
./sumulateur a b

definition de la structure :
typedef struct {
sema_t mysema;
int et;
int dir;
int free;
int[a] ar;
SUser[b] user;
} buf_t;


il s'agit donc :
Initialiser une structure avec une taille different en fonction des pamattre d'appelle du programme.
Une fois le programme exécuter, cette taille ne doit plus varie.

merci d'avance
A voir également:

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
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
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
0
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 :

	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
0
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
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
0