Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » C & Cie. » C : probleme de tableau dans une structure.

Amwus
ProgBoarder
Citer Linux Firefox 2 - Posté le 26/10/2007 à 18:18
Bonjour !

Voila je continue de bosser sur mon programme de gestion de ventilateur sous linux. J'ai une fonction qui prend en paramètre une structure et dans cette structure, il y a un tableau. Le problème est que quand je veux ajouter un élément dans le tableau de la structure, j'ai un SIGSEV (segmentation fault).

J'ai donc une structure du type :


typedef struct Thm_t Thermal;
struct Thm_t {
int tableau[16]; // par exemple
//autres variables
};



La fonction prend la structure en paramètre, définie comme suit :


int getThm(struct Thm_t* data);



Et dans cette fonction, si je veux remplir le tableau, il segfault :


data->tableau[5] = entier;



Je pense avoir tout dit...
Une idée de ce segfault ?

Merci d'avance ! (sourire)
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Francesco
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 26/10/2007 à 18:21
Ca sent un problème d'allocation à plein nez ça (sourire)

A priori, tu déclare un tableau statique dans ta structure, donc ça, c'est ok.
As tu bien alloué la mémoire pour ta structure ?

car tu fais un getThm(data), data est un pointeur, donc, as tu bien fais un data = maloc(sizeof(Thm_t)) ?
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 26/10/2007 à 18:57
Dans mon fichier main, j'ai cet extrait de code... Maintenant, il ne compile meme plus (héhé


FILE* open = fopen("/proc/acpi/ibm/thermal", "r");

if (open == NULL) {
fprintf(stderr, "error loading thermal file\n");
return 1;
}

Thermal* test_struct;
test_struct = malloc(sizeof(Thermal));

getThm(open, test_struct);
fclose(open);




gcc --std=c99 --pedantic -Wall -Wmissing-prototypes -g fancontrol.c main.c -o fancontrol
main.c: In function ‘main’:
main.c:26: error: invalid application of ‘sizeof’ to incomplete type ‘Thermal’
make: *** [fancontrol] Error 1



(désapprouve)
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 26/10/2007 à 19:28
C'est possible, de renommer une structure avant de la renomer?
Parce que c'est ce que tu fais, la:


typedef struct Thm_t Thermal;
struct Thm_t
{
int tableau[16]; // par exemple
//autres variables
};



Et la, honnêtement, j'ai un doute... Car Thm_t est effectivement incomplet au moment ou tu le renomme en Thermal
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 26/10/2007 à 19:34
c'est à dire que je définit la structure dans un fichier headers.

La je met typedef struct Thm_t Thermal;

Ainsi plutot que d'utiliser struct Thm_t pour créer la structure, je n'aurai plus qu'à appeler Thermal...
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 26/10/2007 à 19:36
Oui, j'avais compris, mais dans l'exemple que tu nous fournis, la structure est définie APRES avoir été renomée...
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 26/10/2007 à 20:00
ben heu je pense pas... j'ai toujours procédé ainsi sans problème :

Dans un fichier .h, je définit les fonctions et la structure opaque par un typedef. Dans un fichier.c, je crée la structure en elle même. Le typedef du h ne sert qu'a permettre de l'appeler différemment....

Je n'ai jamais eu de probleme pour faire ça... Ca doit etre une betise encore ce bug...
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 26/10/2007 à 20:03
Pour vérifier, utilise le type Thm_t dans le sizeof...
Histoire de voir si l'erreur est la même.
Ca permettra d'être fixé (clein d'oeil)

La, j'ai pas de compilo sous la main, donc je peut pas...

Edité par Freem ( 26/10/2007 20:03:30 )
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
Amwus
ProgBoarder
RemonterCiter Linux Firefox 2 - Posté le 26/10/2007 à 20:35
non pareil... même erreur... bizarre... ça devrait pas faire ça ! Je vais réanalyser tout le code...
"Engl Amps are the best i've ever used... Not only are they powerfull, but they have charachter too..." R. Blackmore
Francesco
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 26/10/2007 à 21:24
Est-ce qu'on peut avoir le code complet ? Avec entete et tout (et même les entetes que tu as écrit toi-même).

Car ton message d'erreur me pousse à rejoindre Freem : tu renomme un type avant de le définir. De plus, tu dis "Dans un fichier.c, je crée la structure en elle même", et que tu renomme le type dans un fichier .h. Et ça, ça me pose un gros problème. J'explique :

term.c : contient la structure therm_t
term.h : contient une redéfinition de la structure en therm (par exemple).
main.c : inclu le fichier term.h, et ne peux donc pas manipuler directement des structures de type therm, car il n'en connait pas la taille d'une telle structure ! Par contre, il peut manipuler des pointeurs sur cette structure, puisque les pointeurs ne dépendent que de l'architecture, et non des données que tu mets dedans...

Ou alors, j'ai mal compris ton organisation de tes fichiers ^^
Gates gave you the windows.
GNU gave us the whole house.(Alexandrin)
Freem
Modérateur
RemonterCiter Windows NT Firefox 2 - Posté le 26/10/2007 à 21:40
En plus,il est conseillé (justement pour ce qu'à expliqué Francesco) de mettre les définitions de structures dans les headers.
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2008 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,088 s - Crédits - Stats
2 connectés 1 membre