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 :

problème Mémoire avant appel au main ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut problème Mémoire avant appel au main ?
    Bonjour,

    Il semble que j'ai un problème de mémoire.

    voici les extraits du programme qui posent problème :

    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
    #define  MAX_FONCTIONS_UTILISATEURS          50000
     
    typedef struct
    {
     char*  nom;
     int    nb;
     int    type;
     int    debut;      /* Numero de la ligne ou se trouve l'accolade de debut. */
     int    fin;        /* Numero de la ligne ou se trouve l'accolade de fin : -1 => fonction non trouvee */
     int    nb_appels;  /* Nombre d'appels interessant */
     int    nb_requetes_Sybase;
     int    nb_requetes_Oracle;
     int    nb_chaines_SQL;
    } lFU;
     
    typedef struct
    {
     lFU   liste[MAX_FONCTIONS_UTILISATEURS];
     int   nb_fct_uti;
    } FU;
     
    ...
     
    int main(int argc, char** argv)
    {
    ...
     FU          fu;
     
     
    ...
    }
    et lorsque je compile, ça passe. Lorsque je lance, ça plante. En utilisant GDB, je m'aperçois que ça plante dès la ligne d'appel du main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Program received signal SIGSEGV, Segmentation fault.
    0x0040fc63 in probe ()
    (gdb) bt
    #0  0x0040fc63 in probe ()
    #1  0x00401520 in mainCRTStartup () at lister_tables_batch.c:341
    en redéfinissant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define  MAX_FONCTIONS_UTILISATEURS          40000
    ça fonctionne.

    pourquoi est-ce que cela planterait à 50000 ??? la structure lFu n'est pas si énorme !!

    Pour info, je suis sous environnement Cygwin Windows.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Car ton Pc a pu assez de memoire pour gerer. Tout simplement, il suffit de regarder avec un ctrl+alt+sup , pour voir approximativement ou en sont tes ressources.

    Sinon ta structure n'est pas si enorme que ça, non mais multiplie par MAX_FONCTIONS_UTILISATEURS.

    Quand on peut eviter des #define comme celui ci on le fait.

    Ne peux tu pas allouer dynamiquement , réagrandir ta structure au fur et a mesure, avec un realloc par exemple?

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par benhoeil
    pourquoi est-ce que cela planterait à 50000 ??? la structure lFu n'est pas si énorme !
    Pour la pile, si, elle ne fait souvent guere plus d'un Mo. Et c'est la que resident les tableaux statiquement alloues.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Je crois que si dès le début de l'exécution du programme il se termine en te renvoyant le signal SIGSEGV (qui signifie un accès mémoire invalide), ca veut tout dire ! Le mieux est de faire ca en allocation dynamique qui elle est rangée dans le tas, bien plus gros
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par Franck.H
    Le mieux est de faire ca en allocation dynamique qui elle est rangée dans le tas, bien plus gros
    Je pensais que la pile et le tas se partagaient un même espace mémoire. Dans ce "memory pool", le pile croit vers les adresses basses et le tas croit vers les adresses hautes ou inversement.
    Avais je donc mal compris ou ca dépendrai de l'implémentation alors?

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par homeostasie
    Je pensais que la pile et le tas se partagaient un même espace mémoire. Dans ce "memory pool", le pile croit vers les adresses basses et le tas croit vers les adresses hautes ou inversement.
    Avais je donc mal compris ou ca dépendrai de l'implémentation alors?
    Non tu n'as pas mal compris mais le tas est carrément plus gros que la pile. D'après ce que j'ai cru comprendre d'ailleurs, une des limites du tas est celle de la mémoire disponible ... a vérifier !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par homeostasie
    Je pensais que la pile et le tas se partagaient un même espace mémoire. Dans ce "memory pool", le pile croit vers les adresses basses et le tas croit vers les adresses hautes ou inversement.
    Avais je donc mal compris ou ca dépendrai de l'implémentation alors?
    Oui. Il y a aussi le cas des piles dont la taille est surveillée, les système avec une pile par thread etc.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut
    mon PC à 2Go de ram, et j'en ai 1,2 Go de libre. Pour moi la réponse de la pile à 1Mo expliquerait tout.
    je reprends un programme, et c'est sûr, je dois faire avec...
    d'ailleurs, j'ai en commentaire :

    /* Limitations : Oui je sais les tableaux dynamiques c'est mieux ... :o) */
    /* MAX_NOMS : Mot cles, fonctions systemes et librairies a ne pas traiter */
    Merci pour votre aide.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut
    pour la petite histoire, la "pile" doit être beaucoup plus grosse sur les serveurs SUN (je n'en connais pas les détails) puisque la même déclaration à 100000 ne pose aucun problème.

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Il faut savoir que la taille de la pile peut varier d'un système à un autre et donc par conséquent ce programme fonctionner sur un système mais peut-être pas sur un autre ... pour moi c'est un gros défaut mais si tu peux changer et le mettre en dynamique tant mieux
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Et ce n'est pas qu'une question de taille de la pile, ça depend aussi de comment elle est gerer. L'avanatge de l'allocation dynamique est que tu n'auras plus a te soucier du nombre d'utilisateur.
    Bon courage.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ton tableau de 50000 structures est sur la pile, et la pile est très petite.
    Si on suppose que tu es sur un système 32bits, chaque structure fait au moins 9*4=36 octets (possiblement 40 si les structures doivent être alignées sur 8 octets).
    -->1 800 000 octets, soit 1,71 Mo...

    Là, tu as plusieurs solutions possibles:
    • Déclarer ton tableau en static ou en variable globale, il sera donc dans le segment de données du programme et non dans la pile.
    • Allouer dynamiquement ton tableau en début de programme: Il sera donc dans le tas et non dans la pile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par benhoeil
    Il semble que j'ai un problème de mémoire.
    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
    #define  MAX_FONCTIONS_UTILISATEURS          50000
     
    typedef struct
    {
     char*  nom;
     int    nb;
     int    type;
     int    debut;      /* Numero de la ligne ou se trouve l'accolade de debut. */
     int    fin;        /* Numero de la ligne ou se trouve l'accolade de fin : -1 => fonction non trouvee */
     int    nb_appels;  /* Nombre d'appels interessant */
     int    nb_requetes_Sybase;
     int    nb_requetes_Oracle;
     int    nb_chaines_SQL;
    } lFU;
     
    typedef struct
    {
     lFU   liste[MAX_FONCTIONS_UTILISATEURS];
     int   nb_fct_uti;
    } FU;
     
    int main(int argc, char** argv)
    {
     FU          fu;
    }
    pourquoi est-ce que cela planterait à 50000 ??? la structure lFu n'est pas si énorme !!
    Ben si. Tu définis un gros objet en mémoire automatique, çaÿ mal.

    La mémoire automatique est une ressource limitée et incontrôlable. La prudence d'impose. Elle est basée sur les 'bonnes pratiques' : au-delà de quelques centaines de char (voire moins en embarqué), pas de mémoire auto.

    Soit tu définis l'objet en mémoire statique ('static') -- méthode de chacal, mais ça marche et c'est acceptable si la variable est dans le main(), car quand on est civilisé, on appelle jamais main() --, ou alors en mémoire allouée avec malloc()/free().

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 66
    Par défaut
    je ne me suis jamais posé la question de l'endroit ou était stockées les variables en fait. Là j'en apprend bcp d'un coup (sans forcément comprendre):
    pile ?
    tas ?

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça, c'est ce qu'on nous apprenait en premier sur les programmes informatiques.
    Un programme chargé est composé de 4 zones mémoire:
    • Code: Le code exécutable du programme. En théorie, c'est la seule zone où le processeur peut exécuter du code.
    • Données: Les données statiques du programme. C'est là que sont toutes les variables globales et les variables locales static. Dans les deux cas, il n'existe qu'un exemplaire de chaque par processus, une variable locale static est donc l'équivalent d'une variable globale.
    • Pile: La zone où se trouvent les variables "automatiques" du programme, c'est-à-dire les variables locales non-statiques de chaque fonction. Une variable est empilée sur la pile au début de bloc où elle est déclarée et détruite en fin de bloc. Et comme son nom l'indique, les variables locales des différentes fonctions sont empilées à mesure que les fonctions appellent d'autres fonctions, et sont dépilées quand les fonctions retournent.
    • Tas: Une zone souvent limitée uniquement par la mémoire disponible. C'est là où tapent les malloc().
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Il y a aussi la zone bss comprise dans le "system image" (text+data+bss). Je crois que le segment bss comprends les variables globales non initialisées.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par homeostasie
    Il y a aussi la zone bss comprise dans le "system image" (text+data+bss). Je crois que le segment bss comprends les variables globales non initialisées.
    Détails d'implémentation. Merci de ne pas mélanger les différents niveaux d'abstraction.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par benhoeil
    je ne me suis jamais posé la question de l'endroit ou était stockées les variables en fait. Là j'en apprend bcp d'un coup (sans forcément comprendre):
    pile ?
    tas ?
    http://emmanuel-delahaye.developpez....s.htm#pile_tas

    Et hop !

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

Discussions similaires

  1. Mémoire disponible avant appel d'un SetLength
    Par Rekin85 dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2012, 14h00
  2. Problème mémoire sur appels fonction
    Par flo73 dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2011, 15h39
  3. [C#] Problème pour l'appel d'objet...
    Par AntiSAL dans le forum Windows Forms
    Réponses: 2
    Dernier message: 14/06/2004, 09h59
  4. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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