Home › Forum › Électronique générale › [code en C] Soucis avec les structures

Forum

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion

Sujet: [code en C] Soucis avec les structures

Auteur Message

Bovix

134 messages

Visiteur régulier
Visiteur régulier

Read post 12-10-2011 21:45

Bonsoir à tous,

Je crie HELP HELP HELP car je suis bloqué, et qu'il ne me restera plus beaucoup de cheveux sur le caillou (je rigole), mais avant que le PC ne vole au travers de la chambre, je fais d'abord appel à vous.

Je vous donne un exemple de mon soucis : j'aimerai créé plusieurs tâche qui ont comme structure leur nom, leur taille, et d'autres paramètre, etc... pi ces tâches doivent être liée entre elles (liste chainée), c'est-à-dire que la tâche en-elle-même connaît si elle a quelqu'un qui la précède ou qui la devance.

j'utilise une structure qui définit la tâche, puis j'utilise une autre structure qui devrait me permettre de connaître le détail de la tâche, ainsi la tâche qui suit, ou qui précède...

bref je pense que le code sera peut-être plus explicite :
//--- structure interne de la tâche
//---------------------------------
struct s_tache
{
    char task_name[100];            // nom de la tâche
    unsigned char priority;         // niveau de priorité la plus élévée
                                    // = plus importante
    int cpu_used;                   // utilisation du CPU
    int ready_at;                   // gibilité de la tâche
    int to_exec;                    // temps d'exécution restante
};

//--- structure de la tâche externe (liant entre les différentes tâches)
//----------------------------------------------------------------------
struct s_element
{
    s_tache tache_i;                        // la tâche en elle-même
    struct s_element    *pt_before_task;    // pointeur indiquant la tâche d'avant
    struct s_element    *pt_next_task;      // pointeur indiquant la tâche d'apèrs
};

void main()
{
    //--- déclaration des différents éléments (tâches externes)
    //---------------------------------------------------------
    typedef struct s_element tache1;
    typedef struct s_element tache2;
    typedef struct s_element tache3;

    //--- déclaration des différents éléments (tâches externes)
    //---------------------------------------------------------
    s_tache* t1 = malloc(sizeof(s_tache));
    s_tache* t2 = malloc(sizeof(s_tache));
    s_tache* t3 = malloc(sizeof(s_tache));

    tache1.tache_i = t1;
}


Et j'ai un soucis qu'en je veux liée ces 2 structures... snif snif snif

Voilà si vous avez des remarques sur mes explications, c'est bien volontiers que je vous apporte des précisions,... et si vous avez compris mes explication et c'est bien volontiers que je vais prendre plaisir à vous lire car je suis vraiment bloqué...

Amicalement Philou

jeanpierre

107 messages

Visiteur régulier
Visiteur régulier

Read post 12-10-2011 22:32

Bonsoir,
je te conseille d'aller plutot sur un forum plus "informatique" genre http://www.cppfrance.com/

JP

Loblick

447 messages

Habitué
Habitué

Read post 13-10-2011 08:59

Philippe!!

Veux-tu m'enlever tout de suite ces typedef dans la déclaration des variables structure tache1 tache2 tache3...

typedef sert à définir des alias de type de variable...

Par exemple, si tu as mis typedef unsigned char UINT8; au début de ton fichier (donc pas dans une fonction), les deux lignes suivantes sont équivalentes :
unsigned char mon_char_non_signé;
UINT8 mon_char_non_signé;


Un truc : tu peux faire :

struct MA_STRUCTURE
{
unsigned char data1;
unsigned char data1;

}

typedef struct MA_STRUCTURE mon_type_struct;

puis déclarer une variable comme suit :

void ma_fonction(void)
{
mon_type_struct ma_structure1;
}

cela évite d'avoir à répéter le struct à chaque fois que tu utilises la structure et rend le code plus digeste...

N'hésite pas à reposter ton code modifé!!

A+,
Loïc

Bovix

134 messages

Visiteur régulier
Visiteur régulier

Read post 15-10-2011 12:45

Merci à vous deux JP et Loic...

j'avance gentillement sur le debbugage : voila un petit point ou je me trouve avec quelques compléments... et j'ai suivi tes directives maitre LOIC...

1/ création de 3 fichiers distincts : main.c - test.c - test.h

2/ dans le fichier point test.h, c'est ici que je défini mes structures, avec la déclaration de type lié à mes strcutures :

code :
//-----------------------------------------------------------------------------//
//--- déclaration de structures
//-----------------------------------------------------------------------------//
//--- structure interne de la tâche
//---------------------------------
struct s_tache
{
    char task_name[100];            // nom de la tâche
    unsigned char priority;         // niveau de priorité la plus élévée
                                    // = plus importante
    int cpu_used;                   // utilisation du CPU
    int ready_at;                   // gibilité de la tâche
    int to_exec;                    // temps d'exécution restante

};

//--- déclaration du nouveau type structure (s_tâche)
//---------------------------------------------------
typedef struct s_tache s_tache_int;

//--- structure de la tâche externe (liant entre les différentes tâches)
//----------------------------------------------------------------------
struct s_element
{
    struct s_element *pt_before_task;    // pointeur indiquant la tâche d'avant
    struct s_element *pt_next_task;      // pointeur indiquant la tâche d'apèrs

    s_tache_int propri_taches;           // tâche en elle-même
};

//--- déclaration du nouveau type structure (s_tâche)
//---------------------------------------------------
typedef struct s_element s_tache_ext;


ça a l'air de marché !!! Merci à toi, loic


3/ dans le main, je veux créer plusieurs listes (tableau) de la structure qui correspond à la tâche externe et d'envoyer une de ces listes à une fonction pour initialisation selon le choix du client

code:
    //--- création de différentes listes à utilisé
    //--------------------------------------------
    s_tache_ext liste_elements_prets[100];     // tb contenant les éléments prêt
    s_tache_ext liste_elements_bloques[100];   // tb contenant les éléments bloqué
    s_tache_ext elements_exec;                 // variable en exécution

    //..... 

    //--- appel la fonction : init_task_list
    //--------------------------------------
    init_task_list(rep_client, &liste_elements_prets);



Apparemment ca fonctionne aussi, pas d'erreur

4/ création d'un fichier test.c pour traîter mes différentes listes.... Pour l'instant je me concentre sur l'initialisation, et c'est là que coinsouille :~

voici le code :
// Nom de la fonction   : init_task_list
// Description          : initialise différentes tâches
//                        selon l'exemple choisi
// Entrée(s)            : choix_exemple
// Sortie(s)            : -
// IN-OUT               : pt_liste_pret
//----------------------------------------------------------------------------//
void init_task_list(int choix_exemple, s_tache_ext *pt_liste_pret)
{
    //--- déclaration des différents éléments (tâches externes et interne)
    //--------------------------------------------------------------------
    s_tache_ext* tache1 = malloc(sizeof(s_tache_ext));    // cération tâche 1
    s_tache_int t1_struct;                          // structure de la tâche 1
    s_tache_ext* tache2 = malloc(sizeof(s_tache_ext));    // cération tâche 2
    s_tache_int t2_struct;                          // structure de la tâche 1
    s_tache_ext* tache3 = malloc(sizeof(s_tache_ext));    // cération tâche 3
    s_tache_int t3_struct;                          // structure de la tâche 1

    //--- selon choix client
    switch(choix_exemple)
    {
        case 1 :
            //--- création de la structure interne de la tache 1
            //--------------------------------------------------
            t1_struct.task_name[100] = "T1";
            t1_struct.priority = 128;           // P(ti)
            t1_struct.cpu_used = 5;             // P = période
            t1_struct.ready_at = 5;             // D = deadline
            t1_struct.to_exec = 4;              // C = durée de la tâche

            //--- liaison entre la structure interne et la structure externe
            tache1.propri_taches = t1_struct;


c'est à la dernière ligne qu'il y a une erreur, mais je ne la comprends pas...


|63|error: request for member `propri_taches' in something not a structure or union|


Si vous avez des idées bien volontiers

Merci de me lire encore....

Amicalement Philou

Loblick

447 messages

Habitué
Habitué

Read post 15-10-2011 16:50

Rooooooo!

tache_1 est un pointeur!
Tu dois donc écrire (*tache_1).propri_data ou tache_1->propri_data

Loblick

447 messages

Habitué
Habitué

Read post 15-10-2011 16:57

Rooooooo!

tache_1 est un pointeur!
Tu dois donc écrire (*tache_1).propri_data ou tache_1->propri_data

Veuillez vous identifier avant de répondre ou pour vous abonner à cette discussion