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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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;
    }
    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 habitué
    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
    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
    Membre habitué
    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
    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 éprouvé

    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
    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?

+ 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