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 :

fonction pour allouer de la memoire


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 122
    Par défaut fonction pour allouer de la memoire
    Voila je voudrais faire une fonction qui prend en parametre un double pointeur et deux entier pour determiner les tailles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void init_maillage(double **dT,int imax,int jmax)
    {
    	int i;
     
    	dT=(double**)malloc(sizeof(double*)*imax);
    	for(i=0;i<imax;i++){
    		dT[i]=(double*)malloc(sizeof(double)*jmax);
    	}
     
    }
    Mais ça marche pas

    Pour donner plus de details:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct maillage_t{
    	int Ns,Nt;
    	double **sommet;
            double **triangle;
    }maillage_t;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //ceci marche
    maillage->sommet=(double**)malloc(sizeof(double*)*(maillage->Ns));
    	for(i=0;i<maillage->Ns;i++){
    		maillage->sommet[i]=(double*)malloc(sizeof(double)*2);
    	}
    merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 061
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 061
    Billets dans le blog
    142
    Par défaut
    Il faut un pointeur en plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void init_maillage(double ***dT,int imax,int jmax)
    {
    int i;
     
    	*dT=(double**)malloc(sizeof(double*)*imax);
    	for(i=0;i<imax;i++){
    		(*dT)[i]=(double*)malloc(sizeof(double)*jmax);
    	}
    
    }
    ( Je sais pas si je vais réussir l'expliqué ).

    C'est juste, parce que nous voulons modifié la valeur passé dans la fonction. Comme nous voulons un tableau à double dimension, pour avoir sa valeur en paramètres, il faut un pointeur sur celui ci. Sinon, on ne change pas la valeur à l'extérieur de la fonction d'initialisation, donc on perd de la mémoire ( fuite ).

    ( En mieux expliquer, le premier malloc, va changer la valeaur de Dt directement. Mais comme on le sais tous, pour récupéré une valeur avec un paramètre,il faut utiliser un pointeur. Du coup, pour avoir la bonne chose, il faut passer un pointeur sur un tableau à double dimension, car le malloc va modifier la valeur pointé ( et non le pointeur en lui même ) , donc on pourra récupéré notre tableau par la suite. )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 122
    Par défaut
    Je ne comprend pas trop .... c'est compliqué
    Mais du coup vu que le parametre est ***Dt il fau que je passe une adresse d'un double pointeur quand j'appelle la fonction par exemple:

    int **p;
    init_maillage(&p,4,7)

    Un peu tordu quand meme
    Merci beaucoup

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Effectivement, il faut soit ajouter un niveau d'indirection supplémentaire, soit retourner l'adresse du pointeur, comme ci-dessous:

    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
    double ** init_maillage(int imax,int jmax)
    {
        double **dT = NULL;
     
        dT = malloc(imax * sizeof *dT );
        /* -tc- Attention a toujours verifier la validite de l'adresse retournee
           par malloc() */
        if (dT != NULL)
        {
            int i;
            int err = 0;
     
            for (i = 0; err == 0 && i < imax; i++)
            {
                dT[i] = malloc(jmax * sizeof *dT[i]);
                if (dT[i] == NULL)
                {
                    err = 1;
                }
            }
     
            if (err == 0)
            {
                /* -tc- Initialisation de dT */
            }
            else
            {
                /* -tc- Erreur d'allocation: on fait le menage */
                do
                {
                    i--;
                    free(dT[i]);
                }
                while (i > 0);
     
     
                free(dT), dT = NULL;
            }
        }
        else
        {
            /* -tc- Erreur: allocation de memoire impossible. La fonction retournera
               la valeur NULL */
        }
     
        return dT;
    }

    Voici un squellette pour l'utilisation de cette fonction:

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <stdio.h>
    #include <stdlib.h>
     
    double ** init_maillage(int imax,int jmax)
    {
        double **dT = NULL;
     
        dT = malloc(imax * sizeof *dT );
        /* -tc- Attention a toujours verifier la validite de l'adresse retournee
           par malloc() */
        if (dT != NULL)
        {
            int i;
            int err = 0;
     
            for (i = 0; err == 0 && i < imax; i++)
            {
                dT[i] = malloc(jmax * sizeof *dT[i]);
                if (dT[i] == NULL)
                {
                    err = 1;
                }
            }
     
            if (err == 0)
            {
                /* -tc- Initialisation de dT */
            }
            else
            {
                /* -tc- Erreur d'allocation: on fait le menage */
                do
                {
                    i--;
                    free(dT[i]);
                }
                while (i > 0);
     
     
                free(dT), dT = NULL;
            }
        }
        else
        {
            /* -tc- Erreur: allocation de memoire impossible. La fonction retournera
               la valeur NULL */
        }
     
        return dT;
    }
     
    void detruire_maillage(double ***p_dT, int imax)
    {
        if (p_dT != NULL && *p_dT != NULL)
        {
            double **dT = *p_dT;
            int i;
     
            for (i = 0; i < imax; i++)
            {
                free(dT[i]);
            }
            free(dT);
            *p_dT = NULL;
        }
    }
     
    int main(void)
    {
        int err = 0;
     
        double **dT = init_maillage(4, 5);
        if (dT != NULL)
        {
            /* -tc- Suite du code ici */
     
            detruire_maillage(&dT, 4);
        }
        else
        {
            /* -tc- Erreur d'allocation */
            err = EXIT_FAILURE;
        }
     
        return err;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 122
    Par défaut
    Merci beaucoup je comprends mieux la

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/12/2009, 23h00
  2. Réponses: 12
    Dernier message: 02/09/2009, 18h24
  3. Fonction pour savoir si un ordi est connecté au reseau
    Par LitteulKevin dans le forum Windows
    Réponses: 17
    Dernier message: 13/09/2004, 14h12
  4. Détourner une fonction pour copier un fichier en mémoire
    Par Rodrigue dans le forum C++Builder
    Réponses: 6
    Dernier message: 12/11/2003, 08h29
  5. Fonction pour récuperer mon adresse IP
    Par néo333 dans le forum Web & réseau
    Réponses: 11
    Dernier message: 01/11/2003, 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