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 :

Comment convertir un pointeur en Double?


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut Comment convertir un pointeur en Double?
    Bonjour,

    J'ai un pointeur que je voudrais convertir en Double mais je ne sais pas comment faire! (je suis debutant):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
      SetLength( tab, listTab.Count );
     
      for i := 0 to listTab.Count-1 do begin
     
        tab[i] := listTab[i];
     
      end;
    ici tab est un array of double alors que listTab est une TList.

  2. #2
    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
    Salut
    Il ne marche pas ce code?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    Non delphi me dit "Incompatible types" entre Pointer et Double

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    ce que j'ai fait c'est que j'ai construit une classe avec un champ double et j'ai ajoute une instance de classe a ma liste mais je trouve que c'est un peu bourrin comme solution. Donc si vous avez une idee... je prend

  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
    Essaie à tout hasard:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[i] := integer(listTab[i]);
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    moi c'est cense etre un FLOAT ! pas un Integer..

  7. #7
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Bonjour,

    les éléments d'une TListe sont des pointeurs ; donc pour y mettre un élément, il faut l'allouer dans le tas (New(), MemAlloc,...) et passer son pointeur à la liste.

    Il existe l'astuce (par toujours très sage) de mettre la donnée elle-même dans la liste au lieu de son adresse en transtypant la donnée en un pointeur (qu'il ne faudra bien sur jamais déférencer ), mais cela suppose que la donnée occupe 4 octets (ou moins), soit la taille d'un pointeur.
    Or un double fait 8 octets (donc ce n'est pas possible).

  8. #8
    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 Art19
    moi c'est cense etre un FLOAT ! pas un Integer..
    As-tu essayé ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      i: integer;
      d: double;
    begin
      d := i;
    end;
    Ben figure-toi que ça marche... Un entier peut être inscrit dans un réel. L'inverse est faux par contre.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  9. #9
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Les objets sont (implicitement) des pointeurs et possède leur propre liste TObjectList (qui peut gérer la libération de ces derniers et qui dérive de TList).

    Mais un objet par Double ...

    En utilisant des PDouble, il est possible de dériver la liste pour gérer la libération des pointeurs (comme le fait TObjectList ).

    Pour un exemple d'usage avec des pointeurs (PDouble) :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
     
      TListeDouble = class(TList)
      protected
         procedure Notify(Ptr: Pointer; Action: TListNotification); override;
      end;
     
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
        List : TListeDouble;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    { TListeDouble }
     
    procedure TListeDouble.Notify(Ptr: Pointer; Action: TListNotification);
    begin
      case Action of
        lnAdded     : ;
        lnExtracted : ;
        lnDeleted   : Dispose(Ptr);
      end;
    end;
     
    function NewDouble( ADouble : Double) : Pointer;
    var ptrDouble : PDouble ;
    begin
       New(ptrDouble);
       ptrDouble^ := ADouble;
       Result := ptrDouble;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
       List := TListeDouble.Create;
       List.Add( NewDouble( 10.23 ) );
       List.Add( NewDouble( 10402.40 ) );
       List[0] := NewDouble( 10.01 );
       ShowMessage( FloatToStr( PDouble(List[1])^ ) );
       List.Free;
    end;
    On peut aussi attendre les templates en Delphi (bientôt, bientôt ...)

  10. #10
    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
    Tiens d'ailleurs, au passage, quel est l'intérêt de faire ça?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  11. #11
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    c'est toujours mieux qu'un objet par double

    pour l'intérêt réel de la chose ... je cherche, je cherche, bon j'ai pas encore trouvé

    Sinon les 'Single' font 4 octets donc ceci passe (mais j'ai pas dit que c'était bien de faire ça) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TForm1.Button1Click(Sender: TObject);
    var A : Single ; AList : TList;
    begin
       AList := TList.Create;
       A := 10.0;
       AList.Add(Pointer(A));
       A := 0.0;
       A := Single(AList[0]);
       ShowMessage( FloatToStr(A));
       AList.Free;
    end;
    Enfin il y a les tableaux dynamiques (ils sont bien en Delphi, on connait leur taille,on peut les redimensionner, ils sont gérés de manière transparente en mémoire, ... ).

  12. #12
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kio,

    Un jour, quand je serai très vieux, je me poserai probablement encore la question:

    Pourquoi vouloir mettre un Single à la place destinée à un pointeur ?

    C'est typiquement le genre de code qu'il faut éviter. Tu veux utiliser un single, tu utilises une variable de ce type.
    Si les cons volaient, il ferait nuit à midi.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    j'ai evite les tableaux dynamiques parce que j'avais un Out of Memory dans mon programme!

  14. #14
    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
    lol, un OutOfMemory avec un Tableau Dynamique, c'est qu'il devait être très mal déclaré, ...

    sinon, le plus sympa c'est effectivement de reprendre l'exemple de gb_68, mais en l'améliorant en surchargeant ADD, Delete, Clear, ... pour passer un double en paramètre, tient un peu comme ce code, je l'ai modifié d'une liste contenant des structures, pour un type modèle à la place, c'est un template, suffit de remplacer TModeleType par Double et PModeleType par PDouble, et cela fonctionne sans soucis

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     unit uModeleTypeList;
     
    interface
     
    uses Classes;
     
    type
      PModeleType = ^TModeleType;
     
      TModeleTypeList = class(TList)
      protected
        function GetItem(const Index: Integer): TModeleType;
        procedure SetItem(const Index: Integer; const Value: TModeleType);
      public
        function Add(const AModeleType: TModeleType): Integer;
        procedure Clear; override;
        procedure Delete(const Index: Integer);
        procedure Insert(const Index: Integer; const AModeleType: TModeleType);
        function First: TModeleType;
        function Last: TModeleType;
        // Propriétés
        property Items[const Index: Integer]: TModeleType read GetItem write SetItem; default;
      end;
     
     
    implementation
     
    // TModeleTypeList ---------------------------------------------------------------
    //                                                                           -
    //                    TModeleTypeList - Protected                                -
    //                                                                           -
    // TModeleTypeList ---------------------------------------------------------------
     
    // TModeleTypeList - Protected ---------------------------------------------------
    function TModeleTypeList.GetItem(const Index: Integer): TModeleType;
    begin
         // On veut une Structure ModeleType, et n'ont pas un pointeur, donc déférencement (^)
         Result := PModeleType(inherited Items[Index])^;
    end;
     
    // TModeleTypeList - Protected ---------------------------------------------------
    procedure TModeleTypeList.SetItem(const Index: Integer; const Value: TModeleType);
    begin
         // On veut une Structure ModeleType, et n'ont pas un pointeur, donc déférencement (^)
         PModeleType(inherited Items[Index])^ := Value;
    end;
     
    // TModeleTypeList ---------------------------------------------------------------
    //                                                                           -
    //                     TModeleTypeList - Public                                  -
    //                                                                           -
    // TModeleTypeList ---------------------------------------------------------------
     
    // TModeleTypeList - Public ------------------------------------------------------
    function TModeleTypeList.Add(const AModeleType: TModeleType): Integer;
    var
       TmpModeleType: PModeleType;
    begin
         New(TmpModeleType);
         TmpModeleType^ := AModeleType;
         Result := inherited Add(TmpModeleType);
    end;
     
    // TModeleTypeList - Public ------------------------------------------------------
    procedure TModeleTypeList.Clear;
    var
       Index: Integer;
    begin
         for Index := Count - 1 downto 0 do begin
             if Assigned(inherited Items[Index]) then begin
                Dispose(PModeleType(inherited Items[Index]));
             end;
         end;
     
         inherited Clear();
    end;
     
    // TModeleTypeList - Public ------------------------------------------------------
    procedure TModeleTypeList.Delete(const Index: Integer);
    begin
         Dispose(PModeleType(inherited Items[Index]));
     
         inherited Delete(Index);
    end;
     
    // TModeleTypeList - Public ------------------------------------------------------
    procedure TModeleTypeList.Insert(const Index: Integer; const AModeleType: TModeleType);
    var
       TmpModeleType: PModeleType;
    begin
         New(TmpModeleType);
         TmpModeleType^ := AModeleType;
         inherited Insert(Index, TmpModeleType);
    end;
     
    // TModeleTypeList - Public ------------------------------------------------------
    function TModeleTypeList.First: TModeleType;
    begin
         // On veut un ModeleType, et n'ont pas un pointeur, donc déférencement (^)
         Result := PModeleType(inherited First())^;
    end;
     
    // TModeleTypeList - Public ------------------------------------------------------
    function TModeleTypeList.Last: TModeleType;
    begin
         // On veut un ModeleType, et n'ont pas un pointeur, donc déférencement (^)
         Result := PModeleType(inherited Last())^;
    end;
     
    end.
     
    end.
    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. [C#] Comment convertir un string[] en double[] ?
    Par FoxDeltaSierra dans le forum C#
    Réponses: 3
    Dernier message: 13/04/2010, 11h10
  2. comment convertir un variant de type NULL en double
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 03/11/2006, 12h37
  3. [VB.Net] Comment convertir un string en double ?
    Par Aspic dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/10/2006, 19h04
  4. Comment convertir une variable string en double?
    Par quentinoux dans le forum C++
    Réponses: 12
    Dernier message: 31/07/2006, 10h46
  5. comment convertir un char[] en double
    Par groult jeremy dans le forum C++
    Réponses: 6
    Dernier message: 17/11/2005, 14h49

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