Affichage des articles dont le libellé est C. Afficher tous les articles
Affichage des articles dont le libellé est C. Afficher tous les articles

25 septembre 2006

Comment définir une structure qui pointe sur elle-même en utilisant typedef ?

Il y a plusieurs façons correctes de le faire, le problème est que dans la définition de la structure avec un typedef, le type n'est pas encore défini.

Une solution consiste à déclarer le type de la structure avant sa définition, avec un pointeur :

    typedef struct s_cell * p_cell;
typedef struct s_cell {
int info;
p_cell next;
} cell;

on peut ensuite délcarer naturellement deux variables :

cell cellule;
p_cell p_cellule;

Détecter les erreurs de mémoire au moment de l'exécution d'un programme

On peut utiliser le logiciel Valgrind sous linux, il aide notamment a détecter :

  • Utilisation des places - mémoire non-initialisées ;
  • Lecture/écriture des places - mémoire libérées auparavant ;
  • Lecture/écriture au-delà des blocks alloués ;
  • Lecture/écriture à des endroits inappropriés de la pile ;
  • Fuites de mémoire ;
  • Vérification des paires malloc/new/new [] et free/delete/delete [] ;
  • Quelques erreurs d'utilisation des POSIX pthreads ;

Utilisation :

valgrind [options.valgrind] votre-prog [options.programme]
Exemple :
valgrind --leak-check=yes --show-reachable=yes ./add 1 2 3 

-> lire une petite introduction rapide

http://www.cprogramming.com/debugging/valgrind.html

Un outil similaire pour Windows : http://www-01.ibm.com/software/awdtools/purify/

22 septembre 2006

Makefile automatique

Voici un makefile générique qui compile tout les fichier source d'un répertoire

WARN = -W -Wall -Wnested-externs -Wpointer-arith -Winline -Wcast-qual -Wcast-align -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow
CFLAGS = --std=c99 -pedantic $(WARN)

OPTIMISE = yes
DEBUG = yes

ifeq ($(DEBUG), yes)
CFLAGS += -ggdb
endif

ifeq ($(OPTIMISE), yes)
CFLAGS += -O2
endif

CC=gcc
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
PROJET = projet

all: $(PROJET)

$(PROJET): $(OBJ)
$(CC) -o $(PROJET) $(OBJ) $(CFLAGS)

%.o : %.c %.h
@echo -e "CC\t" $< "\t" $@ @$(CC) -o $@ -c $< $(CFLAGS) %.o : %.c @echo -e "CC\t" $< "\t" $@ @$(CC) -o $@ -c $< $(CFLAGS) clean: rm -rf $(OBJ) $(PROJET) @if [ -f core ] ; then rm -f core; echo "rm core" ;fi mrproper: clean rm -rf *~

archive: mrproper
cd .. && tar cjvf $(PROJET)-`date +%d%B%y-%Hh%Mm%Ss`.tar.bz2 `basename $(PWD)`

On peut changer le contenu de la variable PROJET pour changer le nom de l'executable.

Quelques explications :

  • La fonction wildcard permet de sélectionner tout les fichier sources
  • Un @ signifie que la commande ne sera pas affichée
  • On utilise une variable comme cela : $(VAR)
  • Des regles générique sont déclarée à l'aide des %.o
  • OBJ= $(SRC:.c=.o) génére le liste des fichier objet
  • Quelques variables prédéfinies :
    $@ Le nom de la cible
    $< Le nom de la première dépendance
    $^ La liste des dépendances
    $? La liste des dépendances plus récentes que la cible
    $* Le nom du fichier sans suffixe