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

API, COM et SDKs Delphi Discussion :

Je ne comprends pas ce que vient faire Ln()


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut Je ne comprends pas ce que vient faire Ln()
    Bonjour,
    Je m'excuse si le titre ne colle pas exactement, j'ai pas trouvé mieux.

    Bon voilà, j'essaie d'adapter cette source à mon programme, et comme j'en ai trouvé une autre ailleurs, je comprends mieux comment ça marche.
    Alors voilà ma question, dans cette première, ceci est utilisé pour récupérer la lettre du volume :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for Index:=0 to 25 do if ((PData^.dbcv_unitmask shr Index) = 1) then begin DriveLetter:=Chr(65+Index); break; end;
    Je comprends qu'il parcours la liste et s'arrête en la trouvant.
    ---
    Mais dans celle là que j'ai trouvé ailleurs, je ne pige pas ce que viens faire ln() et ln(2) et Ord(A) et les ":2:0"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str(ln(PDEV_BROADCAST_VOLUME( Msg.LParam )^.dbcv_unitmask)/ln(2)+Ord('A'):2:0,GetLettre);
    Pouvez vous m'éclairer ?

    Merci.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    C'est pour ce genre de situation qu'on recommande toujours de commenter son code...

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Je ne penses pas que ce Ln soit un logarithme népérien dans ce cas là je pense qu'il s'agit plutôt d'une sorte de fonction interne

    si je me référe au source cité il serait pour toi question de savoir si une clé USB est inséré ?
    j'avais fait tout un travail sur ce sujet a propos de l'éjection ici
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Salut,

    Tu peux aussi t'inspirer de cette discussion.
    J'avais fait (avec l'aide de Sergio, Jipeté, et bien d'autres), un petit composant (que tu peux retrouver ici) qui indique les infos d'une clé usb insérée. (Espace occupé, espace libre, la lettre, l'éjection ....).

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Bonjour,
    @GoustiFruit ; effectivement !
    @ero-sennin, @SergioMaster :
    Merci pour vos réponses, je suis déjà passé par vos sujets sur le forum à ce point c'est ce qui m'a fait avancer.
    En même temps, mon but ici est seulement de comprendre cette ligne de code, ça m'intrigue. ln() n'est pas à ce que je comprends une fonction interne.

    et le :2:0 m'intrigue aussi.

    Merci.

  6. #6
    Rédacteur/Modérateur
    Avatar de ero-sennin
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    2 965
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 2 965
    Points : 4 935
    Points
    4 935
    Par défaut
    Pour ce qui est du ln, je suis du même avis que Sergio, car je ne comprends vraiment pas ce que viendrait faire un logarithme népérien ici. Quant à la syntaxe 2:0, là je sèche...
    Sinon, Ord('A'), renvoie la valeur ordinale de 'A' soit la valeur 65... F1 sur cette fonction t'aurai surement expliqué la chose

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Salut !
    Merci, pour Ord('A'), j'avais bien saisi ! Le Ln(), j'ai collé cette ligne de code dans un projet quasiment vide (à savoir sans autre fonction interne ou autre, j'ai Ctrl-Cliqué et ça me ramène à System.Ln.
    Donc !!!
    Pour le reste, voilà

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pour faire simple, la fonction logarithme utilisée ici est un logarithme de base 2. Le logarithme de base n est définit ainsi : ln(x)/ln(n)
    donc avec n=2 on a ln(x)/ln(2)

    Le logarithme de base 2 est intéressant car c’est tout simplement la fonction inverse de la fonction f(x) = 2^x (2 puissance x). Donc utile pour le calcul binaire cela permet de retrouver rapidement la valeur de x connaissant la valeur 2^x. (ie : retrouver l'exposant d'une puissance de 2)

    Quant au :2 :0 cela signifie que l’on formate le résultat comme un nombre compris entre 0 et 99 et n’ayant aucune décimale.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Ukraine

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 162
    Points : 163
    Points
    163
    Par défaut
    Merci beaucoup pour votre réponse.
    Franchement, c'est une super chose que d'apprendre cette façon de formater les données. Et pour le Ln() ça m'éclaire bien plus.

    Merci.

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Je tiens tout de même à apporter une précision car ma première explication est quelque peu aride.

    Il était simple de retrouver pourquoi utiliser le logarithme de base 2 au regard des deux exemples qui ont été fournis soit.

    1) Value shr x = 1, ou x parcours l’ensemble des entiers positifs ou nuls.
    2) x = ln(Value)/ln(2)

    Les exemples (1) et (2) sont équivalents. En effet partant du principe que Value ne peut avoir qu’un seul bit avec la valeur 1 (tous les autres sont à 0), Value ne peut prendre que les valeurs entières suivantes {1,2,4,8,16,32,64…} soit encore {2^x | x entier positif ou nul}

    Pour l’exemple (1) shr est une instruction qui revoit 1 si le x-ème bit de value est 1 donc cela répond bien au problème.

    Pour l’exemple (2) il suffit de poser Value = 2^x, puis d’exprimer x en fonction de Value. En passant au logarithme on peut écrire : ln(Value) = ln(2^x) soit encore ln(Value) = xln(2) d’où l’on tire
    x = ln(Value) / ln(2)

    Ce qui démontre l'équivalence.
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  11. #11
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 557
    Points : 3 940
    Points
    3 940
    Par défaut
    Citation Envoyé par djiga4me Voir le message
    Merci beaucoup pour votre réponse.
    Franchement, c'est une super chose que d'apprendre cette façon de formater les données. Et pour le Ln() ça m'éclaire bien plus.

    Merci.
    Pour le logarithme, c'était pas compliqué, du niveau de la terminale en l'occurence , heureusement que Pascal veille. L'emploi du logarithme est un peu surprenant à première vue, on mélange de l'arithmétique entière et de l'arithmétique réelle, une fonction avec une boucle sur les bits de dbcv_unitmask aurait pu être mise en place à la manière du premier calcul que tu donnais qui est, à mon avis, préférable:

    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
     
    // code adapté de http://msdn.microsoft.com/en-us/library/windows/desktop/aa363249(v=vs.85).aspx
    // j'ai pas Delphi sour la patte, à tester
    function DriveLetterFromMask(Mask: Integer): Char;
    const
      DriveLetters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    var
      Rank: Integer;
    begin
      Rank := 0;
      while mask > 1 do
      begin
        mask := mask shr 1;
        Inc(Rank);
      end;  
      Result := DriveLetters[Rank];
    End;
    ...
    DriveLetter := DriveLetterFromMask(PData^.dbcv_unitmask);
    Pour le formattage, c'est une notation ancienne qui est uniquement maintenue pour des raisons historiques (Pascal d'origine, avant le Turbo), à éviter donc, la fonction Format est plus générale.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/11/2010, 15h23
  2. Petit truc tout simple que je comprend pas
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2005, 16h56
  3. Réponses: 13
    Dernier message: 27/06/2005, 14h36
  4. [thread][methodologie]Quelque chose que je ne comprends pas!
    Par norkius dans le forum Général Java
    Réponses: 5
    Dernier message: 16/03/2005, 14h01
  5. [Rave] un message que je ne comprends pas
    Par Clotilde dans le forum Rave
    Réponses: 2
    Dernier message: 30/09/2003, 21h46

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