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 :

StrToFloat : Pb de debutant


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 28
    Points
    28
    Par défaut StrToFloat : Pb de debutant
    Bonjour

    J ai un pb que je qualifirais de debutant primo parceque j en suis un et secondo parceque je suis certain que cela est du a une incomprehension de ma part dans le type de variable a utiliser mais j ai beau chercher je ne trouve pas la solution seul.
    J ai declaré un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gain : array [1..36] of extended;
    j essai dans un boucle de recuperer le contenu d une TStringList pour l 'additionner a Gain avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gain[Prono_1] := Gain[Prono_1] + StrTofloat(RG[Prono_1]);
    mais cela genere une exception precisant 5.70 ( le contenu de ma Rg[Prono_1] ) n est pas une valeur en virgule flotante correcte.
    Si j utilise le type real, j ai le message 'n est pas une valeur reel correcte'.

    je precise que j ai declaré ce type pour pouvoir diviser plus tard...

    Ces erreurs proviennt elles bien d une erreur de declaration ou de convertion et si oui comment y remedier ?

    Merci pour votre aide

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 19
    Points
    19
    Par défaut
    c'est surement que le séparateur décimal n'est pas le bon ça doit etre , et non .

    dans ta chaine remplace ',' par decimalseparator et '.' par decimalseparator comme ca quelque soit la configuration local de la machine ça passera...

    Bruno

  3. #3
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    je precise la reponse qui me semble pas tres clair (desolé bruno@home )

    Dans ton code il suffit de tapper a un endroit quelconque (mais avant tout appel a strtoFloat) la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DecimalSeparator = '.';
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DecimalSeparator := ',';
    Cette variable permet au systeme de specifier le caractere qui servira de separateur de virgule.

    Le probleme viens du fait que nous tournons generalement sur des machines francaises (DecimalSeparator = ',') avec une habitude de coder les chiffre flottant a la mode anglaise (DecimalSeparator = '.')

    Donc l'analyse par defaut par le systeme trouve un '.' la ou une ',' est attendu, donc genere l'erreur.

    Si tu veux rendre ton application compatible, non pas avec tous les systemes mais avec tous les modes de saisie (tanto '.' tanto ',') il te faudra analyser ta chaine flottante, rechercher l'occurance de '.' ou de ',' et de la remplacer par la valeur de DecimalSeparator ....

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    ok merci j ai saisi le truc seulement, mainteant j ai un pb 'indice hors limite' alors que le tableau est declaré correctement puisque il ne contient que 36 enregistrements maxi et que la somme 'Gain' n'est jamais un nombre de plus de 5 chiffres ...

    Pour un tableau de type 'integer' je ne rencontre qucun pb avec [1...36]

    comment y remedier ?
    Merci

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par turf_trader
    ok merci j ai saisi le truc seulement, mainteant j ai un pb 'indice hors limite' alors que le tableau est declaré correctement puisque il ne contient que 36 enregistrements maxi et que la somme 'Gain' n'est jamais un nombre de plus de 5 chiffres ...

    Pour un tableau de type 'integer' je ne rencontre qucun pb avec [1...36]

    comment y remédier ?
    Merci
    Et RG ???

    Sinon, un conseil, utilises plutôt des tableaux indicés de 0 à N-1 et non pas de 1 à N.
    En effet, et tu trouveras moultes explications (bref c'est un sujet que moi-même ou d'autres forums on déjà abordés) sur le forum, si tu passes un tableau[1..N] comme paramètre d'une procédure ton tableau, dans la procédure, deviendra indicé de [0 à N-1]. Ce qui est piégeant quand on a beaucoup de ligne de codes et que l'on est pas au courant de ce mécanisme (qui n'est pas un bug du langage !!!).

    Quoiqu'il en soit, si tu te retrouves avec un indice hors limite, c'est que, forcément, tu dépasses les bornes de ton tableau !
    T'es tu posé la question de savoir si Prono_1 pouvait dans ton code prendre la valeur 0 ?

  6. #6
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Ho ?
    Un tableau statique de 1 a N deviens dynamqiue de 0 a N-1 en parametre de procedure ?!? Premiere nouvelle .... sacree nouvelle !!

    L'ideal pour les tableaux passés en parametre c'est de toute maniere les types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type 
    TTabProno = Array[1..N] of Extended
    Var Tab : TTabProno;
     
    Procedure MaProc(ATab : TTabProno);
    A umoins la ca cope court a toute diuscussion (enfin je crois non )

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Clorish
    Ho ?
    Un tableau statique de 1 a N deviens dynamqiue de 0 a N-1 en parametre de procedure ?!? Premiere nouvelle .... sacree nouvelle !!

    L'ideal pour les tableaux passés en parametre c'est de toute maniere les types :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Type 
    TTabProno = Array[1..N] of Extended
    Var Tab : TTabProno;
     
    Procedure MaProc(ATab : TTabProno);
    A umoins la ca cope court a toute diuscussion (enfin je crois non )
    Comme ça pas de soucis, comme ça par contre, là il faut faire attention :
    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
    function somme(Tab:array of integer):integer;
    var i:integer;
    begin
      result:=0;
      for i:=0 to high(Tab) do
      result:=result+Tab[i];
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var Tableau1:array[1..10]of integer;
         Tableau2:array[18..23]of integer;
         Tableau3:array[-140..-135]of integer; //si, si...
        i:integer;
        MaSomme:integer;
    begin
      for i:=1 to 10 do tableau1[i]:=2*i;
      for i:=18 to 23 do tableau2[i]:=3*i;
      for i:=-140 to -135 do tableau3[i]:=i;
     
      MaSomme:=somme(tableau1);
      edit1.text:=IntToStr(MaSomme);
     
      MaSomme:=somme(tableau2);
      edit2.text:=IntToStr(MaSomme);
     
       MaSomme:=somme(tableau3);
      edit3.text:=IntToStr(MaSomme);
    end;


    Ce qui devrait couper court à tes doutes cher ami

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    merci messieurs pour ces explications qui m ont fait mieux comprendre le 'mecanisme' des tableaux.

    Mon erreur provient bel et bien de rg, une tstringlist.
    quand j'effectuais

    Gain[Prono_1] := Gain[Prono_1] + StrTofloat(RG[Prono_1]);

    je me retrouvais avec une erreur d indice etant donné que rg a un index de 0 à 35 et prono_1 etait de 1à 36 ( il commence à 1 )

    j ai corrigé mais suis toujours confronté au meme pb.
    si je fais Gain[Prono_1] := Gain[Prono_1] + 3 par exemple, tout est ok.

    si par contre je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Prono_0 :=Prono_1-1;
    Gain[Prono_1] := Gain[Prono_1] + StrTofloat(RG[Prono_0]);
    je suis toujours confronté au meme pb : EStringListError indice hors limites (17).

    A qoui coorespond ce 17 ? Qui qoui qu il en soit est < 36 et > 0...

    merci

  9. #9
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Es tu sur sur sur que RG possède 36 lignes et non 17 (d'où indice max autorisé=17-1=16, et à 17 ça coince) ?

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    merci a vous j ai resolu mon pb d index en reecrivant plus coorectement en m inspirant des reponses precedentes et tout est ok

  11. #11
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par waskol
    Comme ça pas de soucis, comme ça par contre, là il faut faire attention :
    [...]


    Ce qui devrait couper court à tes doutes cher ami

    C'est vrai qu'en declarant un array of integer on a forcement uen variable de type tableaux dynamique
    C'ets comem quand on caste une variable avec un type plus bas dans la hierarchie ... on a interet a ce que la zone memoire pointée par la variabel soit coherente avec le type du cast .. sinon

    D'ailleur si mes souvenirs sont bons, sous Delphi7 c'est pas possible de declarer un parametre de type tableaux
    J'ai souvent du passer par des types tableaux. et la ... plus d'erreurs

    [Edit]
    Je me suis arrete a Delphi 7

  12. #12
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Truf_trader >> Personelement j'utilise la plupart du temps des tableaux statiques de 0 a N-1 pour justement eviter les pbs de correspondances d'index. Sauf si j'ai vraiement un interet a indexer de N a M, afin de recuperer les index comme valuers (genre tabelaux associatifs )

    Astuce : L'ideal est de boucler de 0 a length(tab) -1, comme ca le jour ou tu decide de passer en taille dynamique, ton code reste inchangé

  13. #13
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par Clorish
    Astuce : L'ideal est de boucler de 0 a length(tab) -1, comme ca le jour ou tu decide de passer en taille dynamique, ton code reste inchangé
    Et avec Low et High ! Là au moins pas de soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for i := Low(tab) to high(tab) do

    @+ Claudius

  14. #14
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Clorish
    Je me suis arrete a Delphi 7
    rhoooooooooo l'excuse...
    ...parce que moi aussi, j'en suis resté à Delphi 7 !
    D'ailleur si mes souvenirs sont bons, sous Delphi7 c'est pas possible de declarer un parametre de type tableaux
    c'est-à-dire ?

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Cl@udius
    Et avec Low et High ! Là au moins pas de soucis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      for i := Low(tab) to high(tab) do

    @+ Claudius
    +1

  16. #16
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par Cl@udius
    Et avec Low et High ! Là au moins pas de soucis.
    Ha oui j'oublie tout le temps ces fonctions :p

  17. #17
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par waskol
    D'ailleur si mes souvenirs sont bons, sous Delphi7 c'est pas possible de declarer un parametre de type tableaux
    c'est-à-dire ?
    ben ca m'est arrivé d'avori des erreurs de compilation suite a la declaration de tableaux en tant que parametre de fonctions.
    Je viens de teser et visiblement ca marche .. ca devait pas etre comem ca

    bref, suite a ce genre de problemes j'ai souvent opté pour des type tableaux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type TTab = array of Integer;
    D'ailleur c'est plus propre a mon gout :p
    (et surtout plus generique .....)

  18. #18
    Membre chevronné
    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
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par Clorish
    ben ca m'est arrivé d'avori des erreurs de compilation suite a la declaration de tableaux en tant que parametre de fonctions.
    Je viens de teser et visiblement ca marche .. ca devait pas etre comem ca
    Ayé j'ai retrouvé : C'est les tableaux statiques qu'il aime pas !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure Proc(tab : array[1..2] of Integer);

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

Discussions similaires

  1. [FLASH] pb debutant
    Par ultrakas dans le forum Flash
    Réponses: 2
    Dernier message: 05/06/2003, 00h48
  2. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  3. [debutant]Limiter le temps de saisi
    Par Nasky dans le forum C
    Réponses: 5
    Dernier message: 17/03/2003, 15h47
  4. [Debutant] Fichier war
    Par saispasfau dans le forum JBuilder
    Réponses: 2
    Dernier message: 17/03/2003, 15h32
  5. Réponses: 3
    Dernier message: 09/02/2003, 01h09

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