Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transformer des saisies de char en long int

Portabilité ?

Sujet résolu
    7 octobre 2007 à 20:16:35

    Salut à tous !

    Alors voila j'aurai besoin de votre aide : je suis en train de programmer un jeu qui possède l'option score du joueur, sauvegardé dans un document texte. Quand je charge le score, je dois convertir les saisies (des char donc) en int ou long int, de préférable long int.

    Pour ce faire, je charge d'abord tout le "nombre" dans une liste chaînée, puis en utilisant les puissances de dix je convertis simplement les caractères en chiffres.
    Seulement voila j'utilise une technique qui j'espère est normée et est entièrement portable.

    Par exemple, pour convertir le nombre char "12" en long int 12, je fais ceci

    1. char numberChar[] = "12"; // Number char
    2. long int number = 0; // Number
    3. int p = 1; // Power x10
    4. for (int i = 1; i >= 0; i--)
    5. {
    6.     number += (((int)numberChar[i] - 48) * p);
    7.     p = p * 10;
    8. }


    En réalité c'est un peu complexe que ça, voir beaucoup plus mais je voulais juste vous parler de l'opérateur de cast (int) et de ce - 48. Est-ce que tous les ordinateurs comprendront cette conversion ? Je veux dire, est-ce que pour tous les ordinateurs le caractère '0' a pour valeur 48 ?
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      7 octobre 2007 à 20:29:38

      Remplace tout simplement 48 par '0', qui est un entier après tout. Ainsi, tu seras assuré de la portabilité sur n'importe quel système.
      • Partager sur Facebook
      • Partager sur Twitter
        7 octobre 2007 à 20:35:29

        ca j'en ai aucune idée... mais si c'est pas le cas tu n'as qu'a marquer
        1. number += (((int)numberChar[i] - '0') * p);


        il faut que tu lise le tableau à l'envers(ce que tu as fais)

        mais ca ne marche que pour un nombre 10<nombre<99

        ce qu'il te faut c'est la taille du tableau ;)
        Secret (cliquez pour afficher)
        1. long taille(const char* A)
        2. {long i;
        3. for(i=0;A[i]!='\0';i++)
        4. {}
        5. return i;}

        • Partager sur Facebook
        • Partager sur Twitter
          7 octobre 2007 à 20:43:16

          Je tiens à préciser que j'utilise des listes chaînées que j'ai moi même programmées, donc '\0' ne sert pas, enfin je ne vois pas où.

          Merci pour le '0', je vais le faire de suite ^^
          • Partager sur Facebook
          • Partager sur Twitter
            7 octobre 2007 à 21:03:00

            '\0' c'est la fin d'un tableau

            ton programme ne marchera pas pour
            char* nombre="5";
            ni pour char* nombre="100";

            mais je te comprends(je suis un peu comme ca :lol: )

            alors je cache mon code ;)
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 21:40:31

              Bon allé je vous lache le code complet que vous compreniez que ça marchera même avec (15121231234121534234²)! (je caricature un peu lol)... (il reste cependant un petit point à approfondir, un bog assez pénible).

              1. long int Data::Sendgscore()
              2. {
              3.     long int local = 0; // Score to return (local here)
              4.     int p = 1; // Factor of power ten to add at solution
              5.     if (!(gameScore.Isempty())) // If FsLinkedList isn't empty
              6.     {
              7.         for (int i = (gameScore.Howmany() - 1); i >= 0; i--)
              8.         {
              9.             if (((int)gameScore[i].Getc()) >= 48 && ((int)gameScore[i].Getc()) <= 57)
              10.             {
              11.                 local =+ (((int)gameScore[i].Getc() - 48) * p);
              12.                 p = p * 10;
              13.             }
              14.             else
              15.             {
              16.                 i = 0;
              17.                 gameScore.Empty();
              18.                 gameScore.Add('0');
              19.             }
              20.         }
              21.     }
              22.     else; // -0-
              23.     return local;
              24. }


              Le FsLinkedList::Howmany() permet de bien gérer tous les chiffres. Je tiens aussi à préciser que je remplacerai les 48 et 57 par respectivement '0' et '9'.

              Merci de vos réponses !

              EDIT :

              Citation : neuneutrinos

              '\0' c'est la fin d'un tableau



              Ce que tu dis est faux, \0 est un signe signant la fin d'une chaine de caractère uniquement

              EDIT 2 : neuneutrinos, tu me conseille de faire ceci
              number += (((int)numberChar[i] - '0') * p);
              </li></ol>


              Merci beaucoup mais est-ce que ceci marcherait ?
              number += (((int)numberChar[i] - ((int)'0')) * p);
              </li></ol>
              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2007 à 21:56:09

                pourquoi ne pas utiliser strtol ?
                • Partager sur Facebook
                • Partager sur Twitter

                Transformer des saisies de char en long int

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown