Je vous explique, j'ai une structure représentant un tableau et je suis censer coder les getters/setters de cette fonction ceux-ci marche mais créer des problèmes sous Valgrind ( pas des pbs de fuites mémoires) mais je n'arrive pas à les identifier, je pense que ça vient directement d'une erreur dans mon code, est-ce que quelqu'un aurait une idée de comment les recoder plutôt ?
struct array {
int *data;
size_t capacity;
size_t size;
};
int array_get(const struct array *self, size_t index) {
if (index>self->size) {
return 0;
}
return self->data[index];
}
void array_set(struct array *self, size_t index, int value) {
if (index>self->size) {
return 0;
}
self->data[index]=value;
}
Je vous mettrai l'erreur Valgrind en détail si vous demandez mais je ne pense pas qu'elle vous sera utile ^^'
pour avoir un rapport valgrind utile il est nécessaire de :
compiler en mode debug → -g et surtout pas de -O ;
lancer valgrind avec les options --leak-check=full --track-origins=yes --show-reachable=yes ;
nous fournir des exemples de cette sortie valgrind pour qu'on t'explique comment la lire, la comprendre et l'utiliser pour débusquer les mauvaises utilisations.
En passant : pas de valeur dans un return d'une fonction void …
Tu ne peux pas faire un return 0 dans une fonction qui retourne void
Ne fais pas de programmation défensive, si ton utilisateur met un indice hors borne c'est pas le problème de ta fonction. Les assertions sont là pour détecter les erreurs de programmation.
Pour ton problème, ce code ne présente aucune fuite dès lors qu'il ne contient ni malloc ni free.
git is great because Linus did it, mercurial is better because he didn't.
Je ne vois pas de fuite mémoire dans ton code. Les fuite mémoire ce sont des "malloc" que tu ne "free" pas !
if(index>self->size)
Si size est la taille de ton tableau data, data[size] sort du tableau !
Alors effectivement l'erreur venait de là, merci !
White Crow a écrit:
Hello,
pour avoir un rapport valgrind utile il est nécessaire de :
compiler en mode debug → -g et surtout pas de -O ;
lancer valgrind avec les options --leak-check=full --track-origins=yes --show-reachable=yes ;
nous fournir des exemples de cette sortie valgrind pour qu'on t'explique comment la lire, la comprendre et l'utiliser pour débusquer les mauvaises utilisations.
En passant : pas de valeur dans un return d'une fonction void …
Oh c'est cool ça, ça me permettra de debug de façon un peu plus maline les prochaines fois, par contre -g ne semble pas fonctionner valgrind --leak-check=full -g ./aout ne marche pas
Je ne vois pas de fuite mémoire dans ton code. Les fuite mémoire ce sont des "malloc" que tu ne "free" pas !
if(index>self->size)
Si size est la taille de ton tableau data, data[size] sort du tableau !
Alors effectivement l'erreur venait de là, merci !
White Crow a écrit:
Hello,
pour avoir un rapport valgrind utile il est nécessaire de :
compiler en mode debug → -g et surtout pas de -O ;
lancer valgrind avec les options --leak-check=full --track-origins=yes --show-reachable=yes ;
nous fournir des exemples de cette sortie valgrind pour qu'on t'explique comment la lire, la comprendre et l'utiliser pour débusquer les mauvaises utilisations.
En passant : pas de valeur dans un return d'une fonction void …
Oh c'est cool ça, ça me permettra de debug de façon un peu plus maline les prochaines fois, par contre -g ne semble pas fonctionner valgrind --leak-check=full -g ./aout ne marche pas
Compiler → utiliser un compilateur (comme gcc, clang, …) → gcc -g -o exe fichier.c (en version quick and dirty) ; c'est là qu'il faut mettre le -g … pour intégrer dans l'exécutable des informations de débugage.
Profiler → utiliser un profileur (comme valgrind en mode profil d'exécution ou profil de mémoire ou profil de cache ou … ou comme les sanitizers dispo comme bibliothèques lors de la compilation) → c'est là que tu mets les options --leak-check=full --track-origins=yes --show-reachable=yes → valgrind --leak-check=full --track-origins=yes --show-reachable=yes ./mon_executable.
Debuger → utiliser un débugueur (comme gdb, lldb ou des front ends comme ddd, nemiver, …) est un savoir indispensable si tu programmes ; sans ça tu seras éternellement obligé de venir poster des questions sur un forum simplement pour demander de l'aide.
Une autre capacité à acquérir est celle de rechercher des solutions sur internet, et de bien expliquer son problème lors de la demande d'aide.
et de bien expliquer son problème lors de la demande d'aide.
Alors là, je plussois ++ ! Parce que quand t'on voit les questions bien trop souvent, ça laisse pantois !
Problème fonction get/Set array
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
git is great because Linus did it, mercurial is better because he didn't.