diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md index f5359e70508246c2de93d7b99b57d48d8f9d7c59..04d85737ee3d7ff5bdfa1e56cbfb040d6f803421 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/README.md @@ -19,26 +19,38 @@ Avant de commencer le débogage et l'analyse de la mémoire du programme, nous a * Nous possédons un fichier nommé main.c qui contient une structure tableau en plus de cinq fonctions distinctes : alea, remplir, bulle, trier, affiche et main, la fonction principale du programme. Les détails plus approfondis sur chacune des fonctions seront documentés dans le fichier doxyfile. * Ce programme est conçu afin de réaliser le tri d'un tableau dynamique par ordre décroissante, la taille effective et maximale du tableau sont spécifiées par l'utilisateur et son remplissage s'effectue avec des nombres selectionnés aléatoirements à l'aide de la fonction aléa. * Les arguments attendus sont la taille effective et la valeur maximale des éléments du tableau respectivement représenté par argc et argv dans la fonction principale main. +* La taille effective du tableau est donnée par la ligne de code : t.taille = atoi(argv[1]); +* La taille maximale du tableau est représenté par la ligne suivant : int m = atoi(argv[2]); +* Nous pouvons également commenter une déclaration double de 'tableau t', cette rebondance sera mis en commentaire. * Avant d'utiliser Gdb et Valgrind, nous avons effectué quelques tests lors de l'éxécution du programme en changeant le nombre d'élément (argc) et le nombre totale (argv) du tableau dans le fichier makefile. -Nous avons testé l'éxécution du programme main dans quatre scénarios différents : +Nous avons testé l'éxécution du programme main dans six scénarios différents : - (a) - lorsque argc < 3 et argv > argc Exemple : ./main 2 5 - (b) - lorsque argc > 3 et argv > argc Exemple : ./main 5 10 - (c) - lorsque argc > 3 et argv < argc Exemple : ./main 10 5 + (d) - lorsque argc > 3 et argv = argc Exemple : ./main 5 5 - (d) - sans fournir aucun argument à main Exemple : ./main -- Parmis ces quatres situations, seul le cas (b) devrait fonctionner correctement. Néanmoins les cas (a) et (c) donnent également des résulats contre l'attente d'erreurs. Le cas (d) réagit comme attendu, en signalant une erreur due à l'absence des deux arguments requis. -* Nous pouvons également commenter une déclaration double de 'tableau t', cette rebondance sera mis en commentaire. -* Une autre erreur pertinente est l'omission de la libération de mémoire allouée par free. +- (e) - en fournissant un argument à main Exemple : ./main 10 +- Parmis ces six situations, seul les cas (b) et (d) devraient fonctionner correctement. Néanmoins les cas (a) et (c) donnent également des résulats contre l'attente d'erreurs. Le cas (d) et(e) réagissent comme attendu, en signalant une erreur due à l'absence des trois arguments requis d'après la condition 'if(argc < 3)'. +* Faire une gestion d'erreur si l'allocation mémoire a été bien réussi. +* Une autre erreur pertinente est l'omission de la libération de mémoire allouée par free + ### Débogage et analyse mémoire *** + #### Débogage avec l'outil GDB *** -##### * ajout de l'option -g dans la commande gcc tel que : gcc -g -o main main.c Cette option -g ajoute des informations de débogage au fichier exécutable généré, permettant à l'outil GDB d'accéder à des informaions détaillés sur le code source +* Lancement de gdb avec : gdb ./main +* Mettre des breakpoints aux lignes désirées : Exemple : break 63 +* Pour éxécuter le programme, nous donnons les trois arguments attendu dans run : run main 5 10 #### Analyse mémoire avec l'outil Valgrind *** +* Analyse mémoire avec Valgrind pour des arguments spécifiques: Valgrind ./main 5 10 +* Le résumé de l'utilisation la mémoire (HEAP SUMMARY) nous indique que nous avons deux allocations mémoires pour un free et une fuite de mémoire. +* Premièrement, nous allons initialisé t.tab à NULL par convention, deuxièmement nous créons une gestion d'erreur pour connaitre si l'allocation mémoire de t.tab a été bien faite où dans le cas contraire nous serions informer par un message d'erreur puis pour terminer nous mettons en place la libération de mémoire par free(t.tab) diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c index 2a18a842777c6d40ad58a1b57236ba5126a655df..a339602ff03ee5fbbdb96d442fce4c7d657c5bb8 100755 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/main.c @@ -26,10 +26,11 @@ void remplir(int m) void bulle(int k) { int i = 0; - for (i = 0; i <= k; i++) + for (i = 0; i < k; i++) //Pour éviter d'accéder hors du tableau, la boucle dans bulle ne doit pas permettre que 'i + 1' dépasse k. Donc i < k dans la condition du boucle for. { - if (t.tab[i + 1] > t.tab[i]) - { // echange de t[i] et t[i+1] + // Condition pour un tri décroissant, pour un tri croissant inversé la condition t.tab[i] > t.tab[i + 1]) + if (t.tab[i + 1] > t.tab[i]) + { int tmp = t.tab[i + 1]; t.tab[i + 1] = t.tab[i]; t.tab[i] = tmp; @@ -71,8 +72,12 @@ int main(int argc, char **argv) int m = atoi(argv[2]); // lecture du 2eme argument - t.tab = 0; // initialisation du pointeur + t.tab = NULL; // initialisation du pointeur t.tab = (int *)malloc(t.taille * sizeof(int)); // allocation du tableau + if(t.tab == NULL) { + fprintf(stderr, "Erreur d'allocation de la mémoire\n"); + exit(EXIT_FAILURE); + } remplir(m); // remplissage aléatoire du tableau @@ -84,5 +89,7 @@ int main(int argc, char **argv) printf("tableau trié :\n"); affiche(); + // free(t.tab); //libération de la mémoire + return 0; } \ No newline at end of file diff --git a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile index 4795d9489715deb5bdd822cd35ecfbb4390d3f0e..2d4c878d5c35689ac50557e0bc4ad71fdb79a1f8 100644 --- a/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile +++ b/TP3_SUITE_TP2_CLONE/code_modifie/sans_organisation/makefile @@ -1,4 +1,4 @@ -all: main run clean +all: main run main: main.c @echo "\n\033[31m--------------COMPILATION DU PROGRAMME -------------------------------------\033[0m\n" @@ -7,7 +7,7 @@ main: main.c run: @echo "\n\033[31m--------------ÉXÉCUTION DU PROGRAMME ---------------------------------------\033[0m\n" - ./main 5 10 + ./main 3 5 @echo "\n\033[32mProgramme éxécuté avec succès\033[0m" clean: