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 :

Allocation dynamique de mémoire


Sujet :

C

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut Allocation dynamique de mémoire
    Bonjour.
    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
    20
    21
     
    int main(int argc, char *argv[])
    {
    	Heap* f;
    	createHeap(f);
    	printf("f has n= %i nodes\n",f->nodes);
     
    	return 0;
    }
     
    //this function creates a heap: memory allocation and data fields are initialised.
    Heap* createHeap(Heap* f){
        f = (Heap*)malloc(sizeof(Heap*));
    	initialise(f);
    	return f;
    }
     
    void initialise(Heap* f){
    	f->nodes = 100;
    	f->min = NULL;
    }
    Normalement f->nodes = 100; mais là ça me dit que ça vaut 0. Une idée pourquoi?

    ps: je tiens a préciser que la signature de la fonction est imposée. sinon j'aurais fait
    [code]
    Bonjour.
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Heap* createHeap(){
        Heap* f = (Heap*)malloc(sizeof(Heap*));
    	initialise(f);
    	return f;
    }

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Tu travaille sur le pointeur, alors qu'il faudrait travailler sur la valeur pointée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Heap* createHeap(Heap* f){
        *f = malloc(sizeof(Heap));
    	initialise(f);
    	return f;
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Tu travaille sur le pointeur, alors qu'il faudrait travailler sur la valeur pointée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Heap* createHeap(Heap* f){
        *f = malloc(sizeof(Heap));
    	initialise(f);
    	return f;
    }
    Euh ça marche pas. J'ai:
    "incompatible types when assigning to type Heap from type void*"

    Et la fonction malloc elle renvoi un pointeur. Du coup avec ce que tu me proposes, f va pointer sur un pointeur?...

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    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
    void initialise(Heap* f){
    	f->nodes = 100;
    	f->min = NULL;
    }
    Heap* createHeap(Heap** f){
        *f = malloc(sizeof **f);
    	initialise(*f);
    	return *f;
    }
    int main(int argc, char *argv[])
    {
    	Heap* f;
    	createHeap(&f);
    	printf("f has n= %i nodes\n",f->nodes);
    	free(f);
    	return 0;
    }

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Le problème n'est pas dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Heap* createHeap(Heap* f){
        f = (Heap*)malloc(sizeof(Heap*));
    	initialise(f);
    	return f;
    }
    encore que tu devrais avoir sizeof(Heap) et non sizeof(Heap*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     f = malloc(sizeof(Heap));
    Mais dans la manière de l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Heap* f;
    	f = createHeap(f);
    // ou
            f = createHeap(NULL);
    Maintenant, cela n'explique pas le prototype utilisé qui, comme tu le dis devrait être

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Citation Envoyé par diogene Voir le message
    Le problème n'est pas dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Heap* createHeap(Heap* f){
        f = (Heap*)malloc(sizeof(Heap*));
    	initialise(f);
    	return f;
    }
    encore que tu devrais avoir sizeof(Heap) et non sizeof(Heap*)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     f = malloc(sizeof(Heap));
    Mais dans la manière de l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	Heap* f;
    	f = createHeap(f);
    // ou
            f = createHeap(NULL);
    Maintenant, cela n'explique pas le prototype utilisé qui, comme tu le dis devrait être
    Merci beaucoup. J'ai compris l'erreur. C'est à cause du prototype bizarre que j'ai pas fait gaffe.
    En tout cas, Diogène, ça fait 3 fois que tu me sors d'impasse (sûrement pas la dernière,... Merci

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut Autre souci
    D'ailleurs, pour éviter de créer trop de forum, je continue là dedans. Là je comprends vraiment pas ce qu'il m'arrive:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Heap* insert(Heap* f, Heap_Element* x, int key){
        x->key = key;
        x->degree = 0;
        x->child = x->parent = NULL;
        x->mark = FALSE;
        return x;
    }
    Ca me dit: Error: Dereferencing pointer to incomplete type au 4 lignes d'affectation. Voici la déclaration de Heap_Element:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct Heap_element Heap_Element;
    struct Heap_Element{
    	int key;
    	void* data;
    	//if the node has no siblings, left_sib = right_sib = the node itself
    	Heap_Element* left_sib;
    	Heap_Element* right_sib;
    	//if no parent or child the pointer is NULL
    	Heap_Element* parent;
    	Heap_Element* child;
    	int degree;
    	Boolean mark;
    };
    Ce que je comprends pas c'est que avec ma fonction initialiser(f) de toute à l'heure y avait pas de souci. Je fais la même chose là mais ça bug...

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Heap_element Heap_Element;
    struct Heap_element{....
    // ou
    typedef struct Heap_Element Heap_Element;
    struct Heap_Element{....

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Espagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 145
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct Heap_element Heap_Element;
    struct Heap_element{....
    // ou
    typedef struct Heap_Element Heap_Element;
    struct Heap_Element{....
    Ok, là je me sens vraiment con. Existe-t-il des outils particuliers pour éviter ce genre de connerie à part bien ouvrir les yeux?

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Existe-t-il des outils particuliers pour éviter ce genre de connerie à part bien ouvrir les yeux?
    Le message d'erreur lui-même :
    Dereferencing pointer to incomplete type
    indique que la composition du type Heap_Element n'est pas connue. Donc, il faut regarder pourquoi.

Discussions similaires

  1. probleme d'allocation dynamique de mémoire
    Par Blo0d4x3 dans le forum C
    Réponses: 2
    Dernier message: 13/03/2007, 07h53
  2. Allocation dynamique de mémoire : Limitations ?
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 22/03/2006, 17h03
  3. Allocation dynamique de mémoire
    Par cd090580 dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 12/11/2005, 11h17
  4. [VC++/ASM] Allocation dynamique de mémoire ?
    Par Magus (Dave) dans le forum x86 32-bits / 64-bits
    Réponses: 7
    Dernier message: 21/12/2004, 15h05
  5. Allocation dynamique de mémoire en asm
    Par narmataru dans le forum Assembleur
    Réponses: 7
    Dernier message: 17/12/2002, 22h31

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