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

Langage Delphi Discussion :

Groupes de CONSTANTES


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut Groupes de CONSTANTES
    J'ai un programme qui utilise des CONSTANTES ainsi définies:
    ce sont des bornes inférieures et supérieures qui permettent de situer
    une population d'individus dans une classe (de 0 à 10) et ce pour 15 facteurs.

    J'ai utilisé un truc donné par C.DELANNOY ("Exercices en Turbo Pascal - EYROLLES" p.58)
    pour déterminer ces classes.
    Je trouvais ce "truc" intéressant et je le cite (ça pourra servir !).

    Exemple pour mon programme:

    .../...

    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
    TYPE
    Popul = Record
             Binf,Bsup,Classe : Byte;
            End;
     
    .../...
     
    // Binf = borne inférieure
    // Bsup = borne supérieure
    // exemple pour SO5h : si la note brute obtenue est 14
    // SO5h est dans la classe 3
     
     
    {** Facteur L}
    Const SO5h : array[1..11] of Popul =
    ((Binf:0;Bsup:6;classe:0),           
    (Binf:7;Bsup:9;classe:1),
    (Binf:10;Bsup:12;classe:2),
    (Binf:13;Bsup:15;classe:3),
    (Binf:16;Bsup:18;classe:4),
    (Binf:19;Bsup:21;classe:5),
    (Binf:22;Bsup:24;classe:6),
    (Binf:25;Bsup:26;classe:7),
    (Binf:27;Bsup:28;classe:8),
    (Binf:29;Bsup:30;classe:9),
    (Binf:31;Bsup:32;classe:10));
     
    {** Facteur P2 }
    Const AC9h : array[1..11] of Popul =
    ((Binf:0;Bsup:5;classe:0),
    (Binf:6;Bsup:6;classe:1),
    (Binf:7;Bsup:7;classe:2),
    (Binf:8;Bsup:9;classe:3),
    (Binf:10;Bsup:10;classe:4),
    (Binf:11;Bsup:12;classe:5),
    (Binf:13;Bsup:13;classe:6),
    (Binf:14;Bsup:15;classe:7),
    (Binf:16;Bsup:17;classe:8),
    (Binf:18;Bsup:19;classe:9),
    (Binf:20;Bsup:30;classe:10));
     
    {Facteur M6}
    Const....
    etc...


    J'ai comme ça 15 facteurs !
    et comme j'ai des étalonnages pour 12
    populations différentes j'ai dû écrire (heureusement par copier-coller !!)
    12 exécutables qui sont appelés par un programme principal.
    Ce n'est pas très élégant.

    Problème : ce sont des constantes et, qui dit constantes en DELPHI dit: ce n'est pas modifiable ...

    Je mettrais bien mes 12 groupes de 15 constantes dans un même code programme
    pour n'avoir qu'UN SEUL EXECUTABLE.

    mais comment dire au programme d'aller "taper" dans tel ou tel groupe ?

    Impossible apparemment ...
    Qui a une idée ? MERCI d'avance.

  2. #2
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    J'ai du mal a saisir le but reel de ton application.
    Pourquoi veut tu les modifier ?

    De toute maniere, si tu veux definir ces parametres d'une maniere ou d'une autre il te faudra les rentrer, et les modifier "a la main" en cas de changement.

    Maintenant ce que je fait souvent, c'est une serie de variables (dans ton cas 15 tableaux de 11 record) de type variable que j'initialise a l'aide de constantes.

    Si on separe bien le code en 2 unites, on a une unitee "generique" qui initialise les 15 tableaux de 11 record avec des constantes definie dans un 2e fichier.

    Chaques programes de tests sont donc base sur le meme code, a l'exception d'une unitee : Celle des constantes qui permettent de "parametrer" le programme.

    Petit Exemple :
    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
     
    Const SO5h : array[1..11] of Popul =
    ((Binf:S05h_BINF_1;Bsup:S05h_BSUP_1;classe:S05h_CLASSE_1),           
    (Binf:S05h_BINF_2;Bsup:S05h_BSUP_2;classe:S05h_CLASSE_2),
    [...])
     
    et dans le fichier de constantes parametres : 
    Const
      S05h_BINF_1 = 0;
      S05h_BINF_2 = 7;
      S05h_BSUP_1 = 6;
      S05h_BSUP_2 = 9;
      S05h_CLASSE_1 = 0;
      S05h_CLASSE_2 = 1;
    [...]

  3. #3
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut Groupes de CONSTANTES
    Je simplifie à l'extrême :

    1er programme:
    Const a =10;
    Const b =14;
    const c =16;
    etc...

    2eme programme :
    Const a =11;
    Const b =12;
    const c = 9;
    etc ...

    3ème P etc...

    Comme on l'a compris j'ai beaucoup de constantes et je voudrais n'utiliser qu'un exécutable.
    Là, je m'en suis tiré en faisant des copier-coller et en gardant ensuite le même code qui utilise ces constantes.
    Bref mon exécutable appelle à la demande tel ou tel programme avec un groupe de constantes données.
    Vu la complexité de mes constantes je ne vois pas comment faire autrement.

  4. #4
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    bonjour,

    tu ne peux pas passer par un inifile pour stocker tes constantes ? Chaque catégorie dans une section, tu charge la section en fonction du besoin. En plus si tes constantes viennent à changer (on sais jamais) tu n'auras même pas à recompiler ton application.

    @++
    Dany

  5. #5
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut Re: Groupes de CONSTANTES
    Des constantes qui peuvent prendre des valeurs différentes, on appelle ça des variables, non ?

    Blague à part, il ne faut pas confondre ce qu'on appelle constantes dans un calcul de formules et constantes dans un programme. Ici, tu les déclares comme variables et ensuite, tu choisis le jeu par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Case .... Of
    0 : begin
    Consta := 10;
    Constb := 14;
    constc := 16;
    end;
    1:...
    end;
    Le choix effectif peur se faire dans le programme par le choix d'un bouton, d'une valeur dans une liste, etc...

    Tu peux même, si tu veux éviter de choisir après le lancement du programme, passer un paramètre à ton programme au lancement :
    Tu te crées des raccourcis

    MonProgramme.exe 0
    MonProgramme.exe 1
    ....

    et ensuite, tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     case StrToInt (Application .ParamStr (1)) of

    Ceci dit, l'idée de skywaukers d'utiliser un Inifile pour stocker tes jeux de constante est bonne dans la mesure où elle tévitre d'avoir à recompiler ton programme si tu veux utiliser un autre jeu de "constantes"

    Roland

  6. #6
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut
    Tout ce que l'on m'a répondu est intéressant et me servira sans doute pour d'autres applications.
    Mon pb est que je suis feignant (ce qui dans une certaine mesure peut-être considéré comme une qualité en programmation car il faut écrire court et bien !)...
    Donc feignant et l'obtention des "classes" 0 à 10 dans les tests avec le code DELANNOY avec cette utilisation des CONSTANTES me plaisait... je n'ai pas envie de tout reprendre vu le fastidieux de la chose ...
    A suivre...
    Peut-être...

  7. #7
    rsc
    rsc est déconnecté
    Membre émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Côte d'Or (Bourgogne)

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Par défaut
    Si c'est ça ton pb, qu'est-ce qui t'empêche de :
    - Déclarer tes constantes comme tu voulais le faire
    - Déclarer une variable de même type
    - Au lancement, faire ton choix par un des mécanismes évoqués et charger les valeurs de la constante tableau choisie dans ta variable tableau.

    Je ne suis pas sûr que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonTableauVar := tableauConstant
    marche (à vérifier), sinon, en bouclant tu peux facilement remplir...

    Espérant avoir mieux compris le pb cette fois

  8. #8
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Je suis d'accord avec lui.
    Avec ce systeme tu t'en sort avec 1 declaration et une boucle en plus dans ton code.
    Ca ne change rien quand au fait qu'il faudra recompiler ton programe a chaques fois ou plutot generer un exe par teste mais au moins, la structure est deja en place pour basculer vers un systeme a base de lecture de donnees dans un fichier pour les prochains tests.

    Eventuelement tu peut meme compiler ton prog avec tous les tableaux de constantes et effectuer l'affectation dans le tableau de variable selon une donnee transmise en parametre d'appel.

    Si tu te debrouille bien, tu peut meme appele ton tableu variable du meme nom que celui de tes constantes pour eviter de rettapper tout ton code ...
    Tu n'auras qu'a renomer les tableaux de constantes.

  9. #9
    Inactif  
    Inscrit en
    Février 2004
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 97
    Par défaut
    Merci au Dijonnais de se pencher sur ce qui a été en fait une erreur de conception au départ.

    Je n'ai pas compris ce que tu voulais suggérer par :
    "sinon, en bouclant tu peux facilement remplir".

    ***************

    Maintenant si qq'un a une autre idée (que celles des constantes) pour récupérer des classes à partir de fourchettes de notes brutes ...

    (Quand j'ai 13 comme note brute je suis dans la classe 5 parce que ma classe 5 se situe entre les valeurs 12 et 15 par exemple
    si j'ai 11 je suis dans la classe 4 --> la classe 4 est donnée pour les notes comprises entre 10 et 11.)
    Pour les curieux ce sont des conversions utilisées fréquemment dans la passation de tests. La note "brute" renvoyant à des classes différentes selon l'âge du sujet ou son sexe par exemple.

  10. #10
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Il entendais par boucler effectuer une boucle qui parcours ton tableau de constante pour affecter chaques cases au tableau de variable (ie copie de tableau

    Sinon ce que je peut te proposer pour ce genre de chose est de faire sauter au moins une des valeur pour la combiner avec l'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Const S05h : Array[0..10] of Popul = ...;
     
    For i := 0 to 10 do
      If Note <S05h[i].BSup and Note > S05h[i].Binf Then Classe := i;
    Sinon tu peut te baser uniquement sur un tableau a un valeur en utilisant les bores comme index du tableau : Avantage = Acces par indexation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Const S05h : Array[0..30] of Integer = (0,0,0,0,0,1,2,3,3,.....);
     
    Classe := S05h[Note];
    Pour le stockage des classes j'opterais pour un fichier Ini tel que suis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    [S05h]
    MaxClasse0=5
    MaxClasse1=6
    MaxClasse2=7
    MAxClasse3=9;
    ...
     
    [M6]
    ...
    Ensuite, je lit le fichier a l'ai de d'un objet INI : TIniFile, et a l'aide des methdoes ReadInteger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IndexMax := INI.readInteger('S05h', 'MaxClasse'+IntToStr(NumClasse), -1);
    Enfin le tableau de variables S05h sera remplit de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Index:=0;
    For i := 1 to 10 do
      Begin
      IndexMAx := GetIndexMax(i);
      For j := i to IndexMax do
        S05h[Index] := i;
      Inc(Index);
      End;
    Algo :
    Pour toutes les classes i faire :
    Recuperer IndexMax dans le fichier Ini de la classe i
    Pour toutes les cases du tableau allant de Index a IndexMAx copier le numero de la classe i
    Incrementer l'index.


    Bon ce n'est que des suggestions .. et le code complet n'est pas forcement la .. mais ca ouvre des pistes (et donnes qques astuces )

Discussions similaires

  1. Groupe de constantes implémenté
    Par boutss dans le forum Langage
    Réponses: 7
    Dernier message: 27/08/2007, 11h06
  2. [T-SQL] Constante dans un group by
    Par SaumonAgile dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/08/2007, 14h45
  3. [ADO] Constantes des types de champ
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/09/2002, 11h08
  4. Au sujet des constantes
    Par FranT dans le forum Langage
    Réponses: 8
    Dernier message: 09/08/2002, 11h03

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