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 :

[ARM9][POSIX]Passer un élément de tableau de structure à la création d'un thread


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut [ARM9][POSIX]Passer un élément de tableau de structure à la création d'un thread
    Bonjour à tous,

    je tombe sur une tuile que je n'arrive pas à comprendre :

    (je compile avec arm-linux-gcc pour info)

    Pour mon besoin je voudrais passer à la création de mon thread un élément de tableau de structure (donc une structure quoi, du moins pour moi)

    Pour passer une structure simple, j'ai testé ça fonctionne très bien :
    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
    #include <stdio.h>
    #include <pthread.h>
    #include <stdlib.h>
     
    typedef unsigned int uint32_t;
    typedef unsigned short int uint16_t;
    typedef unsigned char uint8_t;
     
    typedef
    enum 
    {
    	HAUT = 0,
    	BAS = 1,
    	_NB_ELTS_HAUTEUR_ // sera evalue au nombre d'elements de l'enumere (pour l'instant 2)
    } hauteur_cable_t;
     
    struct modbus
    {
    	int lasterrno; /** value of errno after last failed C-library call */
    	int fd; /**< holds the socket file descriptor of the modbus connection */
    	//struct sockaddr_in addr; /**< holds the IP address of the modbus connection */
    	//modbus_exception_code_t exception; /**< modbus exception code - use modbus_exception_to_str() to get a human readable string */
    };
     
    typedef struct
    {
    	struct modbus modbus; // TBC si struct modbus ou struct modbus *
    	hauteur_cable_t cable;
    } modbus_cable_t;
     
    void *hello2(void *input) {
        printf("modbus.fd: %d\n", ((modbus_cable_t *)input)->modbus.fd);
        printf("cable: %d\n", ((modbus_cable_t *)input)->cable);
    }
    int main()
    {
     
        modbus_cable_t *GAB = (modbus_cable_t *)malloc(sizeof(modbus_cable_t));
        GAB->modbus.fd=1989;
        GAB->cable=BAS;
     
        pthread_t GABTHREAD ;
        pthread_create(&GABTHREAD, NULL, hello2, (void *)GAB);
        pthread_join(GABTHREAD, NULL);
        return 0;
    }
    ça me retourne bien les valeurs que j'ai mises dans le main.

    mais si par exemple j'essaie quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        modbus_cable_t * GAB2[2] ;
        GAB2[0]->modbus.fd=3199 ;
        GAB2[0]->cable=HAUT ;
    avec un appel du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        pthread_t GABTHREAD ;
        pthread_create(&GABTHREAD, NULL, hello2, (void *)GAB2[0]);
        pthread_join(GABTHREAD, NULL);
    Je tombe sur un Seg Fault direct et je n'arrive pas à comprendre pourquoi, d'autant que si je fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modbus_cable_t * mon_element_de_tableau = &GAB2[0]
    et que je passe mon_element_de_tableau dans le pthread_create, ça fonctionne très bien


    Quelqu'un peut-il éclairer ma lanterne sur pourquoi ça ne marche pas, peut-être que je ne l'écris pas correctement, mais j'ai également testé de passer en tableau dynamique plutôt que statique, rien n'y fait ça ne fonctionne pas mieux :'(

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    modbus_cable_t * GAB2[2] ; crée un tableau de 2 pointeurs, pointant sur absolument n'importe quoi et pas du tout un truc valide.
    GAB2[0]->modbus.fd=3199 ; GAB2[0]->cable=HAUT ; accède au premier pointeur pour assigner des valeurs, dans un emplacement mémoire aléatoire et invalide.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir;
    une erreur de segmentation parce qu’il n’y a pas eu d’allocation mémoire de faite. En réalité, quand vous déclarez modbus_cable_t* GAB2[2]; vous ne faites que déclarer non pas un pointeur sur un tableau, mais bien un tableau de deux pointeurs sur modbus_cable_t. Pour pouvoir utiliser GAB2 il vous faut allouer de la mémoire dynamiquement avec malloc(....);;
    À bientôt,

  4. #4
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut
    Bonjour à tous les deux et merci beaucoup pour vos réponses, mais du coup pour l'allocation mémoire j'ai essayé ce qui suit mais ça me sort encore en Seg Fault

    Voici ce que j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        modbus_cable_t ** GAB2 = (modbus_cable_t **)malloc(2*sizeof(modbus_cable_t));
        GAB2[0]->modbus.fd=3199 ;
        GAB2[0]->cable=HAUT ;
     
    // ...
        pthread_create(&GABTHREAD, NULL, hello2, (void * ) GAB2[0] );
    ça seg fault au niveau du pthread_create (pourtant si je fais un tableau qui est un pointeur de pointeurs de modbus_cable_t, chaque élément de ce tableau est un pointeur de modbus_cable_t non ?)

    Je n'arrive pas à trouver comment bien l'écrire :'(

    EDIT : J'ai réussi à trouver le contournement suivant en passant par une variable intermédiaire mais bon bof quoi : C'est un peu naze qu'on puisse pas écrire directement &GAB2[i] dans le pthread_create et qu'on soit obligé (apparemment) de passer par ma variable temp_pointeur qui contient &GAB2[i] ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        pthread_t * GABTHREAD = malloc(_NB_ELTS_HAUTEUR_*sizeof(pthread_t));
        modbus_cable_t * GAB2 = malloc(_NB_ELTS_HAUTEUR_*sizeof(modbus_cable_t));
        modbus_cable_t * temp_pointeur = NULL;
     
        GAB2[0].modbus.fd=3199 ;
        GAB2[0].cable=HAUT ;
        GAB2[1].modbus.fd=77444 ;
        GAB2[1].cable=BAS ;
        for (i=0;i<_NB_ELTS_HAUTEUR_;i++)
        {
            temp_pointeur = &GAB2[i] ;
            pthread_create(&GABTHREAD[i], NULL, hello2, (void * ) temp_pointeur );
            pthread_join(GABTHREAD[i], NULL);
        }
    EDIT 2 : Non laissez tomber en fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&GABTHREAD[i], NULL, hello2, (void * ) &GAB2[i] );
    ça fonctionne ... j'y pige plus rien

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    Billets dans le blog
    4
    Par défaut
    Pourquoi faire de l'allocation dynamique quand tes valeurs sont toutes statiques ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Novembre 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2018
    Messages : 18
    Par défaut
    Bonsoir,

    non juste pour te répondre ce sont des valeurs que j'ai prises en exemple, ce n'est pas mon code réel, j'ai simplifié pour focaliser sur ma problématique , dans mon code réel, la structure que j'adresse contient une adresse de socket, un file descriptor de connection, un entier pour l'errno, et une structure d'exception spécifique au modbus.

    (J'espère d'ailleurs que ce genre de structure est passable d'un thread à l'autre, je n'ai pas encore pu faire le test)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 18h31
  2. Réponses: 4
    Dernier message: 11/01/2006, 09h22
  3. Soustraire des éléments de tableau entre eux
    Par syl2095 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 20/01/2005, 15h29
  4. problème our passer des string dans tableau d'int
    Par Battosaiii dans le forum C++
    Réponses: 9
    Dernier message: 15/07/2004, 17h42

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