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 :

pb de pointeurs


Sujet :

C

  1. #21
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Tiens la tu m'interesse.
    J'ai arrete il y a quelques temps mais je n'ai pas trouve de reponse convaincante et tu vas surement pouvoir m'eclairer.

    Pourquoi les static saymal ?

  2. #22
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    A part ça, si tailleBuffer vaut 0, sizeof(Ligne)*tailleBuffer vaudra 0, donc realloc() va retourner NULL (jamais testé...)

    Comportement indéfini.
    Citation Envoyé par gnto
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void mafonction(Ligne ** buffer)
    {
     static int tailleBuffer=0;
     
    //tailleBuffer evolue dans la fct mais j'ai simplifié le code mais tailleBuffer est non nulle et supérieur à 3
     
     *buffer = realloc(*buffer,sizeof(Ligne)*tailleBuffer);
     
    buffer[2]->s[0]='a';//erreur de segmentation
     
    }
    Il me semble que j'avais laissé un commentaire

  3. #23
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    les static sont a utiliser en dernier recours car ils sont défini en mémoire pendant la durée de tout le programme, a l'inverse des variables locales

  4. #24
    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 Jack_serious
    Tiens la tu m'interesse.
    J'ai arrete il y a quelques temps mais je n'ai pas trouve de reponse convaincante et tu vas surement pouvoir m'eclairer.

    Pourquoi les static saymal ?
    Parce que ça rend le code non réentrant, aux appels non imbricables car le donnée statique n'est pas instanciable (ou alors à que prix...). Les données persitantes doivent appartenir à l'utilisateur, pas à l'implémenteur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
       T a;
       T b;
     
       f (&a);
       f (&b);
    }
    C'est tout le problème de strtok(), par exemple.

  5. #25
    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 gnto
    les static sont a utiliser en dernier recours car ils sont défini en mémoire pendant la durée de tout le programme, a l'inverse des variables locales
    Il n'y a aucune justification pour utiliser des statiques. Apprend plutôt à programmer par contexte persistants.

  6. #26
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Que le developpeur qui n'a jamais utilisé de variable static se fasse connaître...
    Aïe, aïe, aïe...qu'est-ce qu'il ne faut pas entendre....

  7. #27
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    comment géres-tu les flags dans une librairie si tu n'as pas de variables statiques ?

  8. #28
    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 crocodilex
    Que le developpeur qui n'a jamais utilisé de variable static se fasse connaître...
    Aïe, aïe, aïe...qu'est-ce qu'il ne faut pas entendre....
    J'évite au maximum. Montre les cas où ce n'est pas possible ?
    Dans ma CLIB,

    http://emmanuel-delahaye.developpez.com/clib.htm

    je ne connais que SYSALLOC (normal, il n'y a pas de contexte dans les fonctions malloc() etc. et par définition, je n'ai pas le choix de l'interface) mais la ressource est garantie d'être unique, alors je l'accepte (de toutes façon, je n'ai pas le choix).

    Quand aux applications, je ne vois pas non plus à quoi ça pourrait servir à part pour les interruptions matérielles qui devraient partager des données...

    Enfin, pour les gros tableaux qui ne tiennent pas en automatique, la solution est évidemment malloc()...

  9. #29
    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 gnto
    comment géres-tu les flags dans une librairie si tu n'as pas de variables statiques ?
    Je suppose que tu parles de bibliothèques ? C'est le dernier endroit où il doit y avoir des statiques.

    Quel flag ? Pourquoi faire ? Donne un exemple précis, parce à part le cas très particulier que j'ai énoncé au dessus, je n'en vois pas.

    Au fait, on est bien d'accord que je ne parle que des statiques à lecture écriture, bien sûr. Les statiques const sont les bienvenues...

  10. #30
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    J'évite au maximum. Montre les cas où ce n'est pas possible ?
    [...]
    Moi aussi, quand je peux, j'évite au maximun d'utiliser les variables globales et les statics.
    Je développe du logiciel de base (BSP, drivers et de temps en temps des applis), et je peux t'assurer que dans certains cas je ne peux pas me passer de variables globales.
    Donc mettre un niveau de goret 9 sur les statics, je trouve que tu y vas un peu fort...Moi j'aurai mis un niveau 2

  11. #31
    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 crocodilex
    Moi aussi, quand je peux, j'évite au maximun d'utiliser les variables globales et les statics.
    Je développe du logiciel de base (BSP, drivers et de temps en temps des applis), et je peux t'assurer que dans certains cas je ne peux pas me passer de variables globales.
    Donc mettre un niveau de goret 9 sur les statics, je trouve que tu y vas un peu fort...Moi j'aurai mis un niveau 2
    OK, Je vais préciser 'au niveau applicatif'. Je suis d'accord que dans un driver, on ne peut pas faire autrement. Mais par définition, la ressource est limitée et les nombre d'instances donc contrôlé.

  12. #32
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    nan je parle de librairie.

    Je créé une librairie qui lit dans un fichier, 3 structures on va dire A,B et C.

    Je dois lire d'abord la B pour connaitre l'offset ou se situe la A et la C.

    Pour simplifier l'utilisation de la librairie au programme utilisateur on n'a que très peu de point d'entrée, j'ai une fonction dans ma lib qui lit la premier fois la structure A ki place un flag(indiquer que la structure B a été lu) et je stock l'offset. La meme fonction lit ensuite la B.

    La philosophie de la lib résulte en la simpliciter du programme utilisateur à l'interfacer (surtout qd le programme n'est pas réaliser en C )

    Bref je sais pas si j'ai été clair.

  13. #33
    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 gnto
    nan je parle de librairie.
    Alors je ne connais pas.
    Je créé une librairie qui lit dans un fichier, 3 structures on va dire A,B et C.

    Je dois lire d'abord la B pour connaitre l'offset ou se situe la A et la C.

    Pour simplifier l'utilisation de la librairie au programme utilisateur on n'a que très peu de point d'entrée,
    Un contexte, c'est UN point d'entrée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* dans le .h */
    struct contexte;
     
    int f (struct contexte *self, parametres...);
    Rien de compliqué. L'utilisateur ne connait même pas les détails de la structure dont il n'a que faire. Les fonctions font le travail.

    http://emmanuel-delahaye.developpez.com/tad.htm

  14. #34
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    [...]
    J'aime beaucoup cette echelle de goret, bien que je ne soit pas d'accord avec tout les points.
    Il manque peut etre un paragraphe concernant les méthodes de developpement. Un peu comme ceci : http://www.la-rache.com/

    Mais bon, là on est hors sujet.

  15. #35
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    ok c'est deja moins catégorique.

    On est d'accord que c'est goret, faut éviter de les utiliser.
    Moi j'ai pas le choix ,je suis coincé par un souci de simplicité d'interfacage, sinon crois moi je les utilisent pas

  16. #36
    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 gnto
    ok c'est deja moins catégorique.

    On est d'accord que c'est goret, faut éviter de les utiliser.
    Moi j'ai pas le choix ,je suis coincé par un souci de simplicité d'interfacage, sinon crois moi je les utilisent pas
    L'interface est fixée ? Qu'est-ce qui t'empêche de faire du refactoring[1]?

    Et quoi ça complique l'interface ? Tu remplaces un paramètre par un autre.

    Tu trouves ça compliqué à utiliser les fonctions de FILE (fopen() fgetc() etc? OK, ce qui est tordu, c'est que le contexte n'est pas toujours en 1er paramètre, mais à part ça ?)

    -----------------
    [1] Mot chic très tendance dans le monde de l'XP... de réécrire ton code, quoi..

  17. #37
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    c'est compliqué dans mon cas.

    Je lis dans un fichier des données puis je décale a un autre endroit du fichier quand je n'ai plus de donnée à lire dans celui ci je lis un fichier suivant puis je lis dans un autre fichier et ainsi de suite.

    Je veux bien que l'utilisateur gere le premier fichier d'ailleur c'est ce que je fais, il donne le nom du premiers fichier mais l'enchainement d'ouverture des autres fichiers est invisible. Ainsi l'utilisateur ne sais pas à quelle endroit la donnée a été lu, d'ailleur c'est preferable qu'il ne le gere pas.

    Pour ne pas que l'utilisateur, gere un grand nombre de FILE * je les stock.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void archive_open(char * name);
    void archive_load(char * channelName);
    int archive_get_list_value(Ligne **buffer,size_t count);
    void archive_close();
    Quoi de plus simple !!

    Ps : je précise que la lib n'accepte qu'un seul prog utilisateur ( faute de temps )

  18. #38
    Membre éprouvé Avatar de gnto
    Homme Profil pro
    Ingénieur système logiciel
    Inscrit en
    Janvier 2006
    Messages
    923
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur système logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2006
    Messages : 923
    Points : 1 210
    Points
    1 210
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Certes, mais le problème, c'est que tu as dans ton code une atrocité appelée 'douple pointeur', qu'il est préférable de fuir pour ne pas avoir ces écritures gores...
    Heu je prefere dans le cas d'une librairie que le programme utilisateur alloue un buffer et le désalloue. Ainsi le double pointeur est de mise.

    Qu'il soit Ligne ** ou struct tabdyn * le resultat est le meme

    on aura au final, un pointeur sur une structure dans lequel il y aura un poiteur sur une ligne, donc 2 pointeurs...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

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