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 :

Que fait ce bout de code?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut Que fait ce bout de code?
    Bonjour,

    j'ai un code qui lit des images sans entête où chaque pixel est codé sur un caractère:
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    void lectimage(short sim[NBLIG][NBCOL], short nbl, short nbc)
    {
        short *p, i, j;
        long n, taille;
        char *q = NULL, *buf = NULL;
        FILE *fich = NULL;
        char nom[40] = { '\0' };
    
    
        printf("Nom du fichier image : ");
        fgets(nom,39,stdin);
        * strchr(nom,'\n') = '\0'; 
        fprintf(stdout,"Nom entre '%s'\n",nom);
        fich = fopen(nom,"r");
        if (fich == 0)
        {
            printf(" ERREUR: fichier non existant\n");
            exit(1);
        }
        taille = nbl * nbc;
    
        q = buf = malloc(taille * sizeof(char));
        if (!q)
        {
            printf(" ERREUR: la fonction malloc() ne peut plus allouer de l'espace:\n");
            fclose(fich);
            exit(1);
        }
        n = fread(q, sizeof(char), taille, fich);
    
        printf(" valeur retournée par le fread est %d\n", n);
        if (n - taille)
        {
            printf(" ERREUR: le nombre d'elements lus est incompatible\n");
            free(q);
            fclose(fich);
            exit(1);
        }
    
    //Que fait ce bout de code? 
      for (q = buf, i = 0; i < nbl; i++)
            {
                for (p = &sim[i][0], j = 0;  j < nbc; j++, q++, p++)
                {
                    *p = *q & 0x00ff;
                }
            }
    
        free(buf);
        fclose(fich);
    
    }
    je ne comprends le bout de code en rouge, est ce que vous avez une idée dessus?

    Merci.

  2. #2
    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
    Si je ne m'abuse, il applique le masque 0x00ff à chaque élément de q (en fait un ""alias"" pour buf) et copie le résultat dans p (en fait ""alias"" pour le tableau sim).

  3. #3
    Membre éclairé Avatar de aslo92
    Homme Profil pro
    Ingénieur développement logiciels temps réel
    Inscrit en
    Février 2012
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels temps réel
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2012
    Messages : 43
    Par défaut
    Bonjour,

    je suppose que ce code converti le contenu d'un fichier contenant des caractères codés sur 8 bits (char) en caractères unicode sur 16 bits (short).

    A+

  4. #4
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Merci pour vos réponses, aslo92 et Bktero


    j'ai encore quelques soucis de compréhension

    en reliant vos commentaire, je comprends bien qu'un masque est appliqué sur les valeurs de q pour les remplir en short, cependant j'ai toujours du mal à saisir l'itération de la boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (q = buf, i = 0; i < nbl; i++)
            {
                for (p = &sim[i][0], j = 0;  j < nbc; j++, q++, p++)
    Merci

  5. #5
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    781
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 781
    Par défaut
    Bonsoir,

    J'imagine que q est une image de nbl lignes, chacune composée de nbc pixels (ou colonnes).

    Donc, comme l'a dit azlo92, cela applique un masque à chaque pixel (colonne) d'une ligne de l'image (q est l'image) , et ce sur toutes les lignes, et range le résultat dans le tableau sym (ou p, qui comme l'a dit Bktero, est son alias).

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 118
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Le principe général de cette double boucle, c'est de copier un tableau deux dimensions d'octets (1 byte) (buf) dans un tableau de deux dimensions de short (2 bytes) (sim).
    Pour ce faire, nous devons parcourir les deux tableaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (q = buf, i = 0; i < nbl; i++)
    q est initialisé sur la première case du tableau buf.
    i est un compteur de ligne.
    Ce for fait un parcours des lignes du tableau.

    Pour faire le parcours de buf (ou q), il suffit d'incrémenter q++. N'oubliez pas que même un tableau 2D peut être parcouru comme un tableau 1D. C'est pour cela qu'une boucle de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ( int i = 0 ; i < nbl * nbc ; i++ )
    Permet le parcours de tous les pixels.

    Sauf que dans ce cas là, ce n'est pas un simple 'i' qui est incrémenté mais le pointeur qui est déplacé (imaginez une flèche sur un tableau, qui se déplace) q++.

    La deuxième boucle, qui parcoura tous les pixels de la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (p = &sim[i][0], j = 0;  j < nbc; j++, q++, p++)
    Utilise le même principe de déplacement de pointeur pour p. P est initialisé au début de la ligne et sera déplacé sur toute la ligne.

    L'arithmétique des pointeurs permet que pour un pointeur sur un char, l'opération pointeur++ le déplace d'un octet. Si le pointeur pointeur sur un short, l'opération pointeur++ le déplace de deux octets. (Bon, c'était juste un rappel).

    Finalement, si je ne me trompe pas, ce code est bizarrement illisible. On pouvait l'écrire de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i = 0;
    p = buf;
    q = sim;
    for ( i = 0 ; i < nbl * nbc ; i++, p++, q++ )
    {
         *p = *q & 0x00ff;
    }
    Pour la version 1D.

    Pour la version 2D :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int c = 0;
    int l = 0;
    for ( l = 0 ; l < nbl ; l++ )
    {
        for ( c = 0 ; c < nbc ; c++ )
        {
             sim[l][c] = buf[l * nbc + c] & 0x00ff;
        }
    }
    Bon, la seconde version, il serait même avantageant de caster buf en char** pour avoir un accès 2D.

    Voilà, j'espère que cela est plus clair.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre éclairé Avatar de SmileSoft
    Inscrit en
    Mars 2008
    Messages
    436
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 436
    Par défaut
    Bonjour,

    Merci beaucoup LittleWhite pour cette belle explication, je comprends très bien

    j'ai une autre question pour le code d'écriture correspondant qui suit:
    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
    void ecritimage(short sim[NBLIG][NBCOL], short nbl, short nbc)
    
    {
        short *p, i, j;
        long taille;
        char *q = NULL, *buf = NULL;
        FILE *fich = NULL;
        char nom[40] = { '\0' };
    
        printf("Nom du fichier image : ");
        fgets(nom,39,stdin);
        * strchr(nom,'\n') = '\0';
        fprintf(stdout,"Nom entre '%s'\n",nom);
    
        fich = fopen(nom,"w");
        taille = nbl * nbc;
    
        q = buf = malloc(taille);
        if (!(q))
        {
            printf("ERREUR: la fonction malloc() ne peut plus allouer de l'espace:\n");
            exit(1);
        }
    
    for (i = 0; i < nbl; i++)
         for (p = &sim[i][0], j = 0; j < nbc; j++, q++, p++) *q = *p;
    
        fwrite(buf, sizeof(char), taille, fich);
        fclose(fich);
    }
    la copie inverse s'effectue juste avant l'écriture dans le fichier "bout de code en rouge" q pointe sur un char (byte) alors que p pointe sur un short (2Bytes), est ce que cette affectation est possible?

Discussions similaires

  1. Que fait cette ligne de code
    Par netsupra dans le forum jQuery
    Réponses: 2
    Dernier message: 06/05/2014, 11h57
  2. Que faites-vous quand votre code refuse obstinément de fonctionner ?
    Par Gordon Fowler dans le forum Actualités
    Réponses: 89
    Dernier message: 28/01/2010, 16h11
  3. Que fait cette ligne de code svp ?
    Par selmani300 dans le forum C++
    Réponses: 34
    Dernier message: 24/03/2009, 21h53
  4. Que fait cette ligne de code ?
    Par ANOVA dans le forum MATLAB
    Réponses: 9
    Dernier message: 17/07/2008, 09h20
  5. que fait ce code (et surtout pourquoi??)
    Par elekis dans le forum C++
    Réponses: 3
    Dernier message: 13/09/2005, 10h47

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