Convertion de type

Signaler
Messages postés
5
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 décembre 2007
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
Bonjours à tous

Quelqu'un peut il me dire comment on transforme une chaine Ansistring en unsigned long    
 ex :  "4290944728" en UL ou DWORD
en Int c'est facle "ToInt" ou ToIntDef mais ça donne un erreur !

Merci d'avance
Mastok007 bien à vous

15 réponses

Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
2
mmm je serait façe à cette situation je dirait wsprintf() , mais ce n'est p-e pas la meilleur solution.

++
deck_bsd
___________________________________
[http://deck-bsd.eurower.net]
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ultoa

ciao...
BruNews, MVP VC++
Messages postés
5
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 décembre 2007

wsprintf ne convient pas je dois faire l'inverse chaine vers UL et non pas UL en chaine

Merci quand même

Mastok007 bien à vous
Messages postés
5
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 décembre 2007

Merci c'est ça que je cherchais

A bientôt

Mastok007 bien à vous
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
ultoa convertie une chaine en DWORD ?
Sinon ça reste quand même très simple à faire:

DWORD atoul (char *src)
{    int ret 0, i 10;

    while(*src && i > 0) {
        if(*src >= '0' && *src <= '9') {
            ret = (ret*10)+(*src-'0');
            i--;
        }
        src++;
    }

    return ret;
}

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
En voici une autre version:
DWORD atoul (char *src)
{
    char *end = src+10;
    DWORD ret = 0;

    while(*src && src < end) {
        if(*src >= '0' && *src <= '9')
            ret = (ret*10)+(*src-'0');
        src++;
    }

    return ret;
}

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Oups. Décidément....
Petite erreur dans la boucle:

DWORD atoul (char *src)
{
    char *end = src+10;
    DWORD ret = 0;

    while(*src && src < end) {
        if(*src < '0' || *src > '9') break;
        ret = (ret*10)+(*src++-'0');
    }

    return ret;
}

En gros, cette version quitte si on tombe sur un caractère non décimal.

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
ah oui, j'avais encore lu trop vite.

alors version fun pour me rattraper:

__declspec(naked) unsigned int __fastcall bnatoui(char *szsrc)
{ // ECX = szsrc
  __asm {
    xor     edx, edx
    xor     eax, eax
 nbrLoop:
    mov     dl, [ecx]
    sub     dl, '0'
    js      short nbrStop
    cmp     dl, 9
    ja      short nbrStop
    lea     eax, [eax+eax*4]
    add     ecx, 1
    lea     eax, [eax*2+edx]
    jmp     short nbrLoop
 nbrStop:
    ret     0
  }
}

ciao...
BruNews, MVP VC++
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Bon. Encore une fois, tu me fais passer pour un débutant total.
Ok, pour le fun, essayons de traduire tout ça en C.

DWORD atoul (char *src)
{
    char *end = src+10;
    DWORD ret = 0, c;

    if(!*src) return 0;

    do {
        c = (*src-'0');
        if(c > 9) break;
        ret = (ret*10)+c;
        src++;
    } while(*src && src < end);

    return ret;
}

J'ai laissé la vérification de la position, car, avec ton code, si on entre un nombre plus grand que 0xFFFFFFFF, on aura une surprise.

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Arfff et puis dans le fond, suffis d'entrer 5000000000 pour avoir un zolie surprise dans mon code aussi.
Au diable cette vérification:

DWORD atoul (char *src)
{
    DWORD ret = 0, c;

    if(!*src) return 0;

    do {
        c = (*src-'0');
        if(c > 9) break;
        ret = (ret*10)+c;
    } while(*++src);

    return ret;
}

C++ (@++)<!--
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
normal que ça dépassera.
Pas grave j'ai la version 64 ou même de la taille qu'on veut.

ciao...
BruNews, MVP VC++
Messages postés
5
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 décembre 2007

Merci à tous pour les infos je vais étudier tous ça

A bientôt

Mastok007 bien à vous
Messages postés
5
Date d'inscription
lundi 23 janvier 2006
Statut
Membre
Dernière intervention
12 décembre 2007

Je pense que la fonction atol devrais faire le job non ?

Mastok007 bien à vous
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Fais le test par toi-même.

printf("%u\n", atol("4000000000"));
printf("%u\n", atoul("4000000000"));

C++ (@++)<!--
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
atol, sous la stdlib de linux du moins, revien à utiliser strtol. Si tu veux plus d'explication, tu peux simplement aller voir ses sources:
http://www.openbsd.org/cgi-bin/cvsweb/src/lib/libc/stdlib/strtol.c?rev=1.7&content-type=text/x-cvsweb-markup

C++ (@++)<!--