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 :

NewGint et NewGCent


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut NewGint et NewGCent
    Bonjour,

    J'utilise ces deux bibliothéques de gestion de très grands nombres développées par René Kinzinger et Gilbert Geyer.
    J'ai migré mes programmes de Delphi 7 sur Delphi 10.3 en VCL 32 bits.
    Toutes les fonctions marchent correctement a part la FGintTostr qui n'arrive plus à convertir des nombre > 999 ?
    Ces fonction sont écrites en assembleur, je n'ai pas les connaissances pour faire la correction.
    Voici le code si au cas ou.
    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
    113
     
    function FGIntToStr(Nb: GInt): AnsiString;  register;
    var buffer, lb, ls, ln : longword;
    asm
        push    edx
        test    eax,eax            // cas Nb=0 ?
        jnz     @Init
        call    RetZero
        mov     byte ptr[eax],$30
        pop     edx
        mov    [edx],eax
        jmp     @Retour
        @init:
        push    eax
        mov     eax,edx
        call    System.@LStrClr
        pop     eax
        push    ebx
        push    esi
        push    edi
        mov     ebx,eax              // ebx pointe nb
        mov     eax,[eax]-$04
        mov     ln,eax              // ln = longueur de Nb
        shl     eax,2                // ln x 4
        mov     lb,eax  // réserver un buffer de 4 fois la capacité Nb
        call    System.@GetMem      //obtenir adr buffer
        mov     buffer,eax
        mov     edi,eax            // eax pointe début de buffer
        add     edi,lb             // edi pointe fin buffer +1
        xor     edx,edx   // copier Nb en début de buffer
        @Copy:
        mov    cl,byte ptr[ebx]+edx
        mov    byte ptr[eax]+edx,cl
        inc    edx
        cmp    edx,ln
        jne    @Copy
        xor    edx,edx  // Conversion des octets en base 100 en fin de buffer
        mov    ls,edx              // compteur octets décimaux
        xor    ecx,ecx
        mov    ebx,$64
        @RConv2:  //lecture, conversion, stockage
        mov    esi,buffer
        mov    ecx,ln
        @RConv1:
        xor    eax,eax
        mov    al,byte ptr[esi]
        mov    byte ptr[esi],0
        inc    esi
        dec    ecx
        jz     @finConv
        test   al,al
        jz     @RConv1
        mov    dl,al
        @RConv0:
        mov    ah,dl
        xor    dx,dx
        mov    al,byte ptr[esi]
        div    bx
        add    byte ptr[esi]-1,ah  // report de retenue
        mov    byte ptr[esi],al    // place quotient
        inc    esi
        dec    ecx
        jnz    @RConv0
        dec    edi
        mov    byte ptr[edi],dl    // sauve dernier reste de ligne ligne
        inc    ls                  // compteur octets convertis
        jmp    @RConv2
        @FinConv:
        xor    dx,dx
        div    bx
        dec    edi
        mov    byte ptr[edi],dl  // dernier reste
        inc    ls
        dec    edi
        mov    byte ptr[edi],al  // dernier quotient
        inc    ls
        mov    esi,buffer // Conversion en Ascii et stockage en buffer
        mov    ecx,ls
        xor    ebx,ebx
        @Ascii:
        mov    al,byte ptr[edi]
        inc    edi
        aam
        add    ax,$3030
        mov    byte ptr[esi],ah
        inc    esi
        mov    byte ptr[esi],al
        inc    esi
        add    ebx,2
        dec    ecx
        jnz    @Ascii
        mov    eax,ebx  // Chaîne de retour
        mov    esi,buffer
        @Ret0: //sauter les '0' de devant
        cmp    eax,1
        je     @SStr
        cmp    byte ptr[esi],$30
        jne    @SStr
        inc    esi
        dec    eax
        jmp    @Ret0
        @SStr:
        call   Restring
        pop    edi
        pop    esi
        pop    ebx
        pop    edx
        mov    [edx],eax                  //Result
        mov    eax,buffer                 //Libérer buffer
        mov    edx,lb
        call   system.@FreeMem
        @Retour:
    end;
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    je ne connais pas cette lib, mais j'en connais une extrêmement rapide et qui fonctionne avec les derniers Delphi

    http://rvelthuis.de/programs/bigintegers.html

    l'auteur est malheureusement décédé
    https://jonlennartaasenden.wordpress...rudy-velthuis/

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Juillet 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Juillet 2017
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Merci, c'est effectivement très intéressant.
    Je garde de coté ce généreux travail de Rudy Velthuis, malheureusement parti.
    Cette Lib pourra mettre très utile pour des travaux en 64bits, celle que j'utilisais depuis de nombreuses années ne fonctionnait qu'en VCL32.

    A voir si il est possible de faire la correction des Lib NewGint et NewGCent. Ces lib étaient entièrement en asm et très performantes aussi.

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