aurhas
Messages postés16Date d'inscriptionmardi 3 novembre 2009StatutMembreDernière intervention 3 juin 2010
-
18 mai 2010 à 12:49
aurhas
Messages postés16Date d'inscriptionmardi 3 novembre 2009StatutMembreDernière intervention 3 juin 2010
-
18 mai 2010 à 16:28
Bonjour,
je fais un programme à partir de bouts de codes que j'ai trouvés. Ce programme lis des données qui arrivent sur l'USB, les formate et les affiche dans une fenetre que je fais avec GTK+. La fonction de lecture est appelée périodiquement (g_timeout_add).
Mon problème est que ca plante quand je le lance normalement : program.exe a cessé de fonctionner. Quand je fais en débug sans point d'arrêt ca me donne : Program received signal SIGSEGV, Segmentation fault et les lignes correspondantes sont toujours les mêmes :
Cependant, quand je fais presque ligne par ligne, cela fonctionne bien.
Avez-vous une idée d'où ca peut venir ? A quoi sont dues en général ces erreurs ? est-il possible de remplacer ces lignes par autre chose de plus simple ? faut-il mettre des tempos ?
Merci d'avance de vos réponses
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 18 mai 2010 à 13:54
Non, c'est juste un coup de chance que ça fonctionne en pas à pas.
Tu as du faire une erreur de mémoire (tu doit faire un débordement, ou écrire dans une zone non allouée ou déjà supprimée).
Aucun "tempo" n'est nécessaire, tu dois juste corriger ton code défectueux.
aurhas
Messages postés16Date d'inscriptionmardi 3 novembre 2009StatutMembreDernière intervention 3 juin 2010 18 mai 2010 à 14:10
Merci de votre réponse.
J'ai changé des lignes de cette fonction qui me pose problème. en fait entre les 2 lignes que j'ai écrites précédemment, il y a :
en fait je range, dans le champs data de pMsg (qui est un pointeur qu'on passe à cette fonction et dont le type est CANMsg), les données hexadécimales contenues dans p (qui est un pointeur vers la donnée que je reçois sur l'USB) (l'offset est de 5).
Quand j'enlève uniquement les lignes précédentes, j'ai une erreur identique sur la ligne
*(p + data_offset + 2 * (i-1) + 2 )= 0;
Quand j'enlève les lignes qui me posaient problème tout à l'heure ainsi que la ligne *(p + data_offset + 2 * (i-1) + 2 )= 0;, j'ai une erreur semblable (en debug) mais liée à la fonction sscanf... je suppose que cela veut dire que l'adresse "p + data_offset + 2 * (i-1)" est incorrecte mais je ne comprends pas pourquoi. la donnée vers laquelle pointe p ressemble à "t140300451C3709\r". dans lequel len est le 5ème caractère.
le pointeur pointe vers une donnée disponible d'après ces lignes... ou pas ?
est-il possible d'écrire autrement les lignes qui posent problème ?
Merci d'avance.
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 18 mai 2010 à 14:24
*(p + data_offset + 2 * (i-1) + 2 )= 0
Tu dois te poser plusieurs questions:
- Est-ce que la zone à l'adresse: p + data_offset + 2 * (i-1) + 2, est disponible ?
ou
- Est-ce que la zone à l'adresse: p + data_offset + 2 * (i-1) + 2 est alloué ?
Pour vérifier les erreurs mémoires, tu as un outil très pratique qui s'appelle "valgrind" (sous Linux, sous Windows il me semble que "purify" le fait aussi).
aurhas
Messages postés16Date d'inscriptionmardi 3 novembre 2009StatutMembreDernière intervention 3 juin 2010 18 mai 2010 à 16:02
merci encore.
je ne suis pas expert en c mais je pense que la zone pointée est disponible et allouée.
ca peut sembler bizarre, mais j'ai réussi à contourner le probleme.... avec des tempos.
du coup, mon programme est très lent mais fonctionne...
une idée du probleme ??
merci encore de votre aide.
Vous n’avez pas trouvé la réponse que vous recherchez ?