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 :

adressage mémoire avec gcc


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Résolu] adressage mémoire avec gcc
    Bonjour,

    Je développe un programme sous linux.
    Je commence à avoir pas mal de variables et je constate que mon programme segfault si j'en déclare trop.

    Connaissez-vous la taille maximale d'une structure ?

    Voici ce qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            engine_struct	stre_mot;
    	engine_status	liais;
     
    	stre_mot = get_engine_struct(argv[2]);
    	liais=defliaisons(stre_mot); //C'est là que ça plante, à l'appel de defliaisons. Aucune instruction dans defliaisons n'a le temps d'être exécutée.
    avec :

    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
    typedef struct
    {
           tpe tpecol[401]; //etat thermo dans collec.
           double rho[401]; // rho dans collec.
           double u[401]; // vitesse particules dans collec.
           double en[401]; // energie dans collec.
           double dx; // dx mas du tuyau
           double n; //nombre de noeud du tuyau
           double d[401]; //diamètre dans tuyau
           double s[401]; //Section dans tuyau
           double x[401];
           double epsilon; //rugosité tu pipe
           double tw;// temperature paroie collect.
           char *typeinlet; //type de l'élément connecté en entrée
           num_el_st numinlet; // numéro de structure et d'élément de l'élément connecté en entrée
           char *typeoutlet; //type de l'élément connecté en sortie
           num_el_st numoutlet; // numéro de structure et d'élément de l'élément connecté en sortie
           } col_status;
     
    typedef struct
    {
    	tpe tpe; //état thermo dans le cylindre.
    	int numel; //numéro d'élémént
    	char *typeinlet; //type de l'élément connecté en entrée
    	num_el_st numinlet; // numéro de structure et d'élément de l'élément connecté en entrée
    	char *typeoutlet; //type de l'élément connecté en sortie
    	num_el_st numoutlet; // numéro de structure et d'élément de l'élément connecté en sortie
    	char *type3; //type de l'élément connecté en 3
    	num_el_st num3; // numéro de structure et d'élément de l'élément connecté en 3
    } cyl_status;
     
    typedef struct
    {
    	tpe tpe; //état thermo dans la jonction
    	int numel; //numéro d'élémént
    	int nb_of_connections; //nombre de connections
    	char *type[4]; //type de l'élément connecté en i
    	num_el_st num[4]; // numéro de structure et d'élément de l'élément connecté en i
    } vol_status;
     
     
    typedef struct
    {
    	vol_status col_v[51]; //Status des collecteurs simulés par un volume
    	col_status col[[color=red]48[/color]]; //Status des collecteurs simulés par les équations ondes
    	vol_status vol[21]; //Status des volumes (ou jonctions)
    	cyl_status cyl[21]; //Status des cylindres
    } engine_status;
    Voici ce qui passe:

    même chose avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    typedef struct
    {
    	vol_status col_v[51]; //Status des collecteurs simulés par un volume
    	col_status col[[color=red]41[/color]]; //Status des collecteurs simulés par les équations ondes
    	vol_status vol[21]; //Status des volumes (ou jonctions)
    	cyl_status cyl[21]; //Status des cylindres
    } engine_status;




    Avez-vous une idée ? Est-ce qu'il existe une option pour augmenter la taille d'adressage d'un exécutable généré avec gcc ?


    Merci d'avance

    Frédéric

    [Merci de penser à entourer votre code avec les balises prévues à cet effet. gansoleil]

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 123
    Points
    28 123
    Par défaut
    Bonjour,

    Qu'entends-tu par
    Je commence à avoir pas mal de variable et constate que mon programme segfault si j'en déclare trop.
    Qu'est-ce que trop ? 1 ? 10 ? 1000 ?

    As-tu une idée de la taille globale de la structure que tu déclares ?
    Si ce n'est pas le cas, pourrais-tu nous la donner ?

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: adressage mémoire avec gcc
    Citation Envoyé par fraisdos
    Je développe un programme sous linux.
    Je commence à avoir pas mal de variables et je constate que mon programme segfault si j'en déclare trop.
    Si elles sont définies en mémoire automatique (variables locales), c'est normal. Il faut absolument éviter les gros objets (tableaux, structure) en mémoire auto.
    Connaissez-vous la taille maximale d'une structure ?
    Ce n'est probablement pas le problème. Si tu y tiens, les minimums garantis par le langage sont :
    • C90 : 32768 bytes
    • C99 : 65536 bytes

    Pour une implémentation donnée, un objet automatique ou statique ne peut dépasser la taille de (size_t)-1 bytes.

    Pour un objet dynamique, c'est le (size_t)-1 * (size_t)-1 bytes (pour ça, il faut calloc()). Il s'agit de limites absolues théoriques. Dans la réalité, il faut tester la valeur retournée par *alloc(). Si c'est NULL, l'allocation a échoué.
    Voici ce qui plante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            engine_struct	stre_mot;
    	engine_status	liais;
    .
    Si ceci est défini en mémoire auto (pas clair, ton code est incomplet), tu as compris pourquoi ça plante. 2 monstres en mémoire auto -> crash.
    Essayer en static pour lever le doute :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static engine_struct	stre_mot;
    static engine_status	liais;
    mais c'est du code à la barbare. Ca peut suffire dans une bidouille, mais ça consomme de la mémoire de façon permanente (et je ne parle pas des problèmes de réentrance), pas sûr que l'application supporte ça...

    Sinon, la solution est évidemment l'allocation dynamique (penser à liberer le monstre après usage).

  4. #4
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci Emmanuel,

    En effet avec static le programme passe.
    Mais comme vous me le conseillez je vais faire de l'allocation dynamique.

    Le programme que l'on développe avec mon collégue permettra de simuler les moteurs multicylindres (jusqu'à 20). Ces moteurs peuvent avoir enormément de collecteurs dans lesquels on résoud les phénoménes d'ondes par discrétisation. Donc beaucoup de tableaux pour beaucoup de variables.

    Merci pour votre aide,


    Frédéric

  5. #5
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Puis avec l'allocation dynamique tout fonctionne parfaitement. J'ai pu augmenter le nombre de variables.

    Merci beaucoup,

    Je continue mon programme.


    Frédéric

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

Discussions similaires

  1. Allouer un segment de mémoire avec "GNU GCC Compiler&qu
    Par damien99 dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 22/06/2006, 23h18
  2. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57
  3. define avec GCC.
    Par vagabon dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/06/2003, 14h04
  4. les .a avec gcc
    Par Groove dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 31/03/2003, 07h59
  5. getch() avec gcc
    Par Jorus dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/12/2002, 14h47

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