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 :

Accès a une tableau de structure dans un tableau de structure


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Accès a une tableau de structure dans un tableau de structure
    Bonjour je dois réaliser un projet en C qui est un optimiseur de css. Pour cela j'utilise 2 structures mais je rencontre des problèmes pour y avoir accès .

    Voici mes structures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct t_list{
    char key[200];  // contenue ex : Background color ect...
    char value[200];  // valeur ex : 100% blue right ect...
    int length; // taille
    }list_kv;
     
    typedef struct regle {
    char name[200];  // balise ex : p,H1,H2...
    list_kv kv[200];  // cf : list_kv
    int length; // taille
    }list_bloc;

    Ensuite je crée un tableau de structure comme ceci :
    list_bloc list[200] ;

    Mais je n'arrive pas a avoir acces au champ Key et value de cette structure. j'ai essayé de plusieurs façon avec des mallocs pour alloué dynamiquement et du coup je remplacait les champ par des pointeurs mais je n'y arrive pas. j'ai essaye ceci :
    list[0].kv[0].key[0] = 'A';

    Mais en vain .. je suis debutant excusez moi si ceci est pourtant basique en C.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Cet exemple minimal compile et s'exécute sans reproduire l'erreur.
    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
    typedef struct t_list{
    	char key[200]; // contenue ex : Background color ect...
    	char value[200]; // valeur ex : 100% blue right ect...
    	int length; // taille
    }list_kv;
     
    typedef struct regle {
    	char name[200]; // balise ex : p,H1,H2...
    	list_kv kv[200]; // cf : list_kv
    	int length; // taille
    }list_bloc;
     
     
    //Ensuite je crée un tableau de structure comme ceci :
    list_bloc list[200] ;
     
    int main(void)
    {
    	list[0].kv[0].key[0] = 'A';
    	return 0;
    }

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Cela doit être du a ma fonction alors la voici :

    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
     
     
    void list_store(list_bloc* list)
    {
        FILE* fichier = NULL;
        fichier = fopen("myCss1.css", "r+");
    	int caractereActuel =0;
    	char buffer[200] = {0};
    	int i=0;
    	int j=0;
    	int k=0;
        int compteur=0;
     
            do
            {
                caractereActuel = fgetc(fichier); // On lit le caractère
               // printf("%c", caractereActuel); // On l'affiche
                buffer[i] = caractereActuel;
     
                if(buffer[i] == '{')
                {
                   for(k=0;k<i;k++)
                    {
                         list[compteur].name[k] = buffer[k];
                    }
                    list[compteur].name[k] = '\0';
                    list[compteur].length= k;
                    compteur++;
                }
     
                if(buffer[i] == ':')
                {
                         list[0].kv[0].key[0] = buffer[0];
                }
     
     
                if (buffer[i] == '}')
                {
                    i=-2;
                }
                i++;
            } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    }
    et voici le fichier css que je lis :

    Code CSS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    h1 {
    font-size : 12px
    color : blue
    }
    div {
    margin:5px ;
    }
    p {
    line-height:150%
    font-size: 18px
    margin:5px ;
    }

  4. #4
    Invité
    Invité(e)
    Par défaut
    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if (buffer[i] == '}')
                {
                    i=-2;
                }
    Cela ne serait pas plutôt i-=2; par hasard ?
    Si ce n'est pas ça, il y a clairement un problème. Tu assignes à ton indice -2, alors qu'il est censé commencé à 0, d'où le segmentation fault.

    Aussi, pour la boucle, tu utilises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            do
            {
                caractereActuel = fgetc(fichier); // On lit le caractère
                .....
            } while (caractereActuel != EOF); // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
    }
    Le soucis avec ceci, c'est que tu lit le caractère, fait toutes tes opérations dessus, et seulement après tu vérifies si il est End Of File.
    Dans l'idée, il faut plutôt le tester avant, avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while ((caractereActuel = fgetc(fichier)) != EOF){ // On continue tant que fgetc n'a pas retourné EOF (fin de fichier)
                 ....
            }
    Ainsi, à chaque tour de boucle, tu assignes à caractereActuel la valeur du fgetc(), et vérifie si celui-ci n'est pas EOF. A partir de là, tu peux faire ton traitement avec plus de sûreté.

    Concernant la succession de if, tu peux faire plus simple et plus lisible, en utilisant la structure switch.

    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
                switch(buffer[i]){
                    case '{':
                        for(k=0;k<i;k++)
                        {
                            printf("%d Test %d\n",i,k);
                             list[compteur].name[k] = buffer[k];
                        }
                        printf("ici ?\n");
                        list[compteur].name[k] = '\0';
                        list[compteur].length= k;
                        compteur++;
     
                        break;
     
                    case ':':
                        list[0].kv[0].key[0] = buffer[0];
                        break;
     
                    case '}':
                        i-=2;
                        break;
                }
    Plus lisible, à mon sens.

    Au passage, aussi, au niveau des "bonnes pratiques", pense à toujours vérifié si le pointeur de FILE renvoyé par fopen n'est pas NULL, cela évite de planter ton programme si il n'arrive pas à l'ouvrir.
    Dernière modification par Invité ; 14/11/2014 à 21h05.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    archMqx je te remercie de ta réponse. j'optimiserais le code comme tu me la conseillé. Mais le probleme est que lorsque que j'écris ceci dans ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct t_list{
    char key[200]; // contenue ex : Background color ect...
    char value[200]; // valeur ex : 100% blue right ect...
    }list_kv;
    typedef struct regle {
    char name[200]; // balise ex : p,H1,H2...
    list_kv kv[200]; //  <-------- CETTE INSTRUCTION
    int length; // taille
    int max; // taille max
    }list_bloc;
    Pour le i = -2 c'est parceque a partir du 2e tour de boucle j'ai 'h' et '\n' qui se rajoute dans mon tableau name[].
    Cela compile mais mon .exe s'arrete de fonctionné et ne fait aucune instruction des que je declare list_kv kv[200]. je ne comprend pas pourquoi et le compilateur ne me met aucune erreur

  6. #6
    Membre actif

    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 87
    Points : 217
    Points
    217
    Par défaut
    Bonjour Mounko,

    Citation Envoyé par Mounko Voir le message
    Pour le i = -2 c'est parceque a partir du 2e tour de boucle j'ai 'h' et '\n' qui se rajoute dans mon tableau name[].
    j'ai essayé d’exécuter ton code et ça plante pas en accédant au données, mais comme l'a déjà dit archMqx, c'est le i=-2 qui pose problème!

    dans la première itération le i=0, une fois tu y soustraits 2 il est à -2!!! donc la prochaine itération tu indexera ton tableau buffer[i] par -2 et tu essayes d'y écrire...

    C ne permet pas d'indexer par des valeurs négatives. le -2 sera donc casté à une valeur positive (qui sera probablement un unsigned int FFFFFFFE!! enfin j'espère que je dis pas de bêtises...)

    Pourrais tu nous expliquer mieux ce que tu veux faire en soustriant 2 à i?

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Dans mon code lorsque je met i = 0 j'ai en affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    name[0] = "h1"
    name[1] = "h\np"
    name[2] = "h\ndiv"

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Je viens de voir pourquoi j'avais un erreur a l’exécution c'est parce que je déclarais mon tableau de structure dans le main. Depuis que je l'ai sortie du main je n'ai plus de problème. Mais je ne sais pas pourquoi
    Mais je ne comprend pas pourquoi j'ai des caractere en plus qui se glisse dans mon tableau.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Le caractère \n est une séquence d'échappement qui indique la création d'une nouvelle ligne.
    Il correspond, en ascii, au caractère 0x0A : Line Feed (LF).

    Une séquence d'échappement ?
    Il existe dans la table ascii certain caractère qui sont spécifique pour effectuer certaine tâche. 0x0A LF en est un exemple, mais n'est pas le seul. Tu peux avoir le caractère Carriage Return (CR) (0x0D) qui permet de revenir au début d'une ligne, ou encore le Horizontal Tab (TAB) (0x09) qui permet d'effectuer une tabulation.

    En C, on spécifie ses caractères spécifique à l'aide du "\". Le \ indique qu'une séquence spéciale va commencer. ( plus d'information ici ou )

    En reprenant mes exemples plus haut, la transcription de ses caractères en C sont :
    • CR = \r
    • TAB = \t


    Concrètement, ton fichier "myCss1.css" contient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    h1 {\n 
    font-size : 12px\n
    color : blue\n
    }\n
    div {\n
    ...
    Le \n est un caractère comme un autre, disponible dans la table ascii, et est donc est traité indifféremment des autres caractères.

    Si tu ne veux pas le voir apparaître, tu peux lui dédier un traitement spécifique (je pense à une case supplémentaire dans ton switch, par exemple).
    Dernière modification par Invité ; 16/11/2014 à 11h24.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci a tous pour vos réponses j'y vois beaucoup plus clair dans mes erreurs et j'ai compris la notion du caractere '\n'.
    Mais je ne comprend pas pourquoi j'ai un 'h' qui se rajoute dans buffer[0] a partir de la 2e itération..

  11. #11
    Invité
    Invité(e)
    Par défaut
    Pour t'aider, indique donc la dernières version de code de ton programme.

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    J'ai réussi a remplir mes structure finalement. Après la première itération j'écrivais automatiquement dans buffer[1].
    Mon problème est résolu je vous remercie tous de votre participation !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 14/07/2007, 18h44
  2. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  3. Réponses: 9
    Dernier message: 21/02/2006, 18h40
  4. Faire une recherche de texte dans un tableau de variable
    Par alexxx69 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 19/02/2006, 13h12
  5. [Debutant] Mettre une chaine de caractere dans un tableau
    Par bouboussjunior dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 14/09/2004, 11h33

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