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