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

 C Discussion :

Int commençant par zéro


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut Int commençant par zéro
    Bonjour à tous !

    Je suis sur un petit projet personnel, un défi que je me suis lancer, et je suis actuellement bloqué sur un détail qui m'empêche d'avancer.

    Dans une partie de mon travail, j'utilise une fonction qui traduit le binaire en IP décimal pointé. Mon soucis c'est que lors de la demande de saisi (ou l'inscription dans le cœur du programme) il ne conserver pas les zéro avant les premiers chiffre...

    C'est tout à fait logique certes mais sa m'arrange pas ^^ Alors je voudrais savoir comment faire pour contourné ce soucis.

    Exemple de mon problème

    int octet1=0
    octect 1 = 00110101

    et quand je vérifie ma valeur il m'affiche "266350"

    tout fonctionne tant que ma valeur commence par 1 telle que 10110101 oû la , la vérification m'affiche le même.

    Voilou, je suis à dispo pour tout précision, merci d'avance et bonne journée à tous !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int main()
    {	int ip1=0;
    	int bit1=01010101;
                  ip1=bit1
                  printf("%i", ip1);
                  system("pause"),
                  return 0;
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Une constante entière en décimal ne doit pas commencer par 0 .
    Une constante entière commençant par 0 est considérée comme écrite en octal.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Daccord, merci Diogene

    Alors qu'elle serai la solution pour que je puisse envoyé cette octet à ma fonction ?

    int main()
    {
    int ip1=0;
    int bit1=00110101;
    ip1=traduitBit_en_IP (bit1)
    printf("%i", ip1);
    system("pause"),
    return 0;
    }

    Dans ce cas la, le bit 1 vaux 266305 alors que j'aimerai qu'il valent 00110101.

  4. #4
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Bonjour ce que vous pouvez faire c'est commencer le nombre par le premier bit égal à 1 comme:

    int bit1=1010101
    printf("%08d", ip1);
    Je m'explique 8 est la largeur du champ qui sera affiché(ici on veut 8 chiffres)
    Et 0 permet de remplacer par des zéros les chiffres manquants

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Pas mal quetzacoatl,

    cependant, et je deviens chiant, sa ne m'arrange pas pour mon problème principal.

    A l'intérieur de la fonction traduitBit_IP, j'ai de multiple calcule en puissance de 2 et si à la fin il n'a pas son décompte de 8bits (pour faire l'octet), il me renvoie un information complètement erronée.

    Et en l'état actuel, la fonction traduitBit_IP reçois ce fameux 266305 au lieux de mon 00110101.

    int main()
    {
    int ip1=0;
    int bit1=00110101;
    ip1=traduitBit_en_IP (bit1)
    printf("%i", ip1);
    system("pause"),
    return 0;
    }

    Je sens que sa va pas être simple tout sa

  6. #6
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Pourriez vous mettre le code de vos autres fonctions utilisées afin de trouver une solution compatible?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Bien sur ^^

    Alors voila

    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
    
    int traduirBit_Ip (int bit)
    {
    	int bi1=0,bi2=0,bi3=0,bi4=0,bi5=0,bi6=0,bi7=0,bi8=0;//Si on entre le bit ici, la fonction va super
    	bi8=(bit/10000000)%2;
    	bi7=(bit/1000000)%2;
    	bi6=(bit/100000)%2;
    	bi5=(bit/10000)%2;
    	bi4=(bit/1000)%2;
    	bi3=(bit/100)%2;
    	bi2=(bit/10)%2;
    	bi1=(bit/1)%2;
    	return bi8*128+bi7*64+bi6*32+bi5*16+bi4*8+bi3*4+bi2*2+bi1*1;//Calcule la valeur décimal (puissance de 2)
    }
    
    int main()
    {	int ip1=0, ip2=0, ip3=0, ip4=0;
    	int bit1=01010101, bit2=0, bit3=0, bit4=0;
    	int test=0;
               printf("Enter l'IP :  ");
    	scanf("%i %i %i %i", &ip1, &ip2, &ip3, &ip4);
    	testeur_ip(ip1);
    	testeur_ip(ip2);//Verifie si l'ip est entre 0 et 255
    	testeur_ip(ip3);
    	testeur_ip(ip4);
              ip1=traduirBit_Ip(bit1);
              ip2=traduirBit_Ip(bit2);
              ip3=traduirBit_Ip(bit3);
              ip4=traduirBit_Ip(bit4);
              printf("%i %i %i %i", ip1, ip2, ip3, ip4);
              system("pause");
              return 0;
    }
    Je préviens je suis amateur, il y a des risques que se soit pas très propre ni très opti ^^

    J'éspère que sa facilitera le travail pour trouver une solution !

  8. #8
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    Au vu de votre code, je ne comprends pas pourquoi utiliser des int ne comportant pas 8 chiffres dans la focntion
    int traduirBit_Ip (int bit)
    renvoie un code d'erreur.

    En effet si bit=100010 par exemple, on aura bien bi8 et bi7 nuls?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Je suis pas sur d'avoir tout compris...

    Alors pourquoi ne pas utiliser directement l'octet en une fois--> Bin sinon j'ai pas trouver le moyen de calculer la valeur décimal sans séparer les bit's (dernière ligne de la fonction)

    Le but de la fonction étant d'obtenir de 11010101 -> 213

    Désoler si j'ai pas compris correctement ta remarque Quetzacoati

    La deuxieme facon dont j'ai compris ta remarque c'est "de toute facon si tu avais t'est 0, il renverai 0 dans le vide donc tu pourra remplir à la fin"
    Alors dans ce cas oui, mais le code octet est transformer. Si je rentre 00110101 il transforme sa directement en 266305


    Je vais tenter un truc avec un if dans la fonction en attendant de trouver une solution, dans le style de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    si "bit" a moin de 8 valeur
    remplira la fonction qui sera vide par le 0 de renvoie

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    J'ai trouvé un truc, Quetzacoatl tu a raison quand tu dis que tant que le teste n'a rien,il rend 0.

    Pour évité qu'il transforme mon octet en 23450 je le transforme en un gros chiffre.

    donc voila le bricolage

    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
    int traduirBit_Ip (int bit)
    {
    	int bi1=0,bi2=0,bi3=0,bi4=0,bi5=0,bi6=0,bi7=0,bi8=0;//Si on entre le bit ici, la fonction va super
               bit-=100000000
    	bi8=(bit/10000000)%2;
    	bi7=(bit/1000000)%2;
    	bi6=(bit/100000)%2;
    	bi5=(bit/10000)%2;
    	bi4=(bit/1000)%2;
    	bi3=(bit/100)%2;
    	bi2=(bit/10)%2;
    	bi1=(bit/1)%2;
    	return bi8*128+bi7*64+bi6*32+bi5*16+bi4*8+bi3*4+bi2*2+bi1*1;//Calcule la valeur décimal (puissance de 2)
    }
    
    int main()
    {	int ip1=0, ip2=0, ip3=0, ip4=0;
    	int bit1=101010101, bit2=0, bit3=0, bit4=0;
    	int test=0;
               printf("Enter l'IP :  ");
    	scanf("%i %i %i %i", &ip1, &ip2, &ip3, &ip4);
    	testeur_ip(ip1);
    	testeur_ip(ip2);//Verifie si l'ip est entre 0 et 255
    	testeur_ip(ip3);
    	testeur_ip(ip4);
              ip1=traduirBit_Ip(bit1);
              ip2=traduirBit_Ip(bit2);
              ip3=traduirBit_Ip(bit3);
              ip4=traduirBit_Ip(bit4);
              printf("%i %i %i %i", ip1, ip2, ip3, ip4);
              system("pause");
              return 0;
    }
    il voit 1 million entré, est avant les calcules.. j'enlève le 1 million...

    Mon chiffre reste pareil, et sa marche

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Moa,

    Tu ne peux pas initialiser une valeur binaire directement comme tu le fais, C ne sait pas faire (les seules bases gérées directement sont décimal, hexadécimal et octal).

    Il faut créer une chaîne de caractères contenant la valeur que tu veux, et la décoder toi-même, ce qui est facile.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Ok droggo,

    la avec ma techinque bricollage sa marche, si tu a une meilleur solution, faudrait me donner la marche à suivre...

    Je suis un peu débutant

  13. #13
    Membre actif Avatar de quetzacoatl
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 168
    Points : 223
    Points
    223
    Par défaut
    En fait tu as deux solutions:
    -soit tu veux uniquement des valeurs binaires que toi tu fixes c'st-à-dire que tu mets explicitement dans ton code, comme l'exemple que tu as donné, par exemple 00101001, tu enlèves alors les zéros de gauche, soit monNombreBinaire=101001, et après tes calculs se dérouleront bien, puis tu utilises l'astuce des printf pour l'affichage
    -soit tu veux faire intéragir l'utilisateur, auquel cas tu fais un scanf("%s",mon TableauBinaire);et alors la tu as les bits directement:
    bi8=monTableauBinaire[0].....bi1=monTableauBinaire[7]

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2011
    Messages : 22
    Points : 12
    Points
    12
    Par défaut
    Oui je pensais bien qu'avec les tableaux sa serai plus simple ^^

    Mais je ne sais pas encore utiliser les tableaux ^^ En tout cas sa fonctionnent c'est le principal...

    Y a plus que continuer

    Merci

Discussions similaires

  1. [Toutes versions] Valeurs par défaut d'une liste commençant par zéro
    Par Damran dans le forum Access
    Réponses: 4
    Dernier message: 05/10/2013, 11h51
  2. Résultat commençant par un chiffre avec requête SELECT
    Par nicolas.pissard dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/04/2010, 13h31
  3. Stockage chiffre commençant par un zéro
    Par Daviloppeur dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/02/2010, 17h07
  4. [procédure stockée] table temporaire commençant par #???
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/04/2004, 12h23
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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