Aller au contenu
Zebulon
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

[C] char* -> nombre


leneuf22

Messages recommandés

:P

 

 

J'ai une chaine (de lettres : par exemple, "ABC"), et je voudrais pouvoir la convertir en nombre.

 

Le seul moyen sur (et je ne suis pas sur qu'il soit sur !) que j'ai trouvé serait d'ajouter le 1er caractère, le carré du second, le cube du 3eme, etc... dans une variable.

 

Mais dans ce cas, même un __int64 ne suffirait pas !

En supposant que ma chaine ne dépasse pas les 25 caractères, et que seuls 70 caractères différents maximum seront utilisés, y-a-t-il une solution pas trop gourmande ?

 

Merci !

Lien vers le commentaire
Partager sur d’autres sites

Début de réponse théorique :

Si tu as 70 caracteres possibles, il faut que tu travailles en base 70 et que tu donnes un code de 0 à 69 pour chacun de tes caracteres.

 

Le probleme c'est que ton PC ne connait pas cette base donc il faut que tu crées les fonctions d'encodage et de décodage pour cette base.

 

Encodage :

Si tu as "ABC", et que tes codes pour chaque caractere sont respectivement 20, 21, 22, tu fais un truc du genre :

20 + (21 * 70) + (22 * 70^2)

 

Décodage :

1/ Tu prends ton nombre et tu le divises par 70 jusqu'à ce que la partie entiere du nombre soit < 70.

2/ Cette partie entiere correspond au code de la derniere lettre encodée donc tu la sauvegardes.

3/ tu fais nombre = nombre - partie entiere * 70^(nbre de divisions)

Tant que le nombre trouvé est >= 70 retour à l'etape 1

 

Mais je ne suis pas sur que tu puisses encoder autant de caracteres que tu as besoin.

 

Automne

Lien vers le commentaire
Partager sur d’autres sites

Oui, je crois que c'est peine perdue...

 

Quoique, si par exemple un caractère sur 2, je changeais le signe de mon calcul, je pourrais peut-être y arriver (60 caractères devraient normalement suffire)

Et sachant que je n'ai pas besoin de fonction de décodage.

 

du style :




codechaine("ABC");



void codechaine(char* str)

{

   __int64 code=0;

   int exposant=1;

   for(short i=1;*str;str++, i++)

   {

       if(i%2) //en supposant que *str est déjà ramené en base 60 (

           code+= *str * 60^exposant;

       else

           code-= *str * 60^++exposant; //incrémentation une fois sur 2

   }

   return;

}

 

 

Est-ce que ça pourrait marcher comme ça ?

(impossible à vérifier !!)

 

Merci :P

Lien vers le commentaire
Partager sur d’autres sites

Je fais un programme avec 2 autres personnes, et il me faut un moyen d'éviter strcmp pour comparer des chaines, car il peut y en avoir énormément.

En plus il se trouve que la fonction strcmp de mon compilateur est lente !!

 

Vu que c'est LE point gourmand du programme j'essaye d'éviter ce genre de choses, le programme étant déjà assez lourd.

 

J'ai le choix entre ça ou un strcmp amélioré (que j'ai déjà, mais j'aimerais tester les 2 solutions)

 

Pour info j'ai une liste chaînée de struct avec un char* qui pointe vers une chaine (-> je n'ai pas besoin d'une fonction de décodage) + une variable numérique (pourquoi pas un __int64, mais bonjour la mémoire) qui contiendrait le "code" de la chaine, + le reste.

Et pour rechercher une chaîne parmi des tas et des tas d'autres (donc je dois en + parcourir toute la LL), il me faudrait un truc rapide :P

 

Bien sur si il me faut un int64, ça fait beaucoup de mémoire, donc pas de grand intêret (sutout si la fonction de calcul est lourde). Donc si la seule solution c'est d'obtenir un nombre énorme, je prendrais le strcmp.

Lien vers le commentaire
Partager sur d’autres sites

Pkoi tu ne fais pas un checksum??

Ensuite, tu n'as plus qu'a vérifier que le checksum de ta chaine de départ est la meme que la chaine a comparer...

Lien vers le commentaire
Partager sur d’autres sites

c'est une somme de contrôle. Utilisée pour contrôler l'intégrité d'un fichier ou d'un bloc de données, en faisant la somme des octets qui le composent.

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...