Convertion de type

mastok007 Messages postés 5 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 décembre 2007 - 11 déc. 2007 à 20:18
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 12 déc. 2007 à 01:01
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

deck_bsd Messages postés 1243 Date d'inscription jeudi 31 mars 2005 Statut Membre Dernière intervention 3 août 2016 2
11 déc. 2007 à 20:40
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]
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 déc. 2007 à 21:10
ultoa

ciao...
BruNews, MVP VC++
0
mastok007 Messages postés 5 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 décembre 2007
11 déc. 2007 à 21:10
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
0
mastok007 Messages postés 5 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 décembre 2007
11 déc. 2007 à 21:13
Merci c'est ça que je cherchais

A bientôt

Mastok007 bien à vous
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 21:16
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 21:36
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 21:42
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++ (@++)<!--
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 déc. 2007 à 21:43
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++
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 22:07
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++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
11 déc. 2007 à 22:10
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++ (@++)<!--
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 déc. 2007 à 22:24
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++
0
mastok007 Messages postés 5 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 décembre 2007
12 déc. 2007 à 00:03
Merci à tous pour les infos je vais étudier tous ça

A bientôt

Mastok007 bien à vous
0
mastok007 Messages postés 5 Date d'inscription lundi 23 janvier 2006 Statut Membre Dernière intervention 12 décembre 2007
12 déc. 2007 à 00:24
Je pense que la fonction atol devrais faire le job non ?

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

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

C++ (@++)<!--
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 déc. 2007 à 01:01
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++ (@++)<!--
0
Rejoignez-nous