• Aucun résultat trouvé

Chapitre 4: les fonctions en langage C

N/A
N/A
Protected

Academic year: 2022

Partager "Chapitre 4: les fonctions en langage C"

Copied!
82
0
0

Texte intégral

(1)

Cours donné par:

Pr. Nawal Alioua Année universitaire:

2019-202

(2)

Plan

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(3)

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(4)

Les fonctions en langage C

Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle traite des données et retourne un résultat à partir des valeurs des paramètres

Le langage C permet de découper un programme en plusieurs parties ou modules.

Laprogrammation modulaireest utile puisque :

Un programme écrit en un seul bloc devient dicile à lire dès qu'il dépasse une ou deux pages de texte.

Elle permet d'éviter des séquences d'instructions répétitives.

Elle permet le partage de codes communs qu'il sut d'écrire une seule fois.

La programmation modulaire consiste à utiliser des fonctions

Une fonction dispose d'arguments. C'est les informations transmises à la fonction.

(5)

Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle traite des données et retourne un résultat à partir des valeurs des paramètres

Le langage C permet de découper un programme en plusieurs parties ou modules.

Laprogrammation modulaireest utile puisque :

Un programme écrit en un seul bloc devient dicile à lire dès qu'il dépasse une ou deux pages de texte.

Elle permet d'éviter des séquences d'instructions répétitives.

Elle permet le partage de codes communs qu'il sut d'écrire une seule fois.

La programmation modulaire consiste à utiliser des fonctions

Une fonction dispose d'arguments. C'est les informations transmises à la fonction.

(6)

Les fonctions en langage C

Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle traite des données et retourne un résultat à partir des valeurs des paramètres

Le langage C permet de découper un programme en plusieurs parties ou modules.

Laprogrammation modulaireest utile puisque :

Un programme écrit en un seul bloc devient dicile à lire dès qu'il dépasse une ou deux pages de texte.

Elle permet d'éviter des séquences d'instructions répétitives.

Elle permet le partage de codes communs qu'il sut d'écrire une seule fois.

La programmation modulaire consiste à utiliser des fonctions

Une fonction dispose d'arguments. C'est les informations transmises à la fonction.

(7)

Le rôle d'une fonction en programmation est similaire à celui d'une fonction en mathématique : elle traite des données et retourne un résultat à partir des valeurs des paramètres

Le langage C permet de découper un programme en plusieurs parties ou modules.

Laprogrammation modulaireest utile puisque :

Un programme écrit en un seul bloc devient dicile à lire dès qu'il dépasse une ou deux pages de texte.

Elle permet d'éviter des séquences d'instructions répétitives.

Elle permet le partage de codes communs qu'il sut d'écrire une seule fois.

La programmation modulaire consiste à utiliser des fonctions

Une fonction dispose d'arguments. C'est les informations transmises à la fonction.

(8)

Les fonctions en langage C

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(9)

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(10)

Les fonctions en langage C

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(11)

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(12)

Les fonctions en langage C

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(13)

Une fonction peut prendre des aspects diérents:

- La valeur d'une fonction peut ne pas être utilisée. (Exemple: printf ou scanf, qui réalisent une action).

- Une fonction peutne pas fournir de valeur.

- Une fonction peut fournir un résultat non scalaire. (tableau par exemple)

- Une fonction peutmodier les valeurs de ses arguments (lorsque leur adresse est transmise) .

L'utilisation d'une fonction se fera par simple écriture de son nom dans le programme principale.

Le résultat étant une valeur, il devra être aecté ou utilisé dans une expression, un achage, ...

(14)

Exemple d'une fonction

Leprogramme principalcorrespond à la fonction main().

La fonction fexemple() possède une structure voisine de la fonction main, mais sonen-têtecontient en plus uneliste d'arguments(nom + type).

Les arguments correspondent aux données qui seront traitées par la fonction

(15)

Leprogramme principalcorrespond à la fonction main().

La fonction fexemple() possède une structure voisine de la fonction main, mais sonen-têtecontient en plus uneliste d'arguments(nom + type).

Les arguments correspondent aux données qui seront traitées par la fonction

(16)

Exemple d'une fonction

Leprogramme principalcorrespond à la fonction main().

La fonction fexemple() possède une structure voisine de la fonction main, mais sonen-têtecontient en plus uneliste d'arguments(nom + type).

Les arguments correspondent aux données qui seront traitées par la fonction

(17)

Les noms des arguments n'ont d'importance qu'à l'intérieur du corps de la fonction.

Dans le corps de la fonction, on a:

- La déclaration d'une variable locale à la fonction: oat val;

- L'instructionreturn val qui précise la valeur que fournira la fonction à la n de son travail

Dans le corps de la fonction main:

- On a la déclaration de la fonctionoat fexemple(oat, int, int);

- La déclaration d'une fonction porte le nom deprototype.

- Le rôle du prototype est de prévenir le compilateur que fexempleest une fonction, en spéciant le type de ses arguments et de sa valeur de retour.

Le prototype informe le compilateur que le code de la fonctionfexemple sera fournit par la suite dans le programme ou dans un autre chier .c

(18)

Explication de l'exemple

Les noms des arguments n'ont d'importance qu'à l'intérieur du corps de la fonction.

Dans le corps de la fonction, on a:

- La déclaration d'une variable locale à la fonction: oat val;

- L'instructionreturn val qui précise la valeur que fournira la fonction à la n de son travail

Dans le corps de la fonction main:

- On a la déclaration de la fonctionoat fexemple(oat, int, int);

- La déclaration d'une fonction porte le nom deprototype.

- Le rôle du prototype est de prévenir le compilateur que fexempleest une fonction, en spéciant le type de ses arguments et de sa valeur de retour.

Le prototype informe le compilateur que le code de la fonctionfexemple sera fournit par la suite dans le programme ou dans un autre chier .c

(19)

Les noms des arguments n'ont d'importance qu'à l'intérieur du corps de la fonction.

Dans le corps de la fonction, on a:

- La déclaration d'une variable locale à la fonction: oat val;

- L'instructionreturn val qui précise la valeur que fournira la fonction à la n de son travail

Dans le corps de la fonction main:

- On a la déclaration de la fonctionoat fexemple(oat, int, int);

- La déclaration d'une fonction porte le nom deprototype.

- Le rôle du prototype est de prévenir le compilateur que fexempleest une fonction, en spéciant le type de ses arguments et de sa valeur de retour.

Le prototype informe le compilateur que le code de la fonctionfexemple sera fournit par la suite dans le programme ou dans un autre chier .c

(20)

Plan

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(21)

Arguments muets(ou arguments formels ou paramètres formels):

- Noms des arguments gurant dans l'en-tête de la fonction

- Leur rôle est de décrire le travail eectué dans le corps de la fonction.

Arguments eectifs(ou paramètres eectifs):

- Arguments fournis au moment de l'appel de la fonction.

- Il est possible d'utiliserune expressioncomme argument eectif. C'est la valeur de cette expression qui sera transmise à la fonction lors de son appel.

(22)

Règles pour les fonctions

Arguments muets(ou arguments formels ou paramètres formels):

- Noms des arguments gurant dans l'en-tête de la fonction

- Leur rôle est de décrire le travail eectué dans le corps de la fonction.

Arguments eectifs(ou paramètres eectifs):

- Arguments fournis au moment de l'appel de la fonction.

- Il est possible d'utiliserune expressioncomme argument eectif. C'est la valeur de cette expression qui sera transmise à la fonction lors de son appel.

(23)

L'instruction returnpeut mentionner une expression. Par exemple:

L'instruction returnpeut apparaître à plusieurs reprisesdans une fonction, Par exemple:

L'instruction returndénit la valeur du résultat etarrête l'exécutionde la fonction en revenant dans la fonction qui l'a appelée.

(24)

Règles pour les fonctions

L'instruction returnpeut mentionner une expression. Par exemple:

L'instruction returnpeut apparaître à plusieurs reprisesdans une fonction, Par exemple:

L'instruction returndénit la valeur du résultat etarrête l'exécutionde la fonction en revenant dans la fonction qui l'a appelée.

(25)

L'instruction returnpeut mentionner une expression. Par exemple:

L'instruction returnpeut apparaître à plusieurs reprisesdans une fonction, Par exemple:

L'instruction returndénit la valeur du résultat etarrête l'exécutionde la fonction en revenant dans la fonction qui l'a appelée.

(26)

Règles pour les fonctions

Tous les modules en langage C sont des fonctions, y compris le programme principal (fonction main).

En langage C, la procédure n'existe pascomme notion indépendante.

Elle correspond tout simplement à une fonction qui ne fournit pas de valeur de retour:

- Elle peut soit disposer d'une ou plusieursreturnsans expression, qui arrêtent simplement l'exécution de la fonction

- Ou ne conteniraucune instructionreturn. Le retour est alors mis en place automatiquement par le compilateur à la n de la fonction (juste avant l'accolade fermente de la fonction }).

Si le type de l'expression gurant dans returnest diérent du type du résultat déclaré dans l'en-tête, le compilateur mettra automatiquement en place des instructions de conversion.

Il est toujours possible de ne pas utiliser le résultatd'une fonction, même si elle en produit un.

(27)

Tous les modules en langage C sont des fonctions, y compris le programme principal (fonction main).

En langage C, la procédure n'existe pascomme notion indépendante.

Elle correspond tout simplement à une fonction qui ne fournit pas de valeur de retour:

- Elle peut soit disposer d'une ou plusieursreturnsans expression, qui arrêtent simplement l'exécution de la fonction

- Ou ne conteniraucune instructionreturn. Le retour est alors mis en place automatiquement par le compilateur à la n de la fonction (juste avant l'accolade fermente de la fonction }).

Si le type de l'expression gurant dans returnest diérent du type du résultat déclaré dans l'en-tête, le compilateur mettra automatiquement en place des instructions de conversion.

Il est toujours possible de ne pas utiliser le résultatd'une fonction, même si elle en produit un.

(28)

Règles pour les fonctions

Tous les modules en langage C sont des fonctions, y compris le programme principal (fonction main).

En langage C, la procédure n'existe pascomme notion indépendante.

Elle correspond tout simplement à une fonction qui ne fournit pas de valeur de retour:

- Elle peut soit disposer d'une ou plusieursreturnsans expression, qui arrêtent simplement l'exécution de la fonction

- Ou ne conteniraucune instructionreturn. Le retour est alors mis en place automatiquement par le compilateur à la n de la fonction (juste avant l'accolade fermente de la fonction }).

Si le type de l'expression gurant dans returnest diérent du type du résultat déclaré dans l'en-tête, le compilateur mettra automatiquement en place des instructions de conversion.

Il est toujours possible de ne pas utiliser le résultatd'une fonction, même si elle en produit un.

(29)

Tous les modules en langage C sont des fonctions, y compris le programme principal (fonction main).

En langage C, la procédure n'existe pascomme notion indépendante.

Elle correspond tout simplement à une fonction qui ne fournit pas de valeur de retour:

- Elle peut soit disposer d'une ou plusieursreturnsans expression, qui arrêtent simplement l'exécution de la fonction

- Ou ne conteniraucune instructionreturn. Le retour est alors mis en place automatiquement par le compilateur à la n de la fonction (juste avant l'accolade fermente de la fonction }).

Si le type de l'expression gurant dans returnest diérent du type du résultat déclaré dans l'en-tête, le compilateur mettra automatiquement en place des instructions de conversion.

Il est toujours possible de ne pas utiliser le résultatd'une fonction, même si elle en produit un.

(30)

Règles pour les fonctions

Tous les modules en langage C sont des fonctions, y compris le programme principal (fonction main).

En langage C, la procédure n'existe pascomme notion indépendante.

Elle correspond tout simplement à une fonction qui ne fournit pas de valeur de retour:

- Elle peut soit disposer d'une ou plusieursreturnsans expression, qui arrêtent simplement l'exécution de la fonction

- Ou ne conteniraucune instructionreturn. Le retour est alors mis en place automatiquement par le compilateur à la n de la fonction (juste avant l'accolade fermente de la fonction }).

Si le type de l'expression gurant dans returnest diérent du type du résultat déclaré dans l'en-tête, le compilateur mettra automatiquement en place des instructions de conversion.

Il est toujours possible de ne pas utiliser le résultatd'une fonction, même si elle en produit un.

(31)

Quand une fonctionne renvoie pas de résultat, on le précise dans l'en-tête et dans sa déclaration, avec le mot-clévoid. Par exemple :

Naturellement, la dénition d'une telle fonction ne doit, en principe, conteniraucune instructionreturn. Certains compilateurs ne détecteront pas l'erreur.

Quand une fonction ne contientaucun argument, on place le mot-clé void à la place de la liste d'arguments. Par exemple :

(32)

Règles pour les fonctions

Quand une fonctionne renvoie pas de résultat, on le précise dans l'en-tête et dans sa déclaration, avec le mot-clévoid. Par exemple :

Naturellement, la dénition d'une telle fonction ne doit, en principe, conteniraucune instructionreturn. Certains compilateurs ne détecteront pas l'erreur.

Quand une fonction ne contientaucun argument, on place le mot-clé void à la place de la liste d'arguments. Par exemple :

(33)

Quand une fonctionne renvoie pas de résultat, on le précise dans l'en-tête et dans sa déclaration, avec le mot-clévoid. Par exemple :

Naturellement, la dénition d'une telle fonction ne doit, en principe, conteniraucune instructionreturn. Certains compilateurs ne détecteront pas l'erreur.

Quand une fonction ne contientaucun argument, on place le mot-clé void à la place de la liste d'arguments. Par exemple :

(34)

Plan

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(35)

Si on écrit le code de la fonctionfct AVANT le code de la fonctionmain, il n'est pas nécessaire d'inclure le prototype de fct dansmain.

. En eet, lorsque le compilateur traduitmain, il connaît déjàfct

Il est possible dans le prototype, d'écrire des noms d'arguments, choisis totalement au hasard et qui n'ont aucun rapport avec les

paramètres eectifs ou formels. Seul le type et le nombre des arguments sont importants et doivent être respectés dans le prototype

Les deux prototypes suivants sont valides:

- int fonction(int n, oat x);

- int fonction(int, oat);

(36)

Prototype d'une fonction

Si on écrit le code de la fonctionfct AVANT le code de la fonctionmain, il n'est pas nécessaire d'inclure le prototype de fct dansmain.

. En eet, lorsque le compilateur traduitmain, il connaît déjàfct

Il est possible dans le prototype, d'écrire des noms d'arguments, choisis totalement au hasard et qui n'ont aucun rapport avec les

paramètres eectifs ou formels. Seul le type et le nombre des arguments sont importants et doivent être respectés dans le prototype

Les deux prototypes suivants sont valides:

- int fonction(int n, oat x);

- int fonction(int, oat);

(37)

Si on écrit le code de la fonctionfct AVANT le code de la fonctionmain, il n'est pas nécessaire d'inclure le prototype de fct dansmain.

. En eet, lorsque le compilateur traduitmain, il connaît déjàfct

Il est possible dans le prototype, d'écrire des noms d'arguments, choisis totalement au hasard et qui n'ont aucun rapport avec les

paramètres eectifs ou formels. Seul le type et le nombre des arguments sont importants et doivent être respectés dans le prototype

Les deux prototypes suivants sont valides:

- int fonction(int n, oat x);

- int fonction(int, oat);

(38)

Prototype d'une fonction

Si on écrit le code de la fonctionfct AVANT le code de la fonctionmain, il n'est pas nécessaire d'inclure le prototype de fct dansmain.

. En eet, lorsque le compilateur traduitmain, il connaît déjàfct

Il est possible dans le prototype, d'écrire des noms d'arguments, choisis totalement au hasard et qui n'ont aucun rapport avec les

paramètres eectifs ou formels. Seul le type et le nombre des arguments sont importants et doivent être respectés dans le prototype

Les deux prototypes suivants sont valides:

- int fonction(int n, oat x);

- int fonction(int, oat);

(39)

Il est possible de placer lle prototype d'une fonction à l'intérieur de toute fonction l'utilisant.

Il est également possible d'utiliser des déclarations globales, en les faisant apparaître avant la dénition de la première fonction. Par exemple :

Le prototype de fexemple est connu à la foisde main et de fct1, car il est placé à l'extérieur et avant ces deux fonctions.

(40)

Comment placer les prototypes des fonctions?

Il est possible de placer lle prototype d'une fonction à l'intérieur de toute fonction l'utilisant.

Il est également possible d'utiliser des déclarations globales, en les faisant apparaître avant la dénition de la première fonction. Par exemple :

Le prototype de fexemple est connu à la foisde main et de fct1, car il est placé à l'extérieur et avant ces deux fonctions.

(41)

Il est possible de placer lle prototype d'une fonction à l'intérieur de toute fonction l'utilisant.

Il est également possible d'utiliser des déclarations globales, en les faisant apparaître avant la dénition de la première fonction. Par exemple :

Le prototype de fexemple est connu à la foisde main et de fct1, car il est placé à l'extérieur et avant ces deux fonctions.

(42)

Utilité de la déclaration des fonctions

La forme de déclaration de fonction la plus complète possible est le prototype:

C'est la forme recommandée pour les déclarations

Elle peut être utilisée par le compilateur de deux façons complètement diérentes:

- Si la dénition de la fonction se trouve dans le même chier source, il s'assure que les arguments formel sont bien letype déni dans le prototype . Dans le cas contraire, il signale une erreur.

- Lorsqu'il rencontre un appel de la fonction, et si cela est nécessaire, il met en placedes conversions des valeurs des arguments eectifs dans le type indiqué dans le prototype.

(43)

La forme de déclaration de fonction la plus complète possible est le prototype:

C'est la forme recommandée pour les déclarations

Elle peut être utilisée par le compilateur de deux façons complètement diérentes:

- Si la dénition de la fonction se trouve dans le même chier source, il s'assure que les arguments formel sont bien letype déni dans le prototype . Dans le cas contraire, il signale une erreur.

- Lorsqu'il rencontre un appel de la fonction, et si cela est nécessaire, il met en placedes conversions des valeurs des arguments eectifs dans le type indiqué dans le prototype.

(44)

Utilité de la déclaration des fonctions

La forme de déclaration de fonction la plus complète possible est le prototype:

C'est la forme recommandée pour les déclarations

Elle peut être utilisée par le compilateur de deux façons complètement diérentes:

- Si la dénition de la fonction se trouve dans le même chier source, il s'assure que les arguments formel sont bien letype déni dans le prototype . Dans le cas contraire, il signale une erreur.

- Lorsqu'il rencontre un appel de la fonction, et si cela est nécessaire, il met en placedes conversions des valeurs des arguments eectifs dans le type indiqué dans le prototype.

(45)

Un tel appel se traduit :

Évaluation de la valeur de l'expression n+1 (en int) et sa conversion en oat,

Évaluation de la valeur de l'expression 2*x (en oat) et sa conversion en int.

Dans ce dernier cas de conversion, on a une conversion dégradante. Ce qui signie qu'on perd les chires après la virgule

(46)

Exercices

Ecrire une fonction SommeCarre qui calcule la somme des carrées de deux réels x et y Ecrire une fonction Pair qui détermine si un nombre est pair

Ecrire un programme principal qui ache le résultat de ses deux fonctions, pour des valeurs saisies par l'utilisateur

(47)

Ecrire une fonction SommeCarre qui calcule la somme des carrées de deux réels x et y Ecrire une fonction Pair qui détermine si un nombre est pair

Ecrire un programme principal qui ache le résultat de ses deux fonctions, pour des valeurs saisies par l'utilisateur

(48)

Exercices

Ecrire une fonction SommeCarre qui calcule la somme des carrées de deux réels x et y Ecrire une fonction Pair qui détermine si un nombre est pair

Ecrire un programme principal qui ache le résultat de ses deux fonctions, pour des valeurs saisies par l'utilisateur

(49)

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(50)

Transmission des paramètres

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(51)

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(52)

Transmission des paramètres

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(53)

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(54)

Transmission des paramètres

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(55)

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(56)

Transmission des paramètres

Il existe deux modes de transmission de paramètres dans les langages de programmation :

La transmission par valeur :

les valeurs des paramètres eectifs sont aectées aux paramètres formels correspondants au moment de l'appel de la fonction.

Dans ce mode, le paramètre eectif ne subit aucune modication de la part de la fonction

La transmission par adresse (ou par référence) :

les adresses des paramètres eectifs sont transmises à la fonction.

Dans ce mode, le paramètre eectif subit les mêmes modications que le paramètre formel lors de l'exécution de la fonction

(57)

En C, les arguments d'une fonction sont transmis par valeur. Le résultat de l'exemple:

(58)

Passage des arguments

En C, les arguments d'une fonction sont transmis par valeur. Le résultat de l'exemple:

- avant appel : 10 20 -début echange : 10 20

(59)

Explication de l'exemple:

Lors de l'appel deechange, unetransmission des valeurs denetpest eectuée.

Ces valeurs ont étérecopiées localementdans la fonctionechange dans des emplacements nommésaetb.

La fonctionechangea opérée sur ces copies, et les valeurs des variables net

pn'ont pas été modiées.

Passage par adresse en langage C:

Lorsqu'on souhaite eectuer un passage par adresse en langage C, il faudra passer l'adresse de la variable comme paramètre (&x et non pas x)

Il est donc nécessaire d'utiliserles pointeursdans la déclaration et le corps de la fonction.

Les pointeurs sont des variables qui stockent des adresses (étudiés en semestre 3)

(60)

Plan

1 Introduction

2 Règles générales

3 Prototype ou déclaration d'une fonction)

4 Passage des arguments

5 Variables globales Vs variables locales

(61)

En C, plusieurs fonctions (dont la fonction main) peuvent partager des variables communes qu'on qualie alors de variables globales.

Résultat: Bonjour 1 fois, Bonjour 2 fois, Bonjour 3 fois

(62)

Variables globales

En C, plusieurs fonctions (dont la fonction main) peuvent partager des variables communes qu'on qualie alors de variables globales.

Résultat: Bonjour 1 fois, Bonjour 2 fois, Bonjour 3 fois

(63)

Les variablesnetxsont accessibles àfct1, mais pas aumain.

Les variables globalesne sont connues du compilateurque dans la partie du code source qui suit leur déclaration. Leur portée(ou espace de validité) est limitée à la partie du code qui suit leur déclaration.

Les variables globales existent pendant toute l'exécutiondu code dans lequel elles apparaissent.

On peut déclarer des variables globales à n'importe quel endroit du code (extérieur aux fonctions). Mais, pour plus de lisibilité, il est préférable de les regrouper au début du programme source.

Ces variables sont initialisées par défaut à zéro par le compilateur.

(64)

Variables globales

Les variablesnetxsont accessibles àfct1, mais pas aumain.

Les variables globalesne sont connues du compilateurque dans la partie du code source qui suit leur déclaration. Leur portée(ou espace de validité) est limitée à la partie du code qui suit leur déclaration.

Les variables globales existent pendant toute l'exécutiondu code dans lequel elles apparaissent.

On peut déclarer des variables globales à n'importe quel endroit du code (extérieur aux fonctions). Mais, pour plus de lisibilité, il est préférable de les regrouper au début du programme source.

Ces variables sont initialisées par défaut à zéro par le compilateur.

(65)

Les variablesnetxsont accessibles àfct1, mais pas aumain.

Les variables globalesne sont connues du compilateurque dans la partie du code source qui suit leur déclaration. Leur portée(ou espace de validité) est limitée à la partie du code qui suit leur déclaration.

Les variables globales existent pendant toute l'exécutiondu code dans lequel elles apparaissent.

On peut déclarer des variables globales à n'importe quel endroit du code (extérieur aux fonctions). Mais, pour plus de lisibilité, il est préférable de les regrouper au début du programme source.

Ces variables sont initialisées par défaut à zéro par le compilateur.

(66)

Variables globales

Les variablesnetxsont accessibles àfct1, mais pas aumain.

Les variables globalesne sont connues du compilateurque dans la partie du code source qui suit leur déclaration. Leur portée(ou espace de validité) est limitée à la partie du code qui suit leur déclaration.

Les variables globales existent pendant toute l'exécutiondu code dans lequel elles apparaissent.

On peut déclarer des variables globales à n'importe quel endroit du code (extérieur aux fonctions). Mais, pour plus de lisibilité, il est préférable de les regrouper au début du programme source.

Ces variables sont initialisées par défaut à zéro par le compilateur.

(67)

Les variables dénies à l'intérieur d'une fonction (qui peut être main), sont diteslocales à la fonction dans laquelle elles sont déclarées.

La portéedes variables locales est limitée à la fonction où elles sont déclarées.

Les variables locales n'ont aucun lien avec des variables globales de même nom ou avec d'autres variables locales à d'autres fonctions.

(68)

Les variables locales

Les variables dénies à l'intérieur d'une fonction (qui peut être main), sont diteslocales à la fonction dans laquelle elles sont déclarées.

La portéedes variables locales est limitée à la fonction où elles sont déclarées.

Les variables locales n'ont aucun lien avec des variables globales de même nom ou avec d'autres variables locales à d'autres fonctions.

(69)

Les variables dénies à l'intérieur d'une fonction (qui peut être main), sont diteslocales à la fonction dans laquelle elles sont déclarées.

La portéedes variables locales est limitée à la fonction où elles sont déclarées.

Les variables locales n'ont aucun lien avec des variables globales de même nom ou avec d'autres variables locales à d'autres fonctions.

(70)

Les variables locales

Les variables dénies à l'intérieur d'une fonction (qui peut être main), sont diteslocales à la fonction dans laquelle elles sont déclarées.

La portéedes variables locales est limitée à la fonction où elles sont déclarées.

Les variables locales n'ont aucun lien avec des variables globales de même nom ou avec d'autres variables locales à d'autres fonctions.

La variable pdemainn'a aucun rapport avec la variable pdefct1.

De même, la variable ndefct1n'a aucun rapport avec la variable globale n.

Notez qu'il est alors IMPOSSIBLE, dans la

(71)

Les variables locales ont unedurée de vie limitéeà celle de l'exécution de la fonction dans laquelle elles gurent.

Leurs emplacementsne sont pas dénis de manière permanente comme ceux des variables globales.

Un nouvel espace mémoireleur est alloué à chaque entrée dans la fonction et libéré à chaque sortie. Il est donc diérent d'un appel au suivant.

Les valeurs transmises en arguments à une fonction sont traitées de la même manière que les variables locales. Leur durée de vie correspond également à celle de la fonction.

(72)

Les variables locales

Les variables locales ont unedurée de vie limitéeà celle de l'exécution de la fonction dans laquelle elles gurent.

Leurs emplacementsne sont pas dénis de manière permanente comme ceux des variables globales.

Un nouvel espace mémoireleur est alloué à chaque entrée dans la fonction et libéré à chaque sortie. Il est donc diérent d'un appel au suivant.

Les valeurs transmises en arguments à une fonction sont traitées de la même manière que les variables locales. Leur durée de vie correspond également à celle de la fonction.

(73)

Les variables locales ont unedurée de vie limitéeà celle de l'exécution de la fonction dans laquelle elles gurent.

Leurs emplacementsne sont pas dénis de manière permanente comme ceux des variables globales.

Un nouvel espace mémoireleur est alloué à chaque entrée dans la fonction et libéré à chaque sortie. Il est donc diérent d'un appel au suivant.

Les valeurs transmises en arguments à une fonction sont traitées de la même manière que les variables locales. Leur durée de vie correspond également à celle de la fonction.

(74)

Les variables locales

Les variables locales ont unedurée de vie limitéeà celle de l'exécution de la fonction dans laquelle elles gurent.

Leurs emplacementsne sont pas dénis de manière permanente comme ceux des variables globales.

Un nouvel espace mémoireleur est alloué à chaque entrée dans la fonction et libéré à chaque sortie. Il est donc diérent d'un appel au suivant.

Les valeurs transmises en arguments à une fonction sont traitées de la même manière que les variables locales. Leur durée de vie correspond également à celle de la fonction.

(75)

Il est possible d'attribuer un emplacement permanent à une variable locale pour conserver sa valeur d'un appel au suivant.

Il sut de déclarer la variable avec le mot-cléstatic.

staticsans indication de type est équivalent à static int. Résultat: appel 1, appel 2, appel 3

(76)

Les variables locales

Il est possible d'attribuer un emplacement permanent à une variable locale pour conserver sa valeur d'un appel au suivant.

Il sut de déclarer la variable avec le mot-cléstatic.

staticsans indication de type est équivalent à static int. Résultat: appel 1, appel 2, appel 3

(77)

Il est possible d'attribuer un emplacement permanent à une variable locale pour conserver sa valeur d'un appel au suivant.

Il sut de déclarer la variable avec le mot-cléstatic.

staticsans indication de type est équivalent à static int. Résultat: appel 1, appel 2, appel 3

(78)

Les variables locales

Il est possible d'attribuer un emplacement permanent à une variable locale pour conserver sa valeur d'un appel au suivant.

Il sut de déclarer la variable avec le mot-cléstatic.

staticsans indication de type est équivalent à static int. Résultat: appel 1, appel 2, appel 3

(79)

Comme pour les variables globales, les variables locales statiques sont, par défaut initialisées à zérocar le compilateur.

Les variables locales n'ont pas de valeur par défaut

Il ne faut pas confondre une variable locale statique avec une variable globale: la portée de la premièrereste toujours limitée à la fonction dans laquelle elle est dénie.

(80)

Les variables locales

Comme pour les variables globales, les variables locales statiques sont, par défaut initialisées à zérocar le compilateur.

Les variables locales n'ont pas de valeur par défaut

Il ne faut pas confondre une variable locale statique avec une variable globale: la portée de la premièrereste toujours limitée à la fonction dans laquelle elle est dénie.

(81)

Comme pour les variables globales, les variables locales statiques sont, par défaut initialisées à zérocar le compilateur.

Les variables locales n'ont pas de valeur par défaut

Il ne faut pas confondre une variable locale statique avec une variable globale: la portée de la premièrereste toujours limitée à la fonction dans laquelle elle est dénie.

(82)

Conclusion

Dans ce chapitre, nous avons étudié, en langage C:

La déclaration d'une fonction

L'utilisation d'une fonction dans un programme principal le passage des paramètres par valeur et par adresse la notion de variable locale et globale

Références

Documents relatifs

Le but du problème 1 est l'étude du coecient de corrélation linéaire de deux variables aléatoires qu'on aborde d'abord de façon générale (partie I), puis dans un cas

[r]

[r]

 Les variables déclarées au début de la fonction principale main ne sont pas des variables globales, mais elles sont locales à main.  Une variable locale cache la variable

Dérivées

— Si F: X -> Y est un morphisme sans éclatement en codimension zéro, si © est une forme différentielle C°° sur X à support Y-propre, de type (n, n) dans le cas complexe, de

Ce théorème rappelle le théorème des bornes pour des fonctions de R dans R : "Toute fonction d’une variable continue sur un segment est bornée et atteint ses bornes"..

mais ici la variable cpt est globale et peut donc être modifiée inconsidérément par une autre fonction, ou entrer en conflit avec un autre objet de même nom, tandis que dans la