Introduction

Introduction

La bibliothèque standard C offre une pléthore de fonctions pour de nombreuses tâches habituelles. Il existe également de nombreuses bibliothèques pour des fonctionnalités supplémentaires, comme l'interfaçage de la base de données (GTK +) ou l'interfaçage (LIBPQ). Cependant, à mesure que vous avancez dans le monde de la programmation C, vous vous retrouverez bientôt à répéter les mêmes instructions dans le même ordre encore et encore et cela deviendra long et inefficace. Afin que vous puissiez simplement envelopper toutes ces instructions dans une fonction et juste appel Cette fonction de ladite quand vous en avez besoin. Voici ce que vous allez apprendre en lisant cet article, ainsi que quelques conseils utiles qui vous faciliteront la vie.

Créer vos fonctions

Pour un simple début, disons que vous voulez écrire une calculatrice. Nous ne nous concentrerons pas sur l'interface (GUI vs malédises vs argot vs cli) car nous sommes intéressés par les internes. Ce serait maladroit de pas Créez une fonction pour chaque opération que vous décidez de soutenir, sauf s'il y en a déjà une, comme Pow (), définie en mathématiques.h, qui renvoie le résultat d'une base soulevée à une puissance. Ainsi, par exemple, pour l'addition, vous aurez une fonction nommée Add () qui en prend deux arguments, du moins pour l'instant, et Retour le résultat. Ainsi, lorsque l'utilisateur choisit d'ajouter le (s) numéro (s) qu'il a présenté, vous appel la fonction avec les chiffres que l'utilisateur est entré et vous n'avez pas besoin de vous soucier de rien d'autre. Ces trois termes que j'ai écrits en italique sont essentiels pour comprendre les fonctions. Une fonction généralement (mais pas toujours) prend quelque chose, fait un certain nombre d'opérations sur ce quelque chose et crache le résultat. «Pas toujours» parce que main (), comme vous pouvez le voir auparavant, peut être appelé sans arguments, et il y a aussi d'autres exemples. Mais pour l'instant, concentrons-nous sur nos exemples. Les chiffres qui doivent être confrontés sont les arguments, que «quelque chose» que vous donnez à la fonction de traitement. La partie de traitement est dans le corps de la fonction, lorsque vous lui dites d'ajouter les nombres ensemble. Après cela, la partie «cracher» est appelée renvoyer une valeur, qui est, dans notre cas, le résultat de l'addition.

Voyons ce dont nous avons parlé dans un exemple pratique:

#inclure  / * Ceci contient la définition de printf () * / double add (double x, double y); int main () float premier, deuxième; printf ("Veuillez saisir le premier numéro.\ n "); scanf ("% f ", & premier); printf (" Veuillez saisir le deuxième numéro.\ n "); scanf ("% f ", & second); double add (double a, double b)  retour a + b;  printf ("Le résultat de l'ajout est% f \ n", add (premier, deuxième)); retour 0; 

Le code ci-dessus, bien que simpliste au mieux, nous aide à souligner précisément ce dont nous avons parlé avant. Nous déclarons d'abord la fonction, avant main (), et le but est de connaître le nom, le type des arguments et le type que la fonction renvoie. Cette ligne est également appelée définir le prototype de fonction. Comme vous pouvez le voir, les noms des arguments de la déclaration ne doivent pas être les mêmes que ceux utilisés dans la définition, mais si cela vous dérange, utilisez un schéma de dénomination constant, tout va bien. Avant d'utiliser la fonction, nous devons le définir, comme pour dire au monde ce que c'est exactement qu'il fait. Même si le corps de la fonction est unique, tout comme dans notre exemple, il est préférable que vous utilisiez des accolades pour la lisibilité et pour une bonne habitude. Ici, tout ce que fait la fonction est de renvoyer le résultat de l'addition entre deux nombres.

Nous vous suggérons d'utiliser des noms pour des fonctions, des arguments et des variables ou des constantes ordinaires qui reflètent ce qu'ils font, encore une fois pour une bonne habitude et pour épargner les programmeurs en lisant votre code, la variable «xyzgth» fait ou est utilisée pour. Aussi, Utiliser des commentaires. Même si dans le code ci-dessus peut sembler exagéré, ils ne sont pas. Lorsque vous regardez le code deux mois plus tard, vous n'aurez aucune idée de ce qui vous était en tête lorsque vous avez écrit le code. Alors utilisez et abusent des commentaires, ils vous sauveront, croyez-moi.

Exercer

Il existe des fonctions qui peuvent accepter un nombre variable d'arguments, comme printf () par exemple. Vous êtes autorisé à utiliser Google pour voir ce qu'ils font et essayer de réécrire la fonction ADD () pour accepter plus de deux arguments, ou créer une autre fonction. Vous pouvez également utiliser «Man 3 printf».


Nous vous avons dit avant que Main () puisse être appelé sans arguments. Bien sûr, cela signifie qu'il peut également être appelé avec des arguments. Quand est-ce utile? Dans des programmes simples comme le nôtre, puisque nous les appelons sans arguments, les parenthèses de Main () sont vides. Mais lorsque vos programmes se développeront en complexité, surtout s'ils seront orientés vers la ligne de commande, vous devrez ajouter la fonctionnalité des arguments, comme le drapeau -v de GCC qui imprime la version. Lorsque de telles fonctionnalités sont souhaitées, Main () doit avoir des arguments, deux pour être précis. La fonction principale devient

int main (int argc, char ** argv) …

Avant de paniquer sur les noms cryptiques et les doubles astérisques, attendez que vous obteniez l'explication, ce qui est en fait simple. Le premier argument est un entier nommé Argc, et le nom provient du «nombre d'arguments». Un peu mieux, à droite? À propos du deuxième argument… eh bien, le nom signifie «Argument Vector» officiellement et c'est un pointeur vers un pointeur vers un char. Maintenant, en anglais, tandis que Argc stocke le nombre d'arguments, Argv stocke les arguments comme une série de cordes. La partie «pointeur vers…» sera expliquée dans la prochaine partie de l'article, pour l'instant tout ce que vous devez savoir, c'est que si, par exemple, l'utilisateur tapera trois arguments au programme, index Zero of Argv sera le nom du programme lui-même, index on stockera le premier argument au programme et ainsi de suite. C'est ainsi que vous pouvez utiliser un commutateur / cas pour vérifier les arguments transmis à vos programmes. Avant de vous donner un court exemple, nous nous sentons obligés de vous dire que Main a deux arguments tels que définis par la norme, et c'est ainsi qu'il est utilisé sur la plupart des systèmes Linux et Unix. Cependant, si vous travaillerez (vous) sur Windows ou Darwin, Main () aura un ou deux arguments supplémentaires, mais ceux-ci dépendent du système et ne sont donc pas définis ou requis par la norme. De plus, «char ** argv» pourrait également être écrit comme «char * argv []». Vous verrez les deux, selon la préférence du développeur.

Vous vous souvenez peut-être que nous vous avons dit dans la première partie de notre série comment nous allons utiliser le programme Yest de Kimball Hawkins pour des exemples. Il est temps que nous commencions, alors voici comment Yest traite une partie de la possible entrée utilisateur:

si (strncmp (argv [i], "- help", 6) == 0 || strncmp (argv [i], "-?", 2) == 0 || strncmp (argv [i],"?", 1) == 0 || strncmp (argv [i]," help ", 4) == 0) yest_help (); / * aide demandée, affichez-la * / si (strncmp (argv [i], "--version", 9) == 0 || strncmp (argv [i], "--license", 9) == 0) yest_version (); / * Informations sur la version / licence demandée * /

Vous pouvez voir dans ce code comment Kimball commente son code, bien que le nom des fonctions qu'il appelle - yest_help () et yest_version () - soient assez explicites. La fonction standard strncmp (), à trouver dans la chaîne.H, compare deux chaînes, dans notre cas Argv [i] et «Aide», par exemple, mais seulement les premiers caractères X (4 dans la ligne «Help») et renvoie zéro si la première chaîne correspond à la seconde.

Exercer

Comment utiliseriez-vous Switch / Case pour vérifier si le premier argument est «-help» et le second est «-Version»? Ces options peuvent-elles être utilisées ensemble? Comment le code différerait-il?

Choses à savoir

C ne vous permet pas de définir une fonction à l'intérieur d'un autre, avec l'exception main (), qui est, comme nous pouvons le voir, spécial. Sachez également que ce que vous définissez dans une fonction «vit» à l'intérieur d'une fonction uniquement. Vous pouvez donc avoir une variable nommée «A» définie dans trois fonctions différentes sans aucun problème, mais cela peut entraîner des problèmes dans des programmes plus importants, nous ne le recommandons donc pas.

Fichiers d'en-tête personnalisés

Comme vos programmes deviendront de plus en plus grands, vous trouverez la nécessité de les diviser. Vous pouvez avoir plus d'un fichier source, mais vous pouvez également écrire vos propres en-têtes. Donc, pour revenir à notre programme d'ajout, vous pouvez créer un en-tête nommé opérations.H qui aura la ligne «Double Add (double x, double y);», donc votre programme ne traitera que de la définition, la partie où vous dites que Add () retournera un + B. Y compris votre en-tête personnalisé se fait tout comme vous incluez ceux installés par système avec une exception importante: n'oubliez pas d'utiliser des citations doubles au lieu de supports d'angle, comme ceci: «#include» Opérations.h ””. Cet en-tête peut être placé dans le répertoire où les autres fichiers source sont stockés ou dans un autre chemin, spécifié comme argument à GCC afin qu'il sache où chercher. Les fichiers d'en-tête peuvent contenir également des définitions de constantes (avec #define) ou d'autres déclarations, tant que vous savez qu'elles seront utilisées dans chaque fichier source du programme. Ce n'est pas obligatoire, c'est juste une bonne pratique. Alors, comment rédigeriez-vous une calculatrice qui ne traite que des opérations arithmétiques de base et utilise des en-têtes?

Fonctions récursives

Comme nous nous attendons à ce que vous ayez des antécédents de programmation, nous sommes certains que vous savez quelles sont les fonctions récursives et comment / quand les utiliser. C'est pourquoi ce sous-chapitre sera plus court qu'il ne le serait normalement. Bref, on dit qu'une fonction est récursive quand elle s'appelle s'appeler. Bien que le concept puisse être intimidant pour les nouveaux programmeurs, une récursivité de manière plus simple et plus réelle peut être expliquée: essayez de vous asseoir entre deux miroirs face à face. L'effet que vous voyez est une représentation visuelle de la récursivité. Mais nous vous donnerons un court exemple, afin que vous compreniez mieux quand et comment l'utiliser. Vous vous souvenez probablement de l'école quand on vous a enseigné les factoriels. Un factoriel est le produit d'un entiers entièrement plus petit que lui ou égal, tant qu'ils sont supérieurs à zéro. La notation pour cela est un signe d'exclamation, donc 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720. Comment pouvons-nous le faire en C de la manière la plus efficace? Bien sûr, en utilisant la récursivité.

int factorial (int n °)  si(nombre <= 1) retour 1; autre retour Numéro * factoriel (numéro-1)

Conclusion

Nous vous recommandons d'utiliser des fonctions aussi souvent que possible et de mettre leurs prototypes dans les fichiers d'en-tête aussi souvent, car votre code sera plus organisé et votre travail deviendra plus facile. En parlant d'en-têtes, nous le laissons comme un exercice final pour commencer à lire le fichier d'en-tête définissant les opérations mathématiques (mathématiques.h) pour avoir une idée à quoi ça ressemble et ce qu'il contient. Puis utilisez-le afin d'améliorer la calculatrice avec certaines fonctionnalités améliorées au-delà des bases.

Voici ce à quoi vous pouvez vous attendre ensuite:

  • je. C Développement sur Linux - Introduction
  • Ii. Comparaison entre C et d'autres langages de programmation
  • III. Types, opérateurs, variables
  • Iv. Contrôle de flux
  • V. Les fonctions
  • Vi. Pointeurs et tableaux
  • Vii. Structure
  • Viii. E / S de base
  • Ix. Style de codage et recommandations
  • X. Construire un programme
  • Xi. Emballage pour Debian et Fedora
  • Xii. Obtenir un forfait dans les référentiels officiels Debian

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Masterring Bash Script Loops
  • Choses à installer sur Ubuntu 22.04
  • Ubuntu 20.04 Guide
  • Tutoriel SQLite Linux pour les débutants
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Comment doubler Kali Linux et Windows 10