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 :
ça me retourne bien les valeurs que j'ai mises dans le main.
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; }
mais si par exemple j'essaie quelque chose du genre :
avec un appel du style :
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 ;
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
1
2
3
4 pthread_t GABTHREAD ; pthread_create(&GABTHREAD, NULL, hello2, (void *)GAB2[0]); pthread_join(GABTHREAD, NULL);
et que je passe mon_element_de_tableau dans le pthread_create, ça fonctionne très bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part modbus_cable_t * mon_element_de_tableau = &GAB2[0]
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 :'(
Partager