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 :

Not enough space


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Not enough space
    Bonsoir à tous,
    J'ai un tableau qui me retourne un Null et um message m'affiche « Not enough space code de l'erreur 12 ». En se basant sur ce lien http://www.developpez.net/forums/d13...e-1-dimension/ , j'ai ajouté l'instruction ci-dessous à la fin de mon code pour voir si je dépasses la taille admise ou pas.
    « printf ("_HEAP_MAXREQ = %llx\n",(unsigned long long int)_HEAP_MAXREQ); ».
    Malheureusemnt? j'ai eu ces deux warning :
    «unknown conversion type character 'l' in format»
    «too many arguments for format »
    Comment je peux le régler sachant que je code en C sous windows7 64 bit?
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 780
    Points
    23 780
    Par défaut
    Bonjour,

    Un tableau ne peut pas « te retourner » un NULL. Ce n'est pas une fonction.

    Peut-on voir ton code et, en particulier, la manière dont est alloué ton tableau ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    voici mon code :
    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
     
            pile= malloc (n*sizeof (long int));
            if (pile==NULL)
            {
                printf ("pile Code de l'erreur : %d\n", errno);
                perror("Erreur");
            }
            else
            {
     
                fonction (n,copie1,sum,fichier);
                if(pile != NULL)
                {
                    solution++;
                }
     
                free (pile);
                pile=NULL;
            }
    J'ai le message suivant pile code de l'erreur 12 : not enough space

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Et que vaut n ?

    La macro que tu présentes est définie dans malloc.h et semble spécifique à Windows : http://msdn.microsoft.com/fr-fr/libr...(v=vs.80).aspx Je n'ai perso pas les erreurs de compilation que tu décris. Attention quand même à cette valeur : elle n'est pas dynamique. Cela veut dire que c'est la taille maximale potentielle que tu peux demander. Cela ne veut pas dire qu'à un instant t, tu puisses demander tout ça car la quantité de mémoire disponible est sûrement inférieure.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    n= 60
    j'ai les allocations suivante avant pile :
    Tableau = malloc (60 * sizeof(job));job est de type struct, elle contient 4 champs de type long int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ordre = malloc (57 * sizeof(long int));
    copie1 = malloc (60 * sizeof(job));
    ens et combi dans une procedure qui génèrent toutes les combinaisons possibles de combi parmi ens (par exemple je veux 27C11 ) :
    ens = malloc (27*sizeof (long int)); combi= malloc (11*sizeof (long int));puis à chaque combinaison généré je réserve pile je fais des calcules et je réserve choix. (nbre entre 0 et 60 )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    nbre=0;
    choix= malloc (nbre *sizeof (long int));
     for (i=0;i<n;i++)
                {
                    if (copie1[i].d>=sum)
                        nbre++;
                 }
     
    choix= realloc(choix, sizeof(long int) *nbre);
    et je désalloue choix puis pile
    pile= malloc (60*sizeof (long int));et a la fin de mon programme je désalloue ens, combi, copie1, tableau et ordre

    J'ai fais un code test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
     
    int main()
    {
        printf("Hello world!\n");
        printf ("_HEAP_MAXREQ = %llx\n",(unsigned long long int)_HEAP_MAXREQ);
        return 0;
     
    }
    et j'ai les même erreurs de compilation (je code avec code blocks).

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Tu compiles sans modifier les options de compilation par défaut ? Si oui, l'option par défaut est sûrement un mode C89/90, c'est-à-dire soit -ansi soit -std=gnu90. Or, le type long long int est venu avec le C99 si ma mémoire est bonne. Rajoute donc une option -std=c99 dans les options du compilateur pour voir si cela corrige le problème.

    Pour ce qui est du problème mémoire, il faut que tu essayes de créer un code minimum qui reproduise le problème, en réduisant ton code actuel.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2012
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    j'ai coché l'option : In C mode, ISO C90 et mon code marche sans erreurs de compilation . Merci Bktero pour votre aide

    _HEAP_MAXREQ = FFFFFFe0 ça veut dire quoi ?

    sans cette procédure mon code marche sans avoir le message not enough space
    static long int *pile=NULL;
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    void fonction (long int n, job *copie1, long int sum,FILE *fichier)
    {
     
        long int i,k,j,nbre,max,ind;
            long int *choix=NULL;
            k=n-1;
            while (k>=0)
            {
                nbre=0;
                choix= malloc (nbre *sizeof (long int));
                j=0;
                for (i=0;i<n;i++)
                {
                    if (copie1[i].d>=sum)
                    {
                        nbre++;
                        choix= realloc(choix, sizeof(long int) *nbre);
                        if (choix==NULL)
                        {
                            printf (" choix Code de l'erreur : %d\n", errno);
                            perror("Erreur");
                        }
                        else
                        {
                           choix[j]=i+1;
                           j++;
                        }
                    }
     
                }
     
                if (nbre==0)
                {
                    pile=NULL;
                    return;
                }
                else
                {
                    max = choix[0]-1;
                    for (i=0;i<nbre;i++)
                    {
                        ind=choix[i]-1;
                        if ( copie1[ind].p>copie1[max].p)
                        {
                            max= ind;
                        }
                    }
     
                    pile[k]= max+1;
                    sum=sum-copie1[max].p;
                    copie1[max].d=-1;
                    k--;
                    free (choix);
                    choix=NULL;
                }
     
    }

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 483
    Points : 13 681
    Points
    13 681
    Billets dans le blog
    1
    Par défaut
    Mouais c'est bizarre qu'en activant le mode C90 cela compile, alors que long long int a bien été introduit en C99. Passons.

    _HEAP_MAXREQ = FFFFFFe0 ça veut dire quoi ?
    Je présume que ça veut dire que si tu demandes plus, malloc() échouera forcément.

    sans cette procédure mon code marche sans avoir le message not enough space
    Quelle procédure ?

    Le code que tu nous montres n'est pas satisfaisant pour t'aider. Il faut nous donner un main qui initialise les paramètres et qui appelle la fonction qui plante (au moins, qui plante chez toi). Sans ça, on ne pourra rien faire.

    Plus généralement sur le code, on peut dire qu'il est incompréhensible. Des points d'amélioration :
    • Une fonction ne devrait jamais s'appeler fonction() car on ne sait pas ce qu'elle fait
    • Tu ne mets pas de commentaire, tu devrais.
    • Tu mets un if à l'intérieur d'un for et si le if est vrai, alors realloc() direct. Pourquoi as-tu besoin de réallouer ?
    • Tes variables sont mal nommées. On se doute d'une variable de type long int est un nombre, nomme la autrement que nbre. copie1 mais il n'y a pas de copie0 et surtout il n'y a pas d'autres structure du même type alors elle ne copie rien. Bref, il est très important de mettre des noms de variables qui ont un sens et décrivent ce que font vraiment les variables.
    • Evite d'utiliser les variables globales autant que possible.
    • Tu vérifies que realloc() n'échoue pas mais tu ne vérifies pas le retour de malloc().

Discussions similaires

  1. Réponses: 6
    Dernier message: 26/08/2011, 13h30
  2. could not reserve enough space
    Par khaoula_14_05 dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 08/05/2009, 14h01
  3. Could not reserve enough space for object heap
    Par zerocoolyoussef dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 03/05/2009, 20h13
  4. [BODI]erreur Db:not enough space
    Par tigrebin dans le forum BODI
    Réponses: 3
    Dernier message: 06/04/2009, 10h13
  5. Could not reserve enough space for object heap
    Par lestathor dans le forum Tomcat et TomEE
    Réponses: 5
    Dernier message: 30/10/2007, 17h35

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