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 :

stockage des options redondantes


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut stockage des options redondantes
    salut,

    je suis sur un petit programme où l'utilisateur peut rentrer plusieurs fois la même option.
    J'aimerai connaitre votre avis sur la meilleure façon de stocker ces données.
    J'ai pensé au tableau biensur mais le souci c'est que si on défini une taille fixe, on prend le risque d'avoir un souci. Et je ne vois pas trop comment définir la taille dynamiquement.
    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
     
    int main(int argc, char **argv) 
    {
    int           carg;
    int           i=0
    int           r=0;
    int           restricted_taxid[10];
    int           ignored_taxid[10];
    while ((carg = getopt(argc, argv, "r:i:")) != -1) {
     
         switch (carg) {
            case 'r':
              restricted_taxid[r] = optarg;
              r++;		
              break;
     
            case 'i':
              ignored_taxid[i] = optarg;
              i++;
              break;
         }
    }

  2. #2
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    pour te mettre sur la voie :
    cherche autour des pointeurs et des fonctions malloc et realloc

  3. #3
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    salut,
    merci pour tes conseils. J'ai donc cherché du coté de realloc et voici le résultat (simplifié) (ça compile et les premiers tests ne montrent pas de bugs...)
    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
     
    #define REALLOC(chunk,size,error_message) \
            realloc((chunk),(size),(error_message),__FILE__,__LINE__)
     
    int main(int argc, char **argv) 
    {
    int           carg;
    int           r=0;
    int32_t	    *restricted_taxid = NULL;
     
        while ((carg = getopt(argc, argv, "r:")) != -1) {
     
         switch (carg) {
            case 'r': 
              restricted_taxid = realloc(restricted_taxid,sizeof(int32_t));
              sscanf(optarg,"%d",&restricted_taxid[r]);
              r++;		
              break;
        }
    }
    Est-ce correct?

    Je me demande aussi s'il vaut mieux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restricted_taxid = realloc(restricted_taxid,sizeof(int32_t));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    restricted_taxid = realloc(restricted_taxid,sizeof(int32_t)*r);

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Je n'ai pas les détails, mais je pense qu'il faut au moins du sizeof(int32_t)*(r+1) si tu veux que ça passe.

    De plus, tu dois passer par un pointeur temporaire, car si realloc() échoue, ton programme leake la mémoire.
    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.

  5. #5
    Membre chevronné Avatar de straasha
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2004
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2004
    Messages : 149
    Par défaut
    Je me demande aussi s'il vaut mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    restricted_taxid = realloc(restricted_taxid,sizeof(int32_t));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    restricted_taxid = realloc(restricted_taxid,sizeof(int32_t)*r);
    la 2e solution est meilleure, la 1ere est fausse puisque tu alloue 1 seul int32_t donc l'acces a &restricted_taxid[r] sera incorrect pour r>0
    ensuite j'aurai plutot allouer 10 int32_t en init (10 etant une taille min arbitraire pour mon tableau) et ensuite si r%10==0 je realloue en rajoutant 10 int32_t
    ainsi tu ne fais pas de reallocation a chaque tour d'ou un gain de temps mais c'est vrai que du coup tu as un tableau un peu trop grand

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    S'il y a des chances qu'il y ait beaucoup d'elements, il vaut mieux ne pas reallouer en augmentant la taille de 1 a chaque fois mais en multipliant l'ancienne taille (je conseille un facteur de 1.5, facilement utilisable: new_size = old_size + old_size/2 -- naturellement, il faut commencer avec une taille differente de 1 :-)), quitte a faire une derniere reallocation ramenant a la taille precise a la fin.

  7. #7
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    merci beaucoup pour vos réponses et vos précisions.

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

Discussions similaires

  1. [html/css]coloration des options dans un select
    Par the_edge dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 04/05/2005, 15h19
  2. Stocker des options
    Par koolkris dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 11/02/2005, 16h00
  3. [Preferences] Stockage des options
    Par Yan83 dans le forum Eclipse Platform
    Réponses: 1
    Dernier message: 03/05/2004, 10h38
  4. Parametrage des options de projet
    Par ares7 dans le forum EDI
    Réponses: 7
    Dernier message: 22/07/2002, 15h33

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