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 :

Manipulation de pointeur et structure dynamique


Sujet :

C

  1. #41
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Spootnik
    Merci pour vos réponses .
    Un petit détail :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static const Item z = { 0 };
    *newItem = z;

    Je ne comprend pas bien comment ça fonctionne. Pourquoi une liste { 0 } ?
    Pour initialiser la structure. Chaque champ aura la valeur 0 du bon type.
    et pourquoi passer par là pour tout mettre à zéro ? je crois que je préfère la méthode fine
    Sauf quand on oublie un champ... Bref, c'est une méthode industrielle reconnue et efficace... Tu fais comme tu veux...

    Je poste aussi les nouvelles sources. J'ai encore des doutes sur ce que j'ai mis. Je n'ai pas réussi à utiliser ton outil SYSALLOC Emmanuel : lorsque je le compile avec mes sources, j'ai plein d'erreurs même sur des lignes juste composées de commentaires, donc pour l'instant, nada.
    As-tu lu le mode d'emploi ? As-tu suivi les instructions ? As-tu testé ton installation ? As-tu des erreurs sur le programme de test ? Lesquelles ?

    Les erreurs, ce sont celles que tu avais avec SYSALLOC ?

    J'ai toujours ça :

    EDIT : C'est OK. C'est à cause des strdup() qui ne passent pas par mon SYSALLOC. C'est OK, j'ai vérifié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Usage xxx[ /T][ /E][ /O][ <options application>]
    FRMWRK.DBG_SYSALLOC=1
    SYSALLOC Overload (85 rec)
    SYSALLOC Successful initialization: 85 records available
    Table myTable:
            id 1 : ben qu est-ce que j en sais moi ! haha :p
            id 2 : pour verifier qu on peut le modifier
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    FRMWRK.Termine
     
    Press ENTER to continue.
    Bonne nouvelle, ton code peut être facilement transformé en ADT. Il suffit pour ça de séparer la définition des structures en 2 :

    tables.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* Structures ============================================================= */
       typedef struct item Item;
       typedef struct table Table;
    tables.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    /* Structures ============================================================= */
    struct item
    {
       int id;
       char *content;
    };
     
    struct table
    {
       size_t count; /* le bon type pour les tailles et les index */
       struct item *Items;
    };
    Ca commence à ressembler à du vrai C...
    Pas de Wi-Fi à la maison : CPL

  2. #42
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Spootnik
    Je ne comprend pas bien comment ça fonctionne. Pourquoi une liste { 0 } ? et pourquoi passer par là pour tout mettre à zéro ? je crois que je préfère la méthode fine ...
    Le language C te permet d'initialiser une structure lors de sa définition à l'aide de la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct Item {
        int id;
        int tab[4];
        struct Item *p_next;
    };
     
    /* ... */
     
    struct Item obj1= {0, {0, 0, 0, 0}, NULL};
    Il est également possible d'initialiser partiellement une structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct Item obj1 = {0};
    Le reste de la structure est alors implicitement initialisé à 0, y compris toutes les cases de tab, et p_next. Cette manière d'écrire est donc équivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Item obj1;
    obj1.id = 0;
    memset(obj1.tab, 0, sizeof obj1.tab);
    obj1.p_next = NULL;
    Il est également possible de copier une structure avec la syntaxe suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static const struct Item obj1 = {0};
    struct Item obj2;
     
    /* Initialise tous les champs de obj2 à leur valeur dans obj1 */
    obj2 = obj1;
    avec une sémantique équivalente à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    obj2.id = obj1.id;
    memcpy(obj2.tab, obj1.tab, sizeof obj1.tab)
    obj2.p_next = obj1.p_next; /* N.B. L'objet pointé par p_next n'est pas copié! */
    Dans le code d'Emmanuel, la variable z de type Item a une classe d'allocation statique. Elle n'est donc pas stockée sur la pile, mais dans la zone de mémoire statique. Cette variable est créée et initialisée lors du 1er appel du constructeur et sa durée de vie est celle du programme. Ainsi, du point de vue de la performance, il y a un léger coût dù à l'initialisation de cette variable lors du premier appel du constructeur. Cette variable est ensuite utilisée telle quelle lors des appels suivants et sert à initialiser la structure newItem avec des zéros. Evidemment, le gain en lisibilité devient évident lorsque ta structure contient un grand nombre de champs. Comme l'a dit Emmanuel, ceci a l'avantage que chaque bit de la structure ainsi initialisée est forcé à 0; Tu sais donc exactement à quoi ressemble ta variable et peux commencer à initialiser plus finement à partir de là.

    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++

    +

  3. #43
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par mujigka
    Cette manière d'écrire est donc équivalent à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Item obj1;
    obj1.id = 0;
    memset(obj1.tab, 0, sizeof obj1.tab);
    obj1.p_next = NULL;
    Pour des raison expliquées ad nauseam, non ! (en tout cas ce n'est pas portable).
    Citation Envoyé par mujigka
    Comme l'a dit Emmanuel, ceci a l'avantage que chaque bit de la structure ainsi initialisée est forcé à 0;
    Je n'ai jamais dit que tous les bits étaient mis à zéro, mais, et j'ai bien pris la peine de le signaler, alors on est prié de lire mes posts à fond :
    Citation Envoyé par -ed-
    <...> mais auto-démerdant (notamment en cas d'ajout d'élément dans la structure, on part sur des bases connues : 0, NULL, "", 0.0, 0.0f etc.).
    et plus loin...
    Citation Envoyé par -ed-
    Chaque champ aura la valeur 0 du bon type.
    Rien à voir.
    Pas de Wi-Fi à la maison : CPL

  4. #44
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    -ed- a écrit :
    Chaque champ aura la valeur 0 du bon type.
    Mea culpa! Tu as écrit la phrase ci-dessus lorsque j'écrivais mon post. Je ne l'avais pas lue. Elle m'a ouvert les yeux sur une incompréhension de ma part. Merci de me reprendre. Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct Item {
        int id;
        int tab[4];
        struct Item *p_next;
    };
    /* ... */
    struct Item obj = {0};
    permet d'initialiser tous les champs de obj à la valeur 0 du bon type et de manière portable.

    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. #45
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    ADT ? qu'est-ce que c'est ?

    Citation Envoyé par Emmanuel Delahaye
    As-tu lu le mode d'emploi ? As-tu suivi les instructions ? As-tu testé ton installation ? As-tu des erreurs sur le programme de test ? Lesquelles ?

    Les erreurs, ce sont celles que tu avais avec SYSALLOC ?
    Oui j'ai lu le mode d'emploi. En fait j'ai essayé de deux façon. D'abord en compilant tes sources pour créer une framework (=bibliothèque mac), puis de l'ajouter au projet, mais lors de la compilation j'ai plein de soucis, semblables à ceux que j'ai indiqué dans le log du make.

    J'ai aussi essayé d'ajouter directement les sources au projet, puis de compiler le tout ensemble, j'obtiens les mêmes erreurs. J'ai aussi vérifié que ce n'était pas des problèmes d'include (et donc de fichiers non trouvés), aucun problème de ce côté.

    À vrai dire je ne comprend pas bien toutes les erreurs du make. Je ne vois pas d'où elles sortent. Peut-être un problème d'encodage de mes sources par rapport aux tiennes ? J'utilise Western (Mac OS Roman), sans fin de ligne explicite (ni LF, ni CR, ni CRLF).

    Je recompile et je poste les erreurs que j'ai eu exactement avec clib.

  6. #46
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    ah non… ça marche bien
    je ne sais pas pourquoi j'ai eu des problèmes la première fois, enfin tout fonctionne, c'est le principal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    [Session started at 2007-02-10 12:37:51 +0100.]
    SYSALLOC Overload (10 rec)
    SYSALLOC Successful initialization: 10 records available
    Table myTable:
    	id 1 : ben qu est-ce que j en sais moi ! haha :p
    	id 2 : pour verifier qu on peut le modifier
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
     
    Executable “Table” has exited with status 0.
    joli l'outil…

    En fait j'ai juste quelques avertissements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    types.h:82: `ushort' previously declared here
    types.h:83: `uint' previously declared here
    types.h:24: redefinition of `ushort'
    types.h:28: redefinition of `uint'
    Mais c'est pas bien grave.

  7. #47
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Spootnik
    ADT ? qu'est-ce que c'est ?
    Abstract Data Type.
    http://emmanuel-delahaye.developpez.com/tad.htm
    Pas de Wi-Fi à la maison : CPL

  8. #48
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    Merci pour toutes vos réponses
    Je crois qu'il ne me reste plus qu'à terminer l'implémentation de ma table et tout sera parfait .

    Encore un grand merci

  9. #49
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Spootnik
    Merci pour toutes vos réponses
    Je crois qu'il ne me reste plus qu'à terminer l'implémentation de ma table et tout sera parfait .

    Encore un grand merci
    Et après tu iras voir ça ...

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module FARR.
    Pas de Wi-Fi à la maison : CPL

  10. #50
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    quoi ?? tout ça pour… se casser la tête alors que…

  11. #51
    Membre expérimenté Avatar de Ceylo
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 216
    Points : 1 312
    Points
    1 312
    Par défaut
    bon, malgré les crises intempestives (je remercie Emmanuel ), je continue mon projet de Table.

    J'ai refait quelques tests de performances… et là, c'est la catastrophe !!

    Je me retrouve avec des erreurs que je n'avais pas avant. Le pire c'est que je ne sais pas pourquoi j'ai ces erreurs. Il me semble pourtant avoir codé ma Table correctement. Si quelqu'un a une idée…

    Même le module SYSALLOC ne m'aide pas ici…

    Voila ce que j'obtiens dans le log de la console quand je fais ce test :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    [Session started at 2007-02-11 22:02:36 +0100.]
    SYSALLOC Overload (43690 rec)
    SYSALLOC Successful initialization: 43690 records available
    *** malloc[1720]: error for object 0x1801000: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1801200: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1801400: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1801600: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1801400: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1801e00: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1802000: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
    *** malloc[1720]: error for object 0x1802200: Incorrect checksum for freed object - object was probably modified after being freed; break at szone_error
     
    Executable “Table” has exited with status 0.
    J'ai bien essayé d'augmenter la mémoire pour le module jusqu'à 2^20, mais je me suis arrêté là vu le temps que ça prennait pour l'exécution. J'obtiens toujours SYSALLOC Overload donc je suppose que je ne monte pas assez, mais c'est tout de même étrange de devoir monter aussi haut non ? Je ne sais même pas pourquoi le module SYSALLOC ne détecte pas ce problème, alors qu'avec un overload mais dans les vieilles versions de la table, ces erreurs étaient détectées, mais ça c'est Emmanuel qui doit savoir…

    Si quelqu'un a une idée miracle… merci beaucoup
    Fichiers attachés Fichiers attachés

  12. #52
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Avec quelques corrections, j'obtiens la sortie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    thierry@mujigka:~/devel/vecteur$ ./essai
    SYSALLOC Overload (10 rec)
    SYSALLOC Successful initialization: 10 records available
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC All-matched
    SYSALLOC Released Memory
    Ce qui me semble en ordre. Voici quelques erreurs que j'ai constatées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /*-TC- Bête faute de frappe dans main.c, tu avais écris DEBUD_MEM */
    #if DEBUG_MEM
    	sys_mem_trace ();
    #endif
    Dans la fonction addItemToTable:
    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
    void addItemToTable(Table *aTable, Item *anItem)
    {
    	if ((aTable != NULL) && (anItem != NULL))
    	{
    		/*-TC- retourne le nombre d'éléments actuellement
                       présents dans le tableau */
    		unsigned int countOfItem = getCountOfItemInTable(aTable);
                    /* -TC- ATTENTION! Il faut réallouer countOfItem + 1 éléments 
                        sinon aTable->Items[countOfItem] est hors du tableau*/
    		aTable->Items = realloc(aTable->Items, (countOfItem + 1) * sizeof(*anItem));
     
    		if (aTable->Items != NULL)
    		{				
    			// on remplie la nouvelle Item avec les donnÂŽes
    			aTable->Items[countOfItem].content = strdup(anItem->content);
    			if (aTable->Items[countOfItem].content == NULL)
    			{
    				// /!\ *** je ne suis pas sur que ca soit necessaire
                                    /*-TC- Non, cela ne sert à rien !*/
    				free(aTable->Items[countOfItem].content);
    			}
    			else
    			{
    				aTable->Items[countOfItem].id = countOfItem + 1;
    			}
    			aTable->count++;
    		}
    	}
    }
    Ce n'est pas très efficace d'appeler realloc à chaque appel de addItemToTable(). Une stratégie est d'allouer la mémoire par bloc et tu réalloues seulement lorsque la mémoire précédamment allouée devient pleine. En pratique, on multiplie l'espace mémoire à disposition par un facteur env. 1.5 à chaque réallocation (ce facteur devant idéallement rester inférieur au nombre d'or, voir http://www.bourguet.org/realloc.pdf).

    Dernière petite remarque, l'utilisation d'un identificateur appelé newTable dans la fonction du même nom, c'est pas terrible... et dans setContentOfItemToString():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (anItem->content == NULL)
    {
        free(anItem->content);
        /* ... */
    }
    ça ne sert à rien!

    Meilleures salutations

    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++

    +

  13. #53
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par mujigka
    Dernière petite remarque, l'utilisation d'un identificateur appelé newTable dans la fonction du même nom, c'est pas terrible... et dans setContentOfItemToString():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (anItem->content == NULL)
    {
        free(anItem->content);
        /* ... */
    }
    ça ne sert à rien!
    je dirais même plus.... crash garanti !!
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #54
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par souviron34
    je dirais même plus.... crash garanti !!
    Pourquoi ? free(NULL) est parfaitement défini et ne fait rien du tout. C'est garanti par le langage.

    Il faut de temps en temps relire la norme pour fixer ses connaissances. L'expérience, c'est bien mais ça ne remplace pas une bonne référence.
    Pas de Wi-Fi à la maison : CPL

  15. #55
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    je dirais même plus.... crash garanti !!
    Non! Voir http://man.developpez.com/man3/free.3.php

    Citation Envoyé par man de free()
    free() libère l'espace mémoire pointé par ptr, qui a été obtenu lors d'un appel antérieur à malloc(), calloc() ou realloc(). Si le pointeur ptr n'a pas été obtenu par l'un de ces appels, ou si il a déjà été libéré avec free(), le comportement est indéterminé. Si ptr est NULL, aucune tentative de libération n'a lieu.
    EDIT: Pardon, Emmanuel, je n'avait pas vu ta réponse

    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++

    +

  16. #56
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    peut-être dans les dernières implémentations, mais c'est faux 99% du temps...

    Essayez de faire un free(NULL) sur une machine HPUX, sur un Silicon Graphics, sur un pc Linux redhat (moi je suis en 7.3) ...

    coredump...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  17. #57
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par souviron34
    peut-être dans les dernières implémentations, mais c'est faux 99% du temps...

    Essayez de faire un free(NULL) sur une machine HPUX, sur un Silicon Graphics, sur un pc Linux redhat (moi je suis en 7.3) ...

    coredump...
    Si l'implantation en question est conforme à C90, il ne doit pas y avoir de problème. C'est donc vrai sur 100% des implantations qui implantent correctement C90.

    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++

    +

  18. #58
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En effet, free(NULL) est défini comme ne faisant rien. c'est fclose(NULL) qui n'est pas défini...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #59
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Médinoc
    En effet, free(NULL) est défini comme ne faisant rien. c'est fclose(NULL) qui n'est pas défini...
    C'est vrai, et d'ailleurs, je n'ai jamais compris pourquoi...

    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++

    +

  20. #60
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    voir ce que je vais mettre à l'instant dans l'autre thread (allocation dynamique d...)

    http://www.developpez.net/forums/sho...=277816&page=4


    Cela fait partie de la définition de C, même si des implémentations ou nroems ultérieures disent le contraire.. Et pour garder la compatibilité envers différents matériels...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Manipulation de pointeur sur tableau dynamique
    Par vincenet dans le forum Débuter
    Réponses: 12
    Dernier message: 09/12/2014, 17h53
  2. Réponses: 11
    Dernier message: 01/08/2010, 14h34
  3. [C++ .NET] Structure dynamique
    Par tidou dans le forum VC++ .NET
    Réponses: 17
    Dernier message: 29/10/2004, 20h08
  4. Réponses: 12
    Dernier message: 26/04/2004, 08h32
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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