Langage C : problème dans une boucle
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

Langage C : problème dans une boucle



  1. #1
    invitedba13d1f

    Langage C : problème dans une boucle


    ------

    Bonjour,

    Voici un petit bout de code qui me pose problème :

    Code:
    int main()
    {
        int decalage ;
        char caractere ;
    
        caractere = -1 ;
    
        for (decalage=0; decalage<256; decalage++)
            {
                caractere ++ ;
    
                    if (caractere > 255)
                        {
                            caractere = caractere - 255 ;
                        }
    
                    else { ; }
    
                printf("decalage = %d et caractere = %c et code ASCII = %d \n",decalage, caractere, caractere) ;
            }
    
        getchar() ;
    
        return 0;
    De 0 à 127 il n'y a pas de problème ... mais à partir de decalage = 128, la valeur de caractere devient négative (de -127 pour finir à -1).

    Je ne comprend pas pourquoi la soustraction par 255 se fait avant que 'caractere' atteigne la valeur 255.

    Est-ce que quelqu'un sait pourquoi j'obtiens ce résultat ?

    Merci de votre aide.

    -----

  2. #2
    invitedba13d1f

    Re : Langage C : problème dans une boucle

    Mmmmhh ...
    J'ai fait des essais est il semblerait que le 8e bit pour un type char soit un bit de signe ('1' pour négatif et '0' pour positif).

    Quand j'assigne la valeur 128 à une variable char, elle prend en fait la valeur -127 !

    J'ai donc changé ma boucle en regardant si caractère est négatif et en lui additionnant alors 256 ... mais ça ne marche pas !
    C'est comme si je n'avais rien fait

    Au secours

  3. #3
    Flyingsquirrel

    Re : Langage C : problème dans une boucle

    Salut,
    Citation Envoyé par gizmo2937 Voir le message
    De 0 à 127 il n'y a pas de problème ... mais à partir de decalage = 128, la valeur de caractere devient négative (de -127 pour finir à -1).
    Parce que ton compilateur a l'air de considérer « char » comme « signed char » et ce type permet de coder des entiers allant de -127 à 127. Pas plus.
    Je ne comprend pas pourquoi la soustraction par 255 se fait avant que 'caractere' atteigne la valeur 255.
    En fait la condition pour que la soustraction ait lieu n'ai jamais vérifié. C'est mon compilateur qui le dit : « warning: comparison is always false due to limited range of data type »...

  4. #4
    zoup1

    Re : Langage C : problème dans une boucle

    Citation Envoyé par gizmo2937 Voir le message
    Mmmmhh ...
    J'ai fait des essais est il semblerait que le 8e bit pour un type char soit un bit de signe ('1' pour négatif et '0' pour positif).

    Quand j'assigne la valeur 128 à une variable char, elle prend en fait la valeur -127 !

    J'ai donc changé ma boucle en regardant si caractère est négatif et en lui additionnant alors 256 ... mais ça ne marche pas !
    C'est comme si je n'avais rien fait

    Au secours
    C'est le cas. Il faut que tu utilises des unsigned char pour avoir un truc compris entre 0 et 255.
    Si tu ajoutes 256 sur un objet 8 bits, c'est normal que cela ne change rien.

    http://www.commentcamarche.net/conte...p/cpptype.php3
    Je te donne une idée, tu me donnes une idée, nous avons chacun deux idées.

  5. A voir en vidéo sur Futura
  6. #5
    invitedba13d1f

    Re : Langage C : problème dans une boucle

    Merci à tous les deux !

    Effectivement en déclarant ma variable caractere en variable non signé ça va beaucoup mieux !

    Voilà le code corrigé :

    Code:
    int main()
    {
        int decalage ;
        unsigned char caractere = 0 ;
    
        for (decalage=0; decalage<256; decalage++)
            {
                
                printf("decalage = %d et caractere = %c et code ASCII = %d \n",decalage, caractere, caractere) ;
    
                caractere ++ ;
            }
    
        getchar() ;
    
        return 0;
    }
    Les caractères ne sont pas affichés par contre à partir de 128. J'imagine que c'est la console de CodeBlocks (l'IDE que j'utilise) qui ne les prend pas en charge. Les codes ASCII sont bons (de 0 à 255).

    Encore merci

  7. #6
    invitedba13d1f

    Re : Langage C : problème dans une boucle

    Je vous joins en pièce jointe la source réalisée grâce à vous

    Il s'agissait en fait de faire un programme pouvant décrypter un fichier (trouvé sur un site de challenge pour ceux qui connaissent)
    Le cryptage utilisé était très simple puisque c'était juste un code de César (simple décalage des caractères). L'alphabet utilisé était la table ASCII !

    Le programme n'est qu'une ébauche (je ne fais qu'un décalage vers la droite) mais m'a suffit pour décrypter mon fichier. Je le finirai un peu plus tard

    Voilà si ça peut servir à quelqu'un ! J'ai largement commenté le code pour que tout le monde puisse comprendre

    Merci à tous !
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. revenir en arriere d'une boucle (langage pascal)
    Par invite49b54ac2 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 12/02/2009, 13h46
  2. Problème dans une fonction en Langage C
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 05/05/2007, 00h25
  3. calculer et afficher le temps d'une boucle en langage C
    Par invitee5fedd72 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 18/02/2007, 21h12
  4. calcul de flux magnétique dans une boucle.
    Par invite6041df52 dans le forum Physique
    Réponses: 0
    Dernier message: 21/12/2006, 17h52
  5. Problème Langage C Sorte de Boucle
    Par invite3e43df7f dans le forum Logiciel - Software - Open Source
    Réponses: 19
    Dernier message: 18/01/2006, 21h17
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...