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 :

Fonction indisciplinée.. (D10)


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut Fonction indisciplinée.. (D10)
    Bonjour,
    J'utilise une fonction dans mon appli qui est appelée à divers endroit.
    Elle fonctionne parfaitement pour tous ces appels sauf un pour lequel le "Result" contient bien une valeur, mais la variable qu'elle est sensée modifiée reste à zero.

    Voici la fonction:
    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
    function ConvertCoordinatesD(sCoord:String):Single;
    var pSec, pMin, pDeg               : Integer;
        Dir, sSeconds, sMinutes, sDegres     : String;
        dSeconds, dMindec, dMinutes, dDegres : Single;
    begin
      pSec:= 0;
      pMin:= 0;
      pDeg:= 0;
      dMindec:= 0;
      sCoord := ReplaceText(sCoord, ' ', '');
      Dir := Copy(sCoord, 1, 1);
    // récupération des positions des divers symboles "; .; '; ° ou *
      if Pos('"', sCoord) <> 0 then
        pSec:= Pos('"',sCoord);
      if Pos('''', sCoord) <> 0 then
        pMin:= Pos('''',sCoord)
      else
        PMin:= Pos('*', sCoord);
      if Pos('°', sCoord) <> 0then
        pDeg:= Pos('°', sCoord);
      if Pos('*', sCoord) <> 0 then
        pDeg:= Pos('*', sCoord);
      if pSec <> 0 then
      begin
        sSeconds:= Copy(sCoord, pMin + 1, (pSec - pMin)-1);
        dSeconds:= StrToFloat(sSeconds);
        dMindec:= dSeconds/60;
      end;
      if (pMin <> 0)
      and(pSec = 0) then
        sMinutes:= Copy(sCoord, pMin + 1, Length(sCoord)-1)
      else if (pMin <> 0)then
        sMinutes:= Copy(sCoord, pDeg + 1, (pMin - pDeg)-1);
      dMinutes:= StrToFloat(sMinutes);
      dMindec:= (dMinutes + dMindec)/60;
      sDegres:= Copy(sCoord, 2, (pDeg - 2));
      dDegres:= StrToFloat(sDegres);
      Result:= dDegres + dMindec;
    end;
    Et voici le code pour lequel elle renvoie zero:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
          RichEdit_MoveTo(redlog,Row , 31);
          Application.ProcessMessages;
          redLog.SelLength:= 9;
          sLat:= redLog.SelText;
          RichEdit_MoveTo(redlog,Row + 1 , 29);
          Application.ProcessMessages;
          redLog.SelLength:= 11;
          sLon:= redLog.SelText;
          dLat:= ConvertCoordinatesD(sLat);
          dLon:= ConvertCoordinatesD(sLon);
        end;
    dLon et dLat sont à zero alors qu'en pas à pas, le "Result" contient bien une valeur.

    Merci de votre aide.

    Cordialement
    Pierre

  2. #2
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    et ça se comporte toujours de la même manière dans ce code quelle que soit les valeurs de dlat et dlon ?

    le code appelant est-il à un niveau quelconque englobé dans un try except qui n'afficherait pas l'erreur ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Quelles sont les données (sLat et sLon) qui pose le problème ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonjour et merci de vos réponses,

    Le problème est que le déroulement de la fonction se fait normalement jusqu'à la ligne 38 où Result a bien une valeur décimale. Par contre au retour de l'appel, dLat et dLon restent à zero.
    La valeur de SLat et sLon sont variables, il s'agit de coordonnées géographiques.
    Un exemple:
    sLat = 'N 49*01.9'
    sLong = ' E 001*13.3'

    Le result de la fonction contient:
    Pour sLat = 49,031665802002
    Pour sLon = 1,22166669368744

    Ces résultats sont corrects mais ne jamais transmis à dLat et dLon.

    Le code n'est en aucun cas à l'intérieur d'un Try Except.

    Merci de vos lumières

    Cordialement
    Pierre

  5. #5
    Invité
    Invité(e)
    Par défaut
    J'ai une erreur sur le StrToFloat si le séparateur n'est pas réglé sur le point. Rien ne change entre le point et la virgule sur tes différentes valeurs ? Aucune exception ?
    Tu divise une valeur avec le séparateur point, et tu récupères une valeur avec le séparateur virgule.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Merci de ta réponse

    La fonction est utilisée à plusieurs autres endroits et renvoie toujours un résultat avec virgule sans problème.

    Voici un extrait de code qui appelle la fonction sans aucun problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ... LstrLatitude:= ReplaceText(Lstrlatitude,' ', '');
        LstrLongitude:= ReplaceText(Lstrlongitude,' ', '');
        LstrDirLatitude:= Copy(LstrLatitude,1,1);// N-S
        LstrDirLongitude:= Copy(LstrLongitude,1,1); // E-
        LfltLatitude:= ConvertCoordinatesD(LstrLatitude);
        if LstrDirLatitude = 'S' then
          LfltLatitude:= - LfltLatitude;
        LfltLongitude:= ConvertCoordinatesD(LstrLongitude);
        if LstrDirLongitude = 'W' then
          LfltLongitude:= - LfltLongitude;
        GstlMapPoints.Add(FloatToStr(LfltLatitude) + ';' +
                                FloatToStr(LfltLongitude));
    ...

  7. #7
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 666
    Points : 3 660
    Points
    3 660
    Billets dans le blog
    2
    Par défaut
    Bonsoir,

    Comme retwas, en reprenant le code indiqué dans le premier post, j'ai aussi l'erreur StrToFloat. Je suis sous Windows 10 avec le caractère virgule en tant que symbole décimal dans les options régionales de Windows.
    Ce point est vite corrigé en ajoutant dans le code la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.SysUtils.FormatSettings.DecimalSeparator := '.';
    Ensuite, j'ai le résultat attendu dans les variables dLat et dLon. Mon projet Delphi (VCL Windows 32 bits) est en configuration de construction Debug. Dans les options du projet, rubrique "Compilation", la case "Optimisations" est décochée.
    Si je coche cette case, puis reconstruction du projet, j'obtiens le même problème : la variable result est bien alimentée mais de retour dans la méthode d'appel, dLat est à zéro. Par contre, si ensuite j'utilise la variable dLat (showmessage ou autre), dLat est bien renseignée.

    Je pense que tu dois avoir la case "Optimisations" cochée et que tu n'utilises pas la variable dLat après l'appel à ConvertCoordinatesD. L'optimisation du deboggeur fait que cette variable n'est même plus connue du deboggeur puisqu'elle n'est plus jamais utilisée => pourquoi continuer à la gérer ?

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 439
    Points : 161
    Points
    161
    Par défaut
    Bonjour à tous,

    Merci d'avoir pris du temps pour m'aider à résoudre ce problème.

    gbegreg a parfaitement trouvé la cause de ce soucis et celui-ci est désormais réglé.

    Merci encore de votre patience et de vos compétences.

    Bien cordialement
    Pierre

  9. #9
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2007
    Messages
    3 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 494
    Points : 3 129
    Points
    3 129
    Par défaut
    Pour être sûr que ça fonctionne à chaque fois, dans la chaîne, remplacer tous les points et virgule par System.SysUtils.FormatSettings.DecimalSeparator

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 04/03/2016, 16h34
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Implémentation des fonctions mathématiques
    Par mat.M dans le forum Mathématiques
    Réponses: 9
    Dernier message: 17/06/2002, 16h19
  4. fonction printf
    Par ydeleage dans le forum C
    Réponses: 7
    Dernier message: 30/05/2002, 11h24
  5. FOnction api specifiant la position de la souris
    Par florent dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/05/2002, 20h07

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