LIF12-Syst`emes d`Exploitation Rappel En C - I En C - II R
Transcription
LIF12-Syst`emes d`Exploitation Rappel En C - I En C - II R
Pointeurs en C Pointeurs en C Rappel On vous a appris que les arguments d’une fonction pouvaient être de deux types : ◮ Données ◮ Arguments-résultats Une fonction qui prend 2 entiers et calcule la somme et le produit : LIF12-Systèmes d’Exploitation Pointeurs, man, . . . v o i d so m pro d ( i n t a , i n t b , i n t &som , i n t &mul ) { som = a+b ; mul = a ∗b ; } i n t main ( ) { i n t som , mul ; so m pro d ( 2 , 3 , som , mul ) ; J.C. Iehl/J.Bonneville/F. Rico séance 1 Pour les données on utilise le passage par valeur et pour les données-résultats, le passage par adresse (référence). . . Mais pas en C. logo J.C. Iehl/J.Bonneville/F. Rico Pointeurs en En C C LIF12 - 1/13 J.C. Iehl/J.Bonneville/F. Rico Règles Méthodes Un peu plus compliqué Pointeurs en -I En La référence est une notion du C++ en C il n’existe que le passage par valeur. Pour simuler le passage par adresse on utilise un pointeur. - II 2. elle a besoin d’un tableau 3. elle a besoin d’une donnée-résultat Example int fscanf (FILE ∗f ,const char ∗format,void ∗val1 , void ∗val2 , ...) ◮ f est un pointeur sur une structure de fichier ◮ format est une chaı̂ne (un tableau) de caractères représentant le format de lecture Cela oblige l’utilisateur d’une librairie (vous) à faire la différence entre les données et les arguments-résultats C Règles Méthodes Un peu plus compliqué 1. elle a réellement besoin d’un pointeur i n t main ( ) { i n t som , mul ; so m pro d (2 ,3 ,& som , &mul ) ; ... Pointeurs en LIF12 - 2/13 Une fonction demande un pointeur pour 3 raisons : v o i d so m pro d ( i n t a , i n t b , i n t ∗som , i n t ∗ mul ) { ∗som = a+b ; ∗ mul = a ∗b ; } J.C. Iehl/J.Bonneville/F. Rico C C ◮ logo val1 , val2 sont les adresses des variables qu’on lit LIF12 - 3/13 J.C. Iehl/J.Bonneville/F. Rico Règles Méthodes Un peu plus compliqué Pointeurs en Règle n˚1 C LIF12 - 4/13 Règles Méthodes Un peu plus compliqué Une variable qui sert de données doit toujours avoir une valeur cohérente. #i n c l u d e <s t d i o . h> #i n c l u d e <s t d i o . h> #i n c l u d e <s t d l i b . h> v o i d main ( v o i d ) { int ∗ res ; v o i d main ( v o i d ) { int res ; FILE ∗ f = ( FILE ∗ ) m a l l o c ( s i z e o f ( FILE ) ) ; f p r i n t f ( s t d o u t , " Donnez un nombre \n" ) ; f s c a n f ( s t d i n , "%d\n" , r e s ) ; // e r r e u r r e s p o i n t e n ’ i m p o r t e où en mémoire f p r i n t f ( s t d o u t , "la valeur est %d" , ∗ r e s ) ; f p r i n t f ( s t d o u t , " Donnez un nombre \n" ) ; f s c a n f ( f , "%d\n" , &r e s ) ; // e r r e u r f n ’ e s t p a s un bon f i c h i e r f p r i n t f ( s t d o u t , "la valeur est %d" , &r e s ) ; } Sinon, le programme fait une erreur de segmentation ou pire } logo J.C. Iehl/J.Bonneville/F. Rico Pointeurs en C logo LIF12 - 5/13 J.C. Iehl/J.Bonneville/F. Rico Règles Méthodes Un peu plus compliqué Pointeurs en fscanf Pour chaque argument, il faut savoir : ◮ si l’argument est : ◮ ◮ ◮ ◮ ◮ C LIF12 - 6/13 Règles Méthodes Un peu plus compliqué -I int fscanf( FILE *stream, const char *format, void *val1, ...) un pointeur un tableau une simple variable passée par adresse Les fonctions de la famille scanf() analysent leurs entrées conformément au format décrit plus bas. Ce format peut contenir des indicateurs de conversion. Les résultats des conversions, s’il y en a, sont stockés dans des endroits pointés par des arguments pointeurs qui suivent le format. ... fscanf() lit ses entrées depuis le flux pointé par stream . . . si l’argument est utilisé comme : ◮ logo Règle n˚2 Un pointeur doit toujours pointer sur une zone mémoire. ◮ logo Une donnée Un résultat Une donnée et un résultat Pour cela il faut lire la documentation. logo J.C. Iehl/J.Bonneville/F. Rico LIF12 - 7/13 logo J.C. Iehl/J.Bonneville/F. Rico LIF12 - 8/13 Pointeurs en fscanf C Règles Méthodes Un peu plus compliqué Pointeurs en - II ◮ fscanf Règles Méthodes Un peu plus compliqué - III stream est un pointeur et sert de donnée et de résultat (un flux est modifié par la lecture). Il faut utiliser une variable pointeur et lui donner une valeur ◮ FILE ∗ f ; f = f o p e n ( " monfichier" , "r" ) ; ◮ C Les arguments suivant sont des variables passées par adresse car ce sont des résultats. On peut utiliser un pointeur pointant sur une zone mémoire réservée, ou l’adresse d’une variable. int a ; char ∗ b u f f = ( c h a r ∗ ) m a l l o c (1 0 0 ∗ s i z e o f ( c h a r ) ) ; f s c a n f ( f , "%s %d\n" , b u f f , &a ) ; format est un tableau et sert uniquement de donnée. Il faut une variable contenant une donnée cohérente ou une chaine fixe f s c a n f ( f , "%s %d\n" . . . logo J.C. Iehl/J.Bonneville/F. Rico Pointeurs en C logo LIF12 - 9/13 J.C. Iehl/J.Bonneville/F. Rico Règles Méthodes Un peu plus compliqué Pointeurs en C LIF12 - 10/13 Règles Méthodes Un peu plus compliqué void ∗ Là où ça se complique Les tableau n’existent pas en C. Ils sont eux aussi simulé par des pointeurs. Example pour le compilateur, tout type peut être automatiquement transtypé en void ∗. void∗ sert donc dans les cas où l’on ne connait pas le type. Chaines de caractères int a ; char b u f f [ 1 0 0 ] ; f s c a n f ( f , "%s %d\n" , b u f f , &a ) ; Example size t fread (void ∗ptr , size t size , size t nmemb, FILE ∗stream); La fonction int pipe(int pipefd [2]) sert à créer un canal de communication entre deux processus Example int pipefd [ 2 ] ; pipe ( pipefd ) ; logo J.C. Iehl/J.Bonneville/F. Rico Pointeurs en C LIF12 - 11/13 J.C. Iehl/J.Bonneville/F. Rico Règles Méthodes Un peu plus compliqué Une fonction est elle même un pointeur. Grâce à cela certaine fonctions peuvent utiliser d’autres fonctions en paramètre. Example void (∗ s i g h a n d l e r t ) ( i n t ) ; s i g h a n d l e r t s i g n a l ( i n t signum , sighandler t handler ); Permet à un programme d’appeler la fonction handler quand le signal signum est reçut. v o i d m a f o n c t i o n ( i n t num) { f p r i n t f ( s t d e r r , "signal numéro %d\n" , num ) ; } i n t main ( ) { s i g n a l ( SIGINT , m a f o n c t i o n ) ; } logo J.C. Iehl/J.Bonneville/F. Rico LIF12 - 13/13 logo LIF12 - 12/13