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 Discussion :

Problème étrange avec un integer


Sujet :

Delphi

  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut Problème étrange avec un integer
    Salut à tous
    J'ai un petit souci que je n'arrive absolument pas à résoudre.
    Voici le code de la fonction incriminée:
    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
     
    procedure SaveText(Dossier: TDossier; const aVersion: integer;
      const Backup: boolean);
    var s: string;
    begin
      if aVersion in [10, 1000] then//<--Erreur ici
      begin
        if Backup then
        begin
          s := ChangeFileExt(Dossier.FileName, '.bakt');
          if FileExists(s) then DeleteFile(s);
          RenameFile(Dossier.FileName, s);
        end;
     
        case aVersion of
          1000: SaveText1000(Dossier);
        end;
      end;
    end;
    Seulement, lorsque je compile, j'ai une erreur sur la ligne que j'ai marquée disant
    E1012 L'expression constante dépasse les limites de sous-étendue
    Depuis quand les integer font moins de 1000?
    J'ai essayé en remplaçant 1000 par 100 et là, ça passe

    Bref, je ne sais pas trop quoi faire...
    Si quelqu'un connaissait la solution...
    Merci d'avance

    PS: je ne sais pas si ça a une incidence quelconque mais ce code est dans une DLL qui utilise FastShareMem...

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Il y a longtemps que je n'utilise plus régulièrement Delphi, mais il me semble bien qu'on ne peut pas mettre de valeur > 255 dans un ensemble, et d'ailleurs, après test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
      a : set of integer;
    ...
    j'obtiens comme message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Pascal Error] Unit1.pas(33): E2028 Sets may have at most 256 elements
    qui renvoie sur cette ligne de dédinition.

    idem avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    var
      a : set of shortint;
    ...
    De fait, il faut que le type utilisé pour un ensemble ait pour valeurs possibles
    0 <= v <= 255.


    Tu es donc bloqué, il te faut changer de stratégie, et revenir aux bons vieux tests avec des AND ou OR ou autres

    D'autre part, l'ensemble tel que tu veux l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if aVersion in [10, 1000] then//<--Erreur ici
    ne contiendrait que 2 éléments, 10 et 1000, et je pense que ce n'est pas ce que tu désirais faire.

    Si tu voulais que
    il fallait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if aVersion in [10..1000] then//<--Erreur ici

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 35
    Points : 23
    Points
    23
    Par défaut
    Bonjour,

    Je confirme cette explication: les valeurs autorisées d'un type SET (ce qu'est ta constante [10,1000]) sont dans l'intervalle 0..255.

    En revanche, la formulation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      case aVersion of
        10, 1000:
        begin
            ...
        end;
      end;
    ou (pour désigner l'intervalle de 10 à 1000 et non les deux seules valeurs 10 et 1000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      case aVersion of
        10..1000:
        begin
            ...
        end;
      end;
    est autorisée

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Ah effectivement je n'avais pas pensé à ça... Bien vu.
    Je teste ce soir et je vous mets au courant
    Merci vous 2

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par thewho
    j'obtiens comme message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Pascal Error] Unit1.pas(33): E2028 Sets may have at most 256 elements
    Tiens, je n'ai jamais eu ce message Si je l'avais eu, j'aurais su d'où venais le problème
    Citation Envoyé par thewho
    De fait, il faut que le type utilisé pour un ensemble ait pour valeurs possibles
    0 <= v <= 255.
    Il semble que ce soit ça bien que je n'ai rien trouvé dans l'aide de Turbo
    Citation Envoyé par thewho
    Tu es donc bloqué, il te faut changer de stratégie, et revenir aux bons vieux tests avec des AND ou OR ou autres
    Oui mais je voudrais éviter pour des soucis de maintenance...
    Citation Envoyé par thewho
    D'autre part, l'ensemble tel que tu veux l'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if aVersion in [10, 1000] then//<--Erreur ici
    ne contiendrait que 2 éléments, 10 et 1000, et je pense que ce n'est pas ce que tu désirais faire.

    Si tu voulais que
    il fallait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if aVersion in [10..1000] then//<--Erreur ici
    Non pas exactement En fait, c'est un test de version dans une DLL. Si la version de la procédure est incluse dans la DLL, alors c'est bon sinon, elle ne fait rien. J'ai ajouté le 10 pour voir si ça ne venait pas d'autre part...

    Et si à chaque fois que j'ajoute une version, je dois ajouter toute un code, c'est pas top.
    J'aurais préféré juste ajouter dans un ensemble la nouvelle version prise en charge.
    J'ai contourné le problème avec un tableau et une fonction de recherche dans le tableau.

    beaucoup

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    autre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case t of
      10,15,1000:;
    end;

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par edam
    autre solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case t of
      10,15,1000:;
    end;
    Oui effectivement mais en fait, il faudrait le faire pour chaque version. Et au début tester si la version est prise en charge. Donc même si c'est correct, ça ne me convient pas. Merci quand même

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 04/04/2007, 15h34
  2. Problème étrange avec DBM::Deep
    Par scaleo dans le forum Modules
    Réponses: 3
    Dernier message: 23/03/2007, 11h51
  3. Problème étrange avec DecimalSeparator ?
    Par MaTHieU_ dans le forum Delphi
    Réponses: 2
    Dernier message: 13/07/2006, 10h14
  4. problème étrange avec excel
    Par lanfeust42 dans le forum Modules
    Réponses: 1
    Dernier message: 15/06/2006, 11h57
  5. [FLASH MX2004 PRO] Problème étrange avec LoadClip...
    Par josemoroide dans le forum Flash
    Réponses: 6
    Dernier message: 04/08/2004, 16h41

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