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

Linux Discussion :

[C]éclairssisement allocation dynamique


Sujet :

Linux

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut [C]éclairssisement allocation dynamique
    Bonjour à tous je suis devouring 22 célibataire et libre comme l'air (c'est vrai en plus) j'ai un léger soucis avec le fonction de malloc.
    je travail sous mac (donc xcode) et lorsque je lors de l'exécution de mon programme je crée un tableau de 1 millions sur 1 millions (un tableau 2D) et comme je m'y attend ca marche pas (j'ai que 2 go après tout).
    par contre je m'attendais pas à avoir ce message

    Projet Automate(1077) malloc: *** mmap(size=400003072) failed (error code=12)
    *** error: can't allocate region
    *** set a breakpoint in malloc_error_break to debug

    normalement quand l'ordi n'a pas de mémoire à allouer il dit a mon programme revient "non je n'ai pas de mémoire a te preter" et l'affaire est close non?
    alors pourquoi ce message d'erreur et comment l'eviter?


    voilà le code en question si ca peut servir

    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
    	do
    	{
    		continu = 1;
    		printf("\nVeuillez saisir la longueur de la grille : ");
    		longeur = saisieLong();
    		printf("\nVeuillez choisir la largeur de la grille : ");
    		largeur = saisieLong();
     
    		grille1 = malloc(longeur * sizeof(long));
    		for(long cpt = 0 ; cpt < longeur ; cpt ++)
    			grille1[cpt] = malloc(largeur * sizeof(long));
     
    		grille2 = malloc(longeur * sizeof(long));
    		for(long cpt = 0 ; cpt < longeur ; cpt ++)
    			grille2[cpt] = malloc(largeur * sizeof(long));
     
    		if(grille1 != NULL && grille2 != NULL)
    			continu = 0;
    		else
    		{
    			printf("\nGrille trop grande pas assez de mémoire veuillez rentrez des valeurs moins importantes\n");
    		}
    		}while(continu);

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Salut,
    Citation Envoyé par devouring strossus Voir le message
    Projet Automate(1077) malloc: *** mmap(size=400003072) failed (error code=12)
    *** error: can't allocate region
    *** set a breakpoint in malloc_error_break to debug

    normalement quand l'ordi n'a pas de mémoire à allouer il dit a mon programme revient "non je n'ai pas de mémoire a te preter" et l'affaire est close non?
    Je comprends pas trop ce qui te choque: tu t'attends a ce que l'ordi te dise qu'il ne peut pas allouer la memoire et effectivement il te dit qu'il ne peut pas allouer la memoire. Ou est le probleme?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut
    je m'attend à ce qu'il refuse d'allouer la memoire qu'il laisse mon pointeur sur en tant que NULL et qu'il passe aux autres instructions et non qu'il plante parce qu'il y a pas assez de memoire en m'affichant un joli message

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Quand tu lances dans un EDI souvent tu lances un debogger en meme temps. Pour xcode je ne sais pas mais vu la derniere ligne du message d'erreur je pense que c'est possible. Tu as essaye de lancer ton programme hors d'xcode?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut
    oui ca me fait la même chose, il faudra donc que j'empêche l'utilisateur de taper un trop grand nombre

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    667
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2007
    Messages : 667
    Points : 870
    Points
    870
    Par défaut
    Je pense que je vois le probleme: tu alloue une grande taille pour ta premiere dimension:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grille1 = malloc(longeur * sizeof(long));
    Mais si cette allocation echoue (ce qui est tres probable vu la taille) alors ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	for(long cpt = 0 ; cpt < longeur ; cpt ++)
    			grille1[cpt] = malloc(largeur * sizeof(long));
    Tu adresses un pointeur null
    Ca plante toujours si tu fais ca?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if ((grille1 = malloc(longeur * sizeof(long))) != NULL)
    	for(long cpt = 0 ; cpt < longeur ; cpt ++)
    		grille1[cpt] = malloc(largeur * sizeof(long));
     
    if ((grille2 = malloc(longeur * sizeof(long))) != NULL)
    	for(long cpt = 0 ; cpt < longeur ; cpt ++)
    		grille2[cpt] = malloc(largeur * sizeof(long));

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut
    oui ca plante toujours aussi bien

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    une question au hasard : tu es en 32 ou 64 bits ?

    2 gigs c'est pas supérieur à la limite d'un size_t en 32 ?
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut
    les deux
    les long je peux monter jusqu'a 1836311903 au moins et en double jusqu'a

    13069892237633987375451159370399930485366181594192098271589637
    12804246914958665671305098272161176251779527383812407555180307
    97439683443697785696230802473309617042775347304891963181519627
    28746352120353125938868240488380102846222939934556788482546493
    4136563115441584430300333788777345438315116223032518554681344.000000

    (c'est les dernières valeurs de la suite de fibonnaci que j'obtient avant que le programme me donne des fausses valeurs)

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Commence pas tester les valeurs retournées par tes malloc() au bon endroit (juste après le malloc), ça sera un bon début.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 90
    Points : 157
    Points
    157
    Par défaut
    je vais faire le teste avant comme tu le dis mais je garde la limitation car de toute facon je vois mal afficher un tableau de million sur un million dans le terminal.

    tout le monde s'enfout mais je viens de perdre 20 min à comprendre pourquoi mon programme s'arretait : j'ai oublié un break dans une fonction switch

Discussions similaires

  1. probleme d'allocation dynamique
    Par vince3320 dans le forum C
    Réponses: 10
    Dernier message: 22/04/2004, 16h27
  2. petit pbm allocation dynamique de stringGrid
    Par AnneOlga dans le forum C++Builder
    Réponses: 10
    Dernier message: 17/01/2004, 11h59
  3. Allocation dynamique de structures
    Par fr_knoxville dans le forum C
    Réponses: 8
    Dernier message: 06/05/2003, 21h59
  4. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

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