Instructions Facile
Tracer une fonction
Organiser et déboguer · Exercice 2
Ajoute des printk() dans la fonction trouver_obstacle() du chapitre LIDAR pour afficher :
- Les moyennes gauche, centre, droite
- La direction retournée
Indices :
Solution :
#include <stdio.h>
#include <stdint.h>
int trouver_direction_obstacle(uint16_t matrix[64])
{
uint32_t somme_g = 0, somme_c = 0, somme_d = 0;
for (int ligne = 0; ligne < 8; ligne++) {
/* Colonnes 0-2 = gauche */
for (int col = 0; col < 3; col++) {
somme_g += matrix[ligne * 8 + col];
}
/* Colonnes 3-4 = centre */
for (int col = 3; col < 5; col++) {
somme_c += matrix[ligne * 8 + col];
}
/* Colonnes 5-7 = droite */
for (int col = 5; col < 8; col++) {
somme_d += matrix[ligne * 8 + col];
}
}
int moy_g = (int)(somme_g / 24); /* 8 lignes x 3 colonnes */
int moy_c = (int)(somme_c / 16); /* 8 lignes x 2 colonnes */
int moy_d = (int)(somme_d / 24); /* 8 lignes x 3 colonnes */
/* Trace des moyennes (équivalent LOG_DBG) */
printf("[DBG] Moyennes : gauche=%d, centre=%d, droite=%d\n",
moy_g, moy_c, moy_d);
int direction;
if (moy_g < moy_c && moy_g < moy_d) {
direction = -1; /* Obstacle à gauche */
} else if (moy_d < moy_c && moy_d < moy_g) {
direction = 1; /* Obstacle à droite */
} else {
direction = 0; /* Obstacle au centre ou rien */
}
/* Trace de la direction retournée */
printf("[DBG] Direction retournée : %d\n", direction);
return direction;
}
int main(void)
{
uint16_t matrix[64];
/* Cas 1 : obstacle à gauche (colonnes 0-2 proches) */
printf("=== Obstacle à gauche ===\n");
for (int i = 0; i < 64; i++) {
int col = i % 8;
matrix[i] = (col < 3) ? 200 : 800;
}
int dir = trouver_direction_obstacle(matrix);
printf("=> direction = %d (attendu -1)\n\n", dir);
/* Cas 2 : obstacle à droite (colonnes 5-7 proches) */
printf("=== Obstacle à droite ===\n");
for (int i = 0; i < 64; i++) {
int col = i % 8;
matrix[i] = (col >= 5) ? 150 : 900;
}
dir = trouver_direction_obstacle(matrix);
printf("=> direction = %d (attendu +1)\n\n", dir);
/* Cas 3 : aucun obstacle (tout loin) */
printf("=== Aucun obstacle ===\n");
for (int i = 0; i < 64; i++) {
matrix[i] = 2000;
}
dir = trouver_direction_obstacle(matrix);
printf("=> direction = %d (attendu 0)\n", dir);
return 0;
} Solution copiée dans l'éditeur.
ÉDITEUR | GCC 14.2 -Wall -Wextra -std=c17
Snippets :
SORTIE
Appuie sur Ctrl+Entrée pour compiler et exécuter.