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 :

Quelques questions de débutants à propos d'un extrait de code


Sujet :

C

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2002
    Messages : 310
    Points : 204
    Points
    204
    Par défaut Quelques questions de débutants à propos d'un extrait de code
    Bonjour

    J'essaye de comprendre un programme écrit en c mais je bloque sur certaines lignes et j'ai pas trouvé de réponse dans les différents cours que j'ai parcouru.

    Voici un extrait du code avec en commentaire les lignes que j'aimerai comprendre :

    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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    //tableau d'entier avec chaque case initialisée à 0... ok
    unsigned table_1[20480] = {0};
     
    //chaine de caractère... ok
    unsigned char* table_2;
     
    //euh la... tableau de chaine de caractère? il manque * à coté de char donc je sais pas trop
    unsigned char dp[256000];
     
    //ici je suis pas sur : conversion en chaine de la case 0 du tableau ?
    table_2 = (unsigned char*) &table_1[0];
     
    //bon la... je le mets pour la suite du code
    t = 0;
     
    //ouverture d'un fichier
    ...
     
    //parcours du fichier
    while ( fgets ( &dp[0],  255, fp ) != NULL )
    {
    	//récupère la ligne lue... atoi s'occupe de convertir la ligne en integer
    	//pourquoi utiliser un indice t? Seule la case 0 d'un char * est accessible en écriture non?
    	table_2[t++] = (unsigned char) atoi (&dp[0]);
    }
     
    //fermeture du fichier
    fclose (fp);
     
    //???? Que fais cette ligne? L'indice t n'est même pas utilisé... 
    table_2 += 2048;

    Si une ame charitable pouvait me dépanner, ça pourrait me débloquer et m'apprendre quelques trucs
    Merci d'avance et désolé pour ces questions de gros débutant.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 290
    Points : 41 231
    Points
    41 231
    Par défaut
    1. Tableau de 20480 entiers non-signés initialisés à zéro.
    2. Pointeur vers unsigned char (entier non-signé de la taille d'un caractère). Non-initialisé, il ne pointe vers rien du tout.
    3. Tableau de 256000 unsigned char.
    4. On fait pointer table_2 sur le premier octet du premier entier de table_1: Le fait d'avoir deux pointeurs de types différents qui pointent au même endroit est appelé "aliasing" et n'est pas recommandé : il faut vraiment savoir ce qu'on fait, et ce n'est pas portable.
    5. Si ton compilo était bien configuré, la ligne sur le fgets() devrait afficher un warning: Elle demande un pointeur sur char, et on lui passe l'adresse du premier élément d'un tableau de unsigned char.
    6. Je ne comprends pas ta remarque "Seule la case 0 d'un char * est accessible en écriture". D'où sors-tu cela?
    7. On veut que table_2 pointe juste après le 2048e char. Peut-être parce que le fichier est censé contenir 2048 lignes? Une vérification de l'indice t serait à recommander...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    novembre 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : novembre 2002
    Messages : 310
    Points : 204
    Points
    204
    Par défaut
    C'est plus complexe que je le pensais Mais c'est déja moins confus pour moi

    Pour la 6), j'avais lu dans un cours qu'on ne pouvait modifier que la case 0 mais j'ai du mal comprendre le cours

    Donc si je comprends bien, la 6) modifie chaque octet du premier entier de table_1?

    Merci beaucoup en tout cas d'avoir pris le temps de m'aider

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 290
    Points : 41 231
    Points
    41 231
    Par défaut
    Citation Envoyé par Hell Voir le message
    Donc si je comprends bien, la 6) modifie chaque octet du premier entier de table_1?
    Puis chaque octet de l'entier suivant, etc, un octet par ligne du fichier.

    Évidemment, ce code n'aura pas le même comportement sur différentes plate-formes, à cause de facteurs comme la taille d'un entier (2, 4, 8 octets?) ou l'endianness (octet fort ou faible en premier?).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    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 727
    Points
    13 727
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while ( fgets ( &dp[0],  255, fp ) != NULL )
    {
    	//récupère la ligne lue... atoi s'occupe de convertir la ligne en integer
    	//pourquoi utiliser un indice t? Seule la case 0 d'un char * est accessible en écriture non?
    	table_2[t++] = (unsigned char) atoi (&dp[0]);
    }
    Médinoc:
    Évidemment, ce code n'aura pas le même comportement sur différentes plate-formes, à cause de facteurs comme la taille d'un entier (2, 4, 8 octets?) ou l'endianness (octet fort ou faible en premier?).
    L'endianness n'intervient pas ici. Le résultat dans le tableau ne dépend pas de la taille d'un int (ni de l'ordre de ses bytes), mais plutôt de celle d'un unsigned char
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 290
    Points : 41 231
    Points
    41 231
    Par défaut
    Le résultat dans table_2 ne dépend pas, etc.
    Le résultat dans table_1, si.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    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 727
    Points
    13 727
    Par défaut
    Ok, je n'avais pas compris quelle partie du code tu commentais
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Quelques questions de débutant
    Par s7even dans le forum C#
    Réponses: 3
    Dernier message: 07/12/2009, 08h47
  2. Réponses: 0
    Dernier message: 03/07/2008, 12h59
  3. Quelques questions de débutant
    Par stanley dans le forum Debian
    Réponses: 6
    Dernier message: 31/03/2008, 16h04
  4. question de débutant à propos de dotnet
    Par Kapha dans le forum Débuter
    Réponses: 1
    Dernier message: 08/08/2007, 19h53
  5. [MFC] Quelques questions de débutant...
    Par Sephi dans le forum MFC
    Réponses: 4
    Dernier message: 20/02/2004, 17h25

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