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 :

Supprimer le plus d'allocation dynamique


Sujet :

C

  1. #1
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut Supprimer le plus d'allocation dynamique
    Re-Bonjour,
    Mon code comporte plusieurs allocations dynamiques que l'on me conseille de supprimer (ce sont tous des allocations sur des pointeurs de structures). mais je ne vois pas comment les supprimer, je suis pourtant bien obligé d'allouer les memoires d'un pointeur de structure pour pouvoir ecrire dans sa memoire par la suite !
    Je vous donne ici quelques exemples de fonctions ou il faudrais que je supprime mes allocations dynamiques :

    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
    struct sql_result *
    sql_make_empty_sql_result()
    {
    	struct sql_result * result = (struct sql_result *) malloc(sizeof(struct sql_result));
    	if (check_not(result == NULL, "Can't alloc result"))
    	{
    		return NULL;
    	}
    	result->nrows		   = 0;
    	result->ncolumns	   = 0;
    	result->row_array_size = 0;
    	result->binary		   = 0;
    	result->att_desc	   = NULL;
    	result->rows		   = NULL;
    	return result;
    }
    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
    struct sql_notify *
    sql_notify_read ( struct sql_connection * sql_conn, const char * msg )
    {
    	struct sql_notify * notify;
    	char   name[256];
    	int	   sread = 0;
    	uint32_t id = sql_get_int(sizeof(uint32_t), msg);
    	sread += sizeof(uint32_t);
    	strcpy(name, msg + sread);
    	/* The last character is not include in the name, it's an extra empty string because not inplementd yet in the protocol	*/
    	name[strlen(name)-1] = '\0';
    	sread += strlen(name);
    	notify = (struct sql_notify *) malloc(sizeof(struct sql_notify) + sread);
    	if (check_not(notify == NULL, "Can't alloc sql_notify"))
    	{
    		return notify;
    	}
    	notify->id	 = id;
    	notify->name = (char *) notify + sizeof(struct sql_notify);
    	strcpy(notify->name, name);	
    	return notify;	
    }
    il y a d'autres fonctions mais je ne les mes pas toutes car elles sont trop longues. Si quelqu'un pouvais me dire si il y avais une autre facon de faire pour optimiser mon code de cette facon ca serais cool !
    Merci d'avance.

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Bonjour,

    Je ne vois qu'une solution : passer le résultat en paramètre.
    Remplacer :
    struct sql_result *sql_make_empty_sql_result();

    par :
    int sql_make_empty_sql_result(struct sql_result *res);

  3. #3
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    Avant l'appel à
    int sql_make_empty_sql_result(struct sql_result *res);

    tu devras allouer le piointeur non ?

  4. #4
    Membre chevronné
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Par défaut
    Bah si le but est d'éliminer les alloc dynamiques, tu alloue ta structure en auto, et tu passe le pointeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct sql_result result;
    int res = sql_make_empty_sql_result(&result);

  5. #5
    Membre éclairé Avatar de Fooshi
    Homme Profil pro
    ICD
    Inscrit en
    Juin 2002
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ICD
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 508
    Par défaut
    Pourquoi pas ... en tout cas je ny aurais jamais pensé ! merci

    Autre probleme malgré tout, voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct sql_result
    {
    	int 						nrows;				// Number of rows returned by the query.	
    	int 				  		ncolumns;			// Number of columns returned by row description.
    	struct sql_att_desc		  * att_desc;			// A pointer to a row description.
    	struct sql_att_value	 ** rows;				// Each sql_result is an array of sql_att_value.
    	int 				 		row_array_size;		// Allocated size of rows array.
    	int 				 		binary;				// Binary row values if binary == 1, otherwise Text.
    };
    J'initialise ma structure comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static int	
    sql_get_row_description( struct sql_connection * sql_conn, const char * msg )
    {
    	struct sql_result result;
            sql_make_empty_sql_result(&result);    // Initilisation de la structure
            ...
    }
    Mais comment initialiser les pointeurs sur les autres structures att_desc et rows ?

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Pour ma part, si c'est encore une demande de ton maitre de stage, je trouve qu'il véhicule des idées bizares et des contraintes qui n'apportent rien ni en performances ni en lisibilité. Ne pas utiliser d'allocations dynamique, ne pas faire de memcpy.. ?? il préfère peut-ete le Basic

    N.B. Le memmove est preferable au memcpy car il gere l'overlap.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fooshi Voir le message
    Pourquoi pas ... en tout cas je ny aurais jamais pensé ! merci

    Autre probleme malgré tout, voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct sql_result
    {
    	int 						nrows;				// Number of rows returned by the query.	
    	int 				  		ncolumns;			// Number of columns returned by row description.
    	struct sql_att_desc		  * att_desc;			// A pointer to a row description.
    	struct sql_att_value	 ** rows;				// Each sql_result is an array of sql_att_value.
    	int 				 		row_array_size;		// Allocated size of rows array.
    	int 				 		binary;				// Binary row values if binary == 1, otherwise Text.
    };
    J'initialise ma structure comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static int	
    sql_get_row_description( struct sql_connection * sql_conn, const char * msg )
    {
    	struct sql_result result;
            sql_make_empty_sql_result(&result);    // Initilisation de la structure
            ...
    }
    Mais comment initialiser les pointeurs sur les autres structures att_desc et rows ?
    Ben soit tu les initialises toi-même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result.att_desc=<pointeur_valide ou NULL>
    Soit tu le passes à une fonction qui s'en chargera
    Avec toto définie ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <type> toto(struct sql_att_desc** ptr)
    {
        ...
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. allocation dynamique (plus ou moins)
    Par muslim1987 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 15/07/2008, 14h45
  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