C/Funcións: Diferenzas entre revisións

Contido eliminado Contido engadido
Gallaecio (conversa | contribucións)
m Bot: Cambios estética
 
Liña 10:
 
Dado que unha mesma función pode chamarse varias veces para traballar con distintos valores, as funcións son unha ferramenta moi potente á hora de programar. Entre os beneficios que achega o uso de funcións están os seguintes:
* '''Claridade no código'''. Ao reducir fragmentos de código a funcións, a estrutura do código queda moito máis clara, o que facilita non só a comprensión do código, senón a busca e solución de erros.
* '''Evitar repeticións innecesarias de código'''. En moitas ocasións, ao longo dun programa existen certos grupos de instrucións que conforman unha operación que nos gustaría repetir máis dunha vez no programa. Repetir as instrucións cada vez que sexan necesarias pode resultar traballoso, e dificulta o mantemento do código: se aparece un erro nesa operación, haberá que corrixilo en todas as súas repeticións. Estes problemas soluciónanse mediante o uso de funcións que conteñan a operación.
* '''Independencia'''. As funcións son relativamente independentes do reto do código (das funcións que a chaman). As funcións poden modificar variables globais ou punteiros, pero limitándose a aqueles que se lle fornezan na chamada á función.
 
Antes de analizar os compoñentes das funcións cómpre ter en conta algunhas cousas relativas ao vocabulario usado ao tratar con funcións:
* Cando falamos de que unha función utiliza outra función, dicimos que a primeira “chama” á segunda.
* Os datos que se lle envían a unha función para que traballe con eles son os “argumentos”. Estes, vistos dende o punto de vista da función chamada, adóitanse denominar “parámetros”.
* Cando unha función responde á que a chamou con algún dato, a función “devolve” ese dato.
 
== Compoñentes das funcións ==
As funcións en C están baseadas en tres compoñentes: [[{{PAGENAME}}#Definición dunha función|definición]], [[{{PAGENAME}}#Declaración dunha función|declaración]] e [[{{PAGENAME}}#Chamada a unha función|chamada]]. Destes tres compoñentes, só un deles é estritamente necesario para que a función forme realmente parte do código fonte: a definición. Esta é a parte que describe o funcionamento da función. Cando nunha parte do código queremos que se faga a tarefa para a que a función se creou, chámase a dita función para que faga dita tarefa. E a declaración da función só é unha presentación da mesma, un xeito de que o compilador coñeza a función en caso de que se atope cunha chamada á mesma antes de dar coa súa definición.
 
Así e todo, o máis habitual é atoparse cos tres compoñentes. Mesmo nos casos en que non sería necesario.
 
=== Definición dunha función ===
A definición de unha función é a función en si mesma. É un algoritmo que pode recibir ningún, un ou varios valores ─chamados “parámetros”─, e que pode devolver ningún ou un valor ─chamado “valor de saída”─. Consta dunha serie de instrucións que rematan coa saída da función ([[{{BASEPAGENAME}}/Instrucións de control#return|<source lang=c enclose=none>return</source>]]).
 
Liña 61:
</source>
 
=== Chamada a unha función ===
Ao chamar a unha función, execútanse as instrucións da definición de dita función utilizando uns valores para as variables de entrada establecidos na propia chamada. As funcións poden recibir (ou non) [[{{BASEPAGENAME}}/Constantes literais|constantes]], [[{{BASEPAGENAME}}/Variables|variables]], expresións, e poden ademais devolver (ou non) un dato como resultado dos procesos contidos na definición da función.
 
Liña 79:
</source>
 
==== Paso por valor e paso por referencia ====
Á hora de pasarlle a unha función unha variable como argumento, pódese facer de dous xeitos: paso por valor, ou paso por referencia.
 
Liña 90:
</source>
 
=== Declaración dunha función ===
A declaración ou prototipo dunha función precísase para que cando o compilador chegue á chamada dunha función antes de chegar á definición da mesma, este xa saiba da súa existencia e coñeza:
* a cantidade de argumentos que ten que recibir e o seu tipo de dato,
* o tipo de dato que devolverá a función e
* o identificador da función.
 
Isto quere dicir que, en caso de que a definición da función vaia ''antes'' das chamadas á mesma, non sería preciso incluír a declaración da función. De todos xeitos, é costume que a primeira función que apareza no código fonte sexa a principal, e a primeira función adoita ser a que contén a meirande parte das chamadas a funcións, polo que situar as declaracións de todas as funcións ao comezo do programa e logo situar a definición da función principal e tras ela as demais impedirá calquera tipo de problema.
Liña 108:
</source>
 
== A función principal ==
A función principal é fundamental, e representa o punto de inicio da execución dun programa. A súa sintaxe fundamental é a seguinte:
<source lang=c>
Liña 120:
É unha boa práctica subdividir a función principal noutras funcións, de xeito que esta quede case como un guión do que fai o programa, permitindo así unha lectura rápida e comprensión do mesmo.
 
=== Argumentos da función principal ===
Cando se executa un programa, a función recibe do sistema dous parámetros: un contador de argumentos e unha lista de argumentos.
 
Liña 138:
Xeralmente <code>argc</code> utilízase para controlar os argumentos fornecidos polo usuario ao chamar ao programa, xeralmente rematando a súa execución, non sen antes indicarlle ao usuario a forma correcta de chamar á función.
 
== Funcións recursivas ==
Denomínase recursividade ao feito de que unha función se chama a si mesma, xa sexa directa ou indirectamente ─con outras funcións de por medio─. A súa sintaxe fundamental sería a seguinte:
<source lang=c>
Liña 177:
</source>
 
== Funcións estáticas ==
Unha función considérase estática cando só vai ser chamada dende as funcións que se atopan no mesmo ficheiro no que está [[{{BASEPAGENAME}}/Definición dunha función|definida]]. Sabendo isto, o compilador pode compilala de xeito que se impida a súa chamada dende outros ficheiros.
 
Liña 187:
</source>
 
== Bibliotecas de funcións ==
As '''bibliotecas de funcións''' son conxuntos de funcións feitas previamente que se poden aproveitar, evitando a necesidade de volver codificalas para cada un dos distintos programas que se realicen. Abonda con indicarlle ao compilador que se quere engadir a biblioteca ao executable.
 
Liña 194:
Pero á hora de traballar de verdade coas funcións da biblioteca e utilizalas en programas, necesítanse dous ficheiros distintos: o [[{{PAGENAME}}#Ficheiro de cabeceira|ficheiro de cabeceira]] e a propia biblioteca [[{{PAGENAME}}#Biblioteca compilada|compilada]].
 
=== Ficheiro de cabeceira ===
O ficheiro de cabeceira será un ficheiro de texto, xeralmente coa extensión <code>.h</code>, que conterá os [[{{PAGENAME}}#Declaración dunha función|prototipos]] das funcións da biblioteca, así como os tipos de [[{{BASEPAGENAME}}/Estruturas|estruturas]], [[{{BASEPAGENAME}}/Unións|unións]] ou [[{{BASEPAGENAME}}/Enumeracións|enumeracións]] usadas se procede. Cando as bibliotecas son moi complexas, utilízanse xeralmente varios ficheiros distintos.
 
Liña 201:
:''Para máis informacións sobre a inclusión de ficheiros de cabeceira en códigos, vaiase ao capítulo sobre as [[{{BASEPAGENAME}}/Directrices para o preprocesador#Comezo habitual dos ficheiros de cabeceira|directrices para o preprocesador]].''
 
=== Biblioteca compilada ===
O proceso necesario para compilar unha biblioteca de funcións ou para ligala a un programa durante o proceso de compilación escapa aos obxectivos deste libro. Para máis información léase, por exemplo, o libro sobre a '''[[GNU Compiler Collection]]'''.
 
== Véxase tamén ==
* [[{{BASEPAGENAME}}/Biblioteca estándar|Biblioteca estándar de funcións]]
 
 
Liña 211:
 
<!-- Categorías: -->
 
[[Categoría:C ─ Elementos|Funcions]]