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

Delphi .NET Discussion :

préciser qu'un type générique est un entier (Int32, Int64)


Sujet :

Delphi .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut préciser qu'un type générique est un entier (Int32, Int64)
    Bonjour, j'ai défini en utilisant la généricité la classe suivante:

    SearchSpace<TBottomSpin, TVariantUltraSymetric> = class

    Je désire préciser que TBottomSpin et TSym sont de types entiers (signés ou non, 8, 16, 32 ou 64 bits ... ) pour pouvoir effectuer des opérations dans les méthodes de cette classe sur les types génériques (opérations arithmétiques usuelles, cast vers Int32 ... ). Il me faut donc préciser que TBottomSpin et TUltraSymetric sont des types d'entiers.

    J'imagine qu'il faut utiliser quelque chose utilisant une syntaxe du style "where TBottomSpin is [là je coince] and TVariantUltraSymetric is [idem];

    Si quelqu'un peut m'éclairer sur le mot clé à utiliser pour préciser que l'on manipule des entiers...

    Cordialement,

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je ne connais pas bien les génériques, n'ayant pas un delphi suffisament récent, mais si tu veux limiter ton générique aux entiers, le plus simple ça ne serait pas de dire que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TBottomSpin = Int64;
      TVariantUltraSymetric= Int64;
    Au final, ce n'est plus générique, non ?
    un entier de 8 bits tient parfaitement dans un entier de 64 bits, as-tu besoin de connaitre la dimension de l'entier ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Non je ne peux pas me permettre car il faut que je restreigne au maximum la taille des entiers en mémoire (déjà l'application risque de consommer plus de 3 go de ram ... ). Du coup il faut vraiment que je type strictement mes données. Et je code en aillant en mémoire la taille max de mes variables et je désire utiliser le plus petit type d'entier selon le cas de figure.

    J'en arrive même à utiliser des champs de bits aux endroits critiques pour conserver des entiers sur 1, 2, 5, 7 ou 13 bits en les regroupant dans un même entiers et en bidouillant avec mes bits (et pas ma ... humpch ... bref... ) (par exemple 7+7+5+13+4+2+2+1+1 = 32 bits soit un Int32 me permet de conserver deux entiers de 7 bits, un de 5, un de 13, un de 4, deux de 2 et deux flags booléens)

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    Je n'utilise toujours pas D2009, et je n'ai pas la doc sous la main au moment où j'écris ce message, ce qui fait que la réponse sera sans doute un peu approximative.

    C'est un des problèmes du choix que CodeGear a fait pour implémenter les génériques : tu es obligé de passer par des interfaces pour dire que ton type supporte l'addition, ou la multiplication, ou l'égalité, ou ceci ou cela.

    Du côté code : tu dois expliciter les contraintes au moment de la déclaration du type générique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SearchSpace<TBottomSpin : IArithmetic, TVariantUltraSymetric : IArithmetic> = class
    Je ne sais pas quel est le vrai nom de l'interface -je ne crois pas que ce soit "IArithmetic"- regarde l'aide de D2009 pour retrouver cette info. Ils ont défini tout un ensemble d'interfaces par défaut, du style "IEqualityComparer<T>" pour un les types qui ont un opérateur "=" ad-hoc, etc...

    Du côté exécution : malheureusement, cela fait que, même pour accéder à l'opération "+" des entiers, l'exécutable fait une recherche de méthode d'interface...


    Si tu as besoin que ton code reste efficace, je te conseille plutôt de regarder du côté de ce hack.

    Sinon, consulte l'aide de D2009 pour plus d'info sur ces interfaces.
    *LeGEC*

  5. #5
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Je me trompe peut être...
    une contrainte d'une classe générique ne peut être spécifier seulement au niveau classe (ou interface) avec le mot clé "TClass" ou un truc comme ca?
    S'il n'y a pas de contrainte, alors c'est lors de l'instanciation de cette classe générique que je spécifie les types que je veux utiliser avec ce pattern....
    Genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
     MonSpace: TSearchSpace<Int32, Int64>;
     MonSpace2: TSearchSpace<Int64, Int64>;
    la classe est générique, mais les instances non ?!
    Je croyais (peut être à tort) que la seule contrainte dans la généricité était de spécifier si la classe générique gérais tout ou seulement des classes.

    Je vais lire un peu de littérature sur le sujet, pour éviter des préjugés...
    Akim Merabet

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Benoit_T Voir le message
    ... l'application risque de consommer plus de 3 go de ram ...
    Sinon, une application Delphi, de mémoire, ne peut pas allouer plus de 2Go de mémoire, je crois que tu es limité même bien avant, en tout cas avec D7 ou avec FastMM4 ... avec les nouveaux Delphi c'est peut-être mieux ...

    Ensuite, lorsque tu as déjà alloué pour presque 2Go, eh bien, Windows passe tellement de temps à Swapper qu'au final, c'est 99% d'efficacité perdu avec un tel volume de mémoire, qu'il vaut mieux stocker ses données dans un fichier lut comme un tableau ...

    Es-tu convaincu que les génériques soient la bonne solution, cela fait 15 ans que l'on s'en passait, et maintenant, il semble qu'il n'y ait plus que ça !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 18
    Dernier message: 15/11/2005, 10h13
  2. Réponses: 3
    Dernier message: 07/10/2005, 09h34
  3. champ_autoincrémenté de type different d'un entier
    Par kouraichi35 dans le forum Bases de données
    Réponses: 5
    Dernier message: 20/10/2004, 19h51
  4. [VB.NET] [VS.NET] Tester si le texte saisi est un entier
    Par San Soussy dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/10/2004, 10h41
  5. [XSL] Tester si la valeur est un entier dans un xml
    Par MrMaze dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 23/07/2003, 04h35

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