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


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut Allocation dynamique
    Salut !!

    voici une autre question:


    j'ai le code suivant

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    typedef struct{
    	long lId;
    	char *pszChaine;
    } UneStruct;
     
    #define CR_OK (short)0
    #define CR_NOK (short)1
     
    short libererMemoire (void **pvPointeur);
    short allouerMemoire( void **pvPointeur, long lLongueur);
    int foo2( long *plTab, short *psNb );
     
    int main(int argc,char *argv[]){
     
    	char szChaineOrg[] = "Bonjour";
    	short sRetour = CR_OK;
     
    	// Ajout d'elements à un tableau dont on ne connait pas la taille
    	{
    		long *plTabLong = NULL;
    		short sNbElement = -1;
    		long sIndex = -1;
     
    		printf("sNbElement avant foo2(): %d\n", sNbElement);
    		foo2( plTabLong, &sNbElement );
    		printf("sNbElement apres foo2(): %d\n", sNbElement);
     
    		libererMemoire( &plTabLong );
    	}
     
    	return CR_OK;
    }
     
     
    int foo2( long *plTab, short *psNb ){
    	short sRetour = CR_OK;
    	short sNbElement = 15;
    	long lTabLong[sNbElement];
    	long sIndex = 0;
     
    	memset( lTabLong, '\0', sizeof(lTabLong) );
     
    	for (sIndex = 0; sIndex < sNbElement; sIndex++)
    		lTabLong[sIndex] = sIndex;
     
    	sRetour = allouerMemoire( &plTab, sizeof(lTabLong) );
    	if ( sRetour == CR_OK ){
     
    		memcpy( plTab, lTabLong, sizeof(lTabLong) );
    		(*psNb) = sNbElement;
     
    	}else{
     
     
    	}
     
    	return sRetour;
    }
     
     
    // Allocation de memoire dynamique
    short allouerMemoire (void **pvPointeur, long lLongueur){
     
            short sRetour = CR_OK;
     
            /*  traitement  */
     
            if (lLongueur > 0) {
                    lLongueur += sizeof (long);
                    *pvPointeur = (void *) malloc (lLongueur);
                    if (*pvPointeur == (void *) NULL) {
                            sRetour = 1;
                    }
                    else {
                            memset (*pvPointeur, '\0', lLongueur);
                            *pvPointeur = *( char** ) pvPointeur + sizeof( long );
                    }
            }
            else {
                    *pvPointeur = (void *) NULL;
                    sRetour = 1;
            }
            return (sRetour);
    }
     
     
    // Libération de mémoire dynamique
    short libererMemoire (void **pvPointeur){
     
            /*  declarations des variables      */
            short sRetour = CR_OK;
     
            /*  traitement  */
            if (*pvPointeur != (void *) NULL) {
     
                    *pvPointeur = *( char** ) pvPointeur - sizeof( long );
                    free( *pvPointeur );
                    *pvPointeur = (void *)NULL;
            }
     
            return (sRetour);
    }

    comment fais-je pour afficher les valeurs du tableau en dehors de foo2() ??

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu as une erreur de conception avec tes passages de pointeurs,
    Il faut passer l'adresse de plTabLong si tu veux que les modifs soient prises en compte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foo2( &plTabLong, &sNbElement );
    Le prototype de foo2 doit donc être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int foo2( long **plTab, short *psNb )
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Par défaut
    merci...

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