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 :

Variable de type octet


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut Variable de type octet
    Bonsoir !

    dans le langage C,comment faire pour déclarer une variable de type octet?

  2. #2
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Bonsoir, un octet ou byte est un "char".
    Il représente bien 8bits modifiables, même s'il est souvent plus lourd en mémoire.

  3. #3
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 733
    Par défaut
    Bonsoir.

    Un octet n'est pas un type, mais une taille (8 bits).
    La norme C garantit que le type char a une taille exact d'un byte en mémoire (soit un octet dans la grande majorité des appareils), c'est donc de ce type dont tu as besoin.
    Tu peux l'utiliser tel quel, ou créer un synonyme typedef unsigned char Octet;
    Citation Envoyé par SkyZoThreaD Voir le message
    même s'il est souvent plus lourd en mémoire.
    Non, un octet a une taille fixe. Peut-être tu confonds avec un pointeur sur char dont la taille varie avec l'allocation dynamique ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    Citation Envoyé par Daïmanu Voir le message
    Bonsoir.

    Un octet n'est pas un type, mais une taille (8 bits).
    La norme C garantit que le type char a une taille exact d'un byte en mémoire (soit un octet dans la grande majorité des appareils), c'est donc de ce type dont tu as besoin.
    Tu peux l'utiliser tel quel, ou créer un synonyme typedef unsigned char Octet;
    Non, un octet a une taille fixe. Peut-être tu confonds avec un pointeur sur char dont la taille varie avec l'allocation dynamique ?

    quand je met char mon programme plante !,calcul de 'b' à la puissance 'n' ,n et b doivent être de type octet,puis d'afficher le résultat en représentation binaire.
    voici mon programme
    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
    #include<stdlib.h>
    #include<stdio.h>
    int main()
    {
    	//calcul de 'b' à la puissance 'n'//
    	char x,b,n;
    	printf("entrer votre nombre ");
    	scanf("%c",&b);
    	printf("saisir la puissance ");
    	scanf("%c",&x);
    	for(n=0;n<=x;n++)
    	{
    	   	n=b*b;
     
    	}
    	printf("le resultat est %c",b);
     
    }

  5. #5
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 733
    Par défaut
    Bonsoir.

    Il y a plusieurs problèmes :
    n est déclaré mais n'est pas initialisé. Il peut avoir comme valeur tout et n’importe quoi.
    Actuellement tu mets systématiquement le carré de b dans n. Le calcul dans la boucle est n=n*b.
    À la fin, tu affiches b, mais c'est n que tu dois afficher.

    Attention aussi, tu utilises des char, mais ils ne font « que » un octet, tu auras des problèmes quand le résultat de l'opération dépassera son seuil maximum (ici 255 127). Tu devrais mettre un entier de capacité plus importante pour la variable n (comme un int).

    Par ailleurs, ce forum propose un mécanisme pour afficher du code (le bouton # dans l'éditeur), je t'invite à l'utiliser pour plus de lisibilité.

    Edit: Correction du seuil maximal.

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    255 ? Comme souvent char est signé, tu ne dépasseras même pas 127 Il faudrait utiliser des unsigned char plutôt et mettre le résultat dans un type plus grand, comme unsigned int.

    Un autre problème est que le formateur %c de printf() est fait pour afficher un caractère et non un nombre.

    Voici un code exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <math.h>
    #include <stdio.h>
    int main(void)
    {
        unsigned char number = 2;
        unsigned char power = 4;
        unsigned int result = pow(2, 4);
     
        printf("%c ^ %c = %c\n", number, power, result);
        printf("%d ^ %d = %d\n", number, power, result);
    }
    J'obtiens l'affichage suivant sous Windows :
    ☻ ^ ♦ = ►
    2 ^ 4 = 16
    
    Process returned 0 (0x0)   execution time : 0.040 s
    Press any key to continue.
    

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    voici le programme à nouveau;il me laisse pas saisir la puissance,il affiche direct "votre résultat est 0"


    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
    #include<stdio.h>
    #include<stdlib.h>
    int main(void)
    {
    unsigned	char b,n=0;
    unsigned    int p=1;
    	printf("entrer votre nombre");
    	scanf("%c",&b);
    	printf("saisir la puissance\n");
    	scanf("%c",&p);
    	for(n=0;n<=p;n++)
    	{
    	p=p*b;
    	}
    	printf("votre resultat est %d",p);	
    }

  8. #8
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par Daïmanu Voir le message
    n est déclaré mais n'est pas initialisé. Il peut avoir comme valeur tout et n’importe quoi.
    Si si, n est bien initialisé, dans la première étape de la boucle for. Pas de soucis ici.


    il me laisse pas saisir la puissance,il affiche direct "votre résultat est 0"
    Hum, mais que saisis-tu donc ? N'aurais-tu pas un soucis avec une mauvaise utilisation de scanf, qui doit être réservée à la lecture d'entrée Formatées ?

    [Spoiler]
    Lorsque tu saisis "4 entrée", tu as 2 caractères dans le buffer d'entrée : 4 et '\n'. Donc tu mets 4 dans b, et '\n' dans p, comme le montre ce programme :
    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
     
    #include<stdio.h>
    #include<stdlib.h>
    int main(void)
    {
      unsigned  char b,n=0;
      unsigned    int p=1;
      printf("entrer votre nombre");
      scanf("%c",&b);
      printf("saisir la puissance\n");
      scanf("%c",&p);
      printf ("Surprise : p vaut [%c]\n", p);
     
      for(n=0;n<=p;n++)
      {
        p=p*b;
      }
      printf("votre resultat est %d",p);
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    quand je déclare b et n comme des entier 'int' ça marche bien,mais lorsque je déclare b et n comme des char 'char' alors là ou y'a le problème.

  10. #10
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 204
    Par défaut
    Avec scanf %c lit des chars et %d des int, multiplier des chars n'a pas de sens

    et plutôt que de faire :

    fait plutôt :

    mais comme pow retourne un double (nombre à virgule flotante double précision) il faut faire
    Un int tient sur 2 octets sur les CPU 16 bits et 4 octets sur les CPU 32 bits ( c'est le mot machine, je ne sais pas si c'est 89 octets sur CPU 64 bits).

    J'ai déjà vu un type tinyint tenant sur un octet sur des compilateurs (mais il y a longtemps genre borland ) mais je je sais pas si c'est normalisé. En tout cas mon gcc le refuse. Il y peut-être une option le permettant, il y en a tellement.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    je vois que c'est impossible de déclarer des variables de types octets pour faire des opérations mathématiques,

  12. #12
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Il y a une légère incompréhension de votre part.
    Chaque langage de programmation (ici le cas du langage C) et définit des types de variables et une taille mémoire de stockage qui leur sont associée et ses types sont [B]uniquement utilisés par votre compilateur [/B]( ici compilateur du langage C) ce qui veut dire que c'est le compilateur qui dit au processeur comment traiter la variable . Exemple : si vous mettez une donnée en mémoire de façon crue, il n'y a alors aucune information sur son type et donc le processeur ne saura pas comment manipuler cette donnée.

    Citation Envoyé par Elmatphy Voir le message
    je vois que c'est impossible de déclarer des variables de types octets pour faire des opérations mathématiques,
    Ici vous confondez taille mémoire du type et type de données. Pour effectuer des opérations mathématiques, le langage C met à votre disposition des types exemple int, float etc. Et ces types se distinguent par leur taille de stockage mémoire (en octets) et donc peuvent stocker des valeurs comprises entre deux bornes ( valeur mini & valeur max exemple un char a une borne de -128 à 127 ) de plus ces différents types peuvent être spécifiés comme non signé ou signé (valeur positive ou pas) .
    Mais attention, ces types et leur tailles dépendent du compilateur et la norme ne spécifie rien quant à leur taille, la représentation des nombres signés et l'ordre des octets en mémoire qui dépend de l'architecture PC.

    Citation Envoyé par Elmatphy Voir le message
    quand je met char mon programme plante !,calcul de 'b' à la puissance 'n' ,n et b doivent être de type octet,puis d'afficher le résultat en représentation binaire.
    voici mon programme
    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
    #include<stdlib.h>
    #include<stdio.h>
    int main()
    {
    	//calcul de 'b' à la puissance 'n'//
    	char x,b,n;
    	printf("entrer votre nombre ");
    	scanf("%c",&b);
    	printf("saisir la puissance ");
    	scanf("%c",&x);
    	for(n=0;n<=x;n++)
    	{
    	   	n=b*b;
     
    	}
    	printf("le resultat est %c",b);
     
    }
    Pour réaliser votre exemple il faut avant tout choisir le type de votre variable (en fonction de la taille mémoire du résultat voulu) afin d'effectuer vos opérations donc, pas de type octet mais bien un type entier (pour l'exemple et qui a une taille mémoire de 2 octets) ce qui donnerait le code ci-dessous (qui est à revoir) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int f_puiss( int x, int y ){
    	return( ( (0) == y ) ? 1: x * f_puiss( x, y-1 ) );
    }
     
    int main( void ){
     
    	int  x , y;
    	x = y = 0;
    	scanf("%d", &x );
    	scanf("%d", &y );
    	printf("résulat %d\n", f_puiss(x,y) );
    	return(EXIT_SUCCESS ); 
    }

    Pour afficher en binaire voici les instructions écrites par un responsable du forum "Obsidian" ici (désolé de faire un copié-collé car je n'ai pas sollicité l'accord de Obsidian pour son code)

    Citation Envoyé par Elmatphy Voir le message
    Bonsoir ! dans le langage C,comment faire pour déclarer une variable de type octet?
    Dans le langage C il n'existe pas de type octet mais des types dont l'espace mémoire de stockage est en octet. Mais il vous est cependant possible de définir un autre type à partir des types existant du langage C afin d'avoir un espace de mémoire souhaité représentant les octets que souhaitez comme ce qui vous à été proposer dans les précédent poste octet représentera de façon indirecte 1 octet donc octet == char.

    à bientôt

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Elmatphy Voir le message
    je vois que c'est impossible de déclarer des variables de types octets pour faire des opérations mathématiques,
    Je vois surtout que tu n'arrives pas, ou alors tu n'essayes pas, d'analyser les problèmes et de les comprendre.

    Commence déjà par mettre scanf() de côté. Cette fonction est un nid à un problèmes quand on ne sait bien pas s'en servir. C'est marrant de faire des programmes qui demandent des trucs, mais il ne faut pas que cela gène l'écriture du reste du programme. Tant que tu n'arrives pas à faire fonctionner et à comprendre un code comme le mien, sans scanf(), n'utilise pas cette fonction. Comme le dit gangsoleil, c'est pour des entrées formatées, ce qu'une saisie au clavier n'est que trop peu souvent.

    On pourrait malheureusement presque dire la même chose de printf(). Comprend bien que %d ne veut pas dire que tu vas afficher un int mais un entier, qui peut être int, short ou char. %c est fait pour afficher un caractère donc en toute logique un char.

    Ensuite, soit je suis fatigué, soit ta boucle est ni fait ni à faire. Regarde ce que tu as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	printf("entrer votre nombre");
    	scanf("%c",&b);
    	printf("saisir la puissance\n");
    	scanf("%c",&p);
    	for(n=0;n<=p;n++)
    	{
    	p=p*b;
    	}
    	printf("votre resultat est %d",p);
    Ton nombre est b, ta puissance est p, ton résultat est n, et tu écris p=p*b;. Je crois que ton algorithme n'est clair en français et que tes noms variables ne le sont pas non plus. Et tu t'embrouilles... Regarde comme j'ai nommé mes variables et fais pareil si tu n'arrives pas distinguer n de b de p !

    Au-delà de ces problèmes d'algorithmie et d'utiliser de scanf/printf, il reste le gros problème exposé par sambia39. Il faut comprendre comment les types sont faits en C. Un type correspond à un nombre de bits en mémoire. Il faut comprendre que cela implique que dans un type donné, tu ne peux stocker que des valeurs comprises entre 2 bornes, dépendantes du nombre de type pour ce type et de la façon de coder les valeurs sur ces bits. Généralement, c'est du complément à 2 pour les entiers. Il faut aussi savoir que le C ne propose pas de type étant un octet exactement et encore moins s'appelant comme ça. En revanche, sur l'immense majorité des architectures et des compilateurs, un char sera un octet, souvent signé. Tu peux expliciter cela en rajoutant une des deux modificateurs signed et unsigned. Notons au passage que la norme définit deux types optionnels mais souvent disponibles et très intéressants dans ton cas : int8_t et uint8_t.

    Il faut aussi savoir que ton compilateur va "tronquer" la valeur (on appelle cela un overflow) quand tu essayes de mettre une valeur trop grande dans un type. Par exemple, ce code :
    En le compilant avec MinGW sur Windows 7, j'obtiens un warning :
    main.c|140|warning: overflow in implicit constant conversion [-Woverflow]|
    En effet, 130 ne peut pas être représenté sur 8 bits. Ici, c'est dit clairement mais si tu ajoutes 2 nombres, que la somme fait 130 et tu mets le résultat dans un char, cela sera fait de manière silencieuse à l'exécution.

    Citation Envoyé par Elmatphy Voir le message
    je vois que c'est impossible de déclarer des variables de types octets pour faire des opérations mathématiques,
    Donc, si, c'est tout à fait possible, ;la preuve, je l'ai fait. Il faut juste comprendre qu'utiliser des variables de taille 1 octet limitera la plage des calculs possibles et tu auras des résultats aberrants si tu sors de cette plage !



    --------------------

    Pour afficher en binaire voici les instructions écrites par un responsable du forum "Obsidian" ici (désolé de faire un copié-collé car je n'ai pas sollicité l'accord de Obsidian pour son code)
    T'inquiète, tu as quand même le droit de citer un message

    Un int tient sur 2 octets sur les CPU 16 bits et 4 octets sur les CPU 32 bits ( c'est le mot machine, je ne sais pas si c'est 89 octets sur CPU 64 bits).

    J'ai déjà vu un type tinyint tenant sur un octet sur des compilateurs (mais il y a longtemps genre borland ) mais je je sais pas si c'est normalisé. En tout cas mon gcc le refuse. Il y peut-être une option le permettant, il y en a tellement.
    C'est généralement le cas ; sur 64 bits, je présume que tu veux dire 8 octets (le 9 doit venir d'un doigt un peu pressé ). Je ne sais plus comment c'est sous mon Mac 64 bits (que je n'ai pas sous la main en ce moment) mais encore une fois : tu n'as aucune garantie par la norme, cela dépend de la cible et du compilateur.

    Ce type ne me semble pas du tout normalisé, en effet


  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    après quelque recherche et grâce à vos réponses,je pense que j'ai trouvé la solution;c'est faire une conversion implicite de type char vers le type entier,
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    int main(void)
    {
    	char b,n;
    	int D,H,resultat;
    	printf("entrer votre nombre");
    	scanf("%d",&b);
    	D=b;
    	printf("saisir la puissance");
    	scanf("%d",&n);
    	H=n;
    	resultat=pow(D,H);
    	printf("%d a la puissance %d est: \n%d",D,H,resultat);
     
    	return 0;
    }
    à vous de me vérifier,mais j'ai encore des soucis pour la réalisation d'un algo sans la fonction pow;c'est-à-dire avec une boucle for,j'entre toujours dans une boucle infini.

  15. #15
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par Elmatphy Voir le message
    après quelque recherche et grâce à vos réponses,je pense que j'ai trouvé la solution;c'est faire une conversion implicite de type char vers le type entier,
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    int main(void)
    {
    	char b,n;
    	int D,H,resultat;
    	printf("entrer votre nombre");
    	scanf("%d",&b);
    	D=b;
    	printf("saisir la puissance");
    	scanf("%d",&n);
    	H=n;
    	resultat=pow(D,H);
    	printf("%d a la puissance %d est: \n%d",D,H,resultat);
     
    	return 0;
    }
    à vous de me vérifier,mais j'ai encore des soucis pour la réalisation d'un algo sans la fonction pow;c'est-à-dire avec une boucle for,j'entre toujours dans une boucle infini.
    Certes que vous avez trouvé une solution à votre problème mais est-ce que vous vous êtes poser la question pour savoir s'il est vraiment nécessaire de faire une conversion implicite de type char vers le type entier ?, serait-il pas plus simple d'utiliser le type entier tout simplement ?
    exemple:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main( void ){
     
    	int x = 10; 	/* X est un entier et vaut 10 */
    	int y = 10;    /* Y est un entier et vaut 10*/
     
    	x = x + y;
    	printf( " x+y =\t%d\n", x );
    	x = y = 0;
    	return( EXIT_SUCCESS );
    }
    Citation Envoyé par Elmatphy Voir le message
    à vous de me vérifier, mais j'ai encore des soucis pour la réalisation d'un algo sans la fonction pow;c'est-à-dire avec une boucle for,j'entre toujours dans une boucle infini.
    Ce n'est pas à nous de vérifier votre code c'est à vous de le faire vous devez vous dire est ce que les instructions que j'ai écrites sont-elles correcte et que cela correspond aux règles d'écriture du code en langage C ? quant à votre algorithme il fait exactement ce que vous avez écrit pas ce que vous vouliez qu'il fasse donc tout à revoir et si vous être dans une boucle infinie, c'est parce que votre condition de sortie de boucle est absente ou n'est pas atteinte pour vous aider voici deux variantes de la fonction puissance l'une utilise des boucles l'autre une récursivité.
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*	recursive	*/
    int f_puiss_a( int x, int y ){
    	return( ( (0) == y ) ? 1: x * f_puiss( x, y-1 ) );
    }
     
    /* boucle	*/
    int puiss_b( int x, int y ){
     
    	int z = 1;
    	for( z = 1; y > 0; --y )
    		z = (z * x);
    	return ( z );
    }
    Pour ma part je vous conseille ce manuel le langage C en 20 heure qui vous sera fort utile.
    à bientôt

  16. #16
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 204
    Par défaut
    après quelque recherche et grâce à vos réponses,je pense que j'ai trouvé la solution;c'est faire une conversion implicite de type char vers le type entier,
    Ce n'est pas une bonne méthode, travailler avec un type caractère pour faire des traitements d'entiers, tu ne peux aller que vers des problèmes.

    @Bktero :
    (le 9 doit venir d'un doigt un peu pressé )
    , oui j'ai glissé chef ...

    les normes C89, C99 etc.. ne normalisent t'elles pas la taille des entiers ? (je ne sais pas) ce qui permettrait d'avoir une taille sure en forçant l'utilisation de la norme avec le compilateur. Je sais que c'est minimum 2 octets. Sinon si on veut être sur de la taille, on peut la déduire avec INT_MAX ce qui permet une abstraction de l'environnement avec un peu de code. ( là c'est surtout utilise pour la taille des entiers que pour le nbre d'octets occupés - mais évidemment lien de cause à effet).
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  17. #17
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    La norme normalise plusieurs propriétés des types:

    Une plage minimale de valeurs acceptables pour chaque type.
    Ainsi un char doit pouvoir représenter les valeurs ASCII ([0 .. 127]).

    La taille de chaque type est multiple de la taille du char, qui est exactement un byte (qui n'est pas forcément un octet)

    Une contrainte entre les tailles des types, dont voici un extrait:
    1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
    et sizeof(float) <= sizeof(double)

    Parmi le pire qu'il puisse arriver, il y a un byte de 64bits sur un processeur 64bits, provoquant sizeof(char) = 1 = sizeof(long long) = sizeof(short)

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    les normes C89, C99 etc.. ne normalisent t'elles pas la taille des entiers ? (je ne sais pas) ce qui permettrait d'avoir une taille sure en forçant l'utilisation de la norme avec le compilateur. Je sais que c'est minimum 2 octets. Sinon si on veut être sur de la taille, on peut la déduire avec INT_MAX ce qui permet une abstraction de l'environnement avec un peu de code. ( là c'est surtout utilise pour la taille des entiers que pour le nbre d'octets occupés - mais évidemment lien de cause à effet).
    leternel m'a devancé. La norme garantie une taille minimale, mais pas une taille fixe.

    Normalement, tu ne devrais pas avoir besoin d'être sûr de la taille réelle, juste de la taille minimale qu'il te faut. Si tu veux stocker des nombres entre 0 et 50.000, alors un short te conviendra toujours et c'est (presque) tout ce que tu as besoin de savoir.

    Si tu veux une taille exacte, tu peux utiliser les types optionnels telles que int16_t, uint16_t, etc. Si un jour par hasard tu te retrouves sur un compilateur qui ne les supportent pas, il sera toujours tant de faire un typedef vers un type existant (et souhaiter qu'il existe un type compatible).

    Pour tous ceux qui sont intéressés, la norme du C99 est disponible ici : http://www.developpez.net/forums/d49...tez-norme-c99/
    C'est un gros PDF indigeste au début, mais on finit par l'aimer. Je me suis calmé cette année, mais avant je me retrouvais souvent à faire de la randonnée à travers ses sentiers tortueux pour répondre sur Developpez

    Pour les types optionnels et les rangs de valeurs pour chaque type, voir la section 7.18.

  19. #19
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 204
    Par défaut
    leternel m'a devancé. La norme garantie une taille minimale, mais pas une taille fixe.
    C'est bien ce qui me semblait.

    Et si j'ai besoin de connaitre la taille max possible de mon entier je ferais un MAX_INT.

    Donc on peut dire au gars : impossible d'avoir un entier sur 1 octet sans bidouiller avec un char ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  20. #20
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2015
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 7
    Par défaut
    le problème est résolu,reste l'affichage en binaire ,sambia39 j'ai pas compris comment le responsable du forum a fait,j'ai quelque idée,mais j'ai encore du mal a les relier,(c'est d'utiliser >>,& et 1 + une boucle)ou d'utiliser un tableaux, pour la première méthode j'ai pas compris comment un opérateur ">>" qui permet de décaler un nombre n de bit de parcourir un octet et d'afficher chaque bit.

Discussions similaires

  1. Accéder aux octets d'une variable de type Extended
    Par yupyupxav dans le forum Débuter
    Réponses: 5
    Dernier message: 17/12/2014, 10h17
  2. Ajouter a une variable de type string, un entier
    Par Little-Freud dans le forum SL & STL
    Réponses: 12
    Dernier message: 05/03/2005, 19h33
  3. [VB.NET] Variable de type enum avec du string
    Par Mouse dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/01/2005, 18h22
  4. Oracle 9i : PLSQL - Variable de type LONG
    Par vortex dans le forum PL/SQL
    Réponses: 8
    Dernier message: 16/11/2004, 13h23
  5. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59

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