La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

17/09/2014Catedra de Programacion I1 Programación I Funciones.

Presentaciones similares


Presentación del tema: "17/09/2014Catedra de Programacion I1 Programación I Funciones."— Transcripción de la presentación:

1 17/09/2014Catedra de Programacion I1 Programación I Funciones

2 17/09/2014Catedra de Programacion I2 Funciones Introducción En C se pueden definir funciones que permiten la implementación de programas modulares. El concepto de programación modular 1 fue visto en el curso de Introducción a la computación. Recordemos que para la implementación de dicho paradigma se usaron las subrutinas como herramienta.En el lenjuaje C las subrutinas son reempazadas por las llamadas funciones. La ventaja de las fuciones sobre las subrutinas es que implementan en forma natural las siguientes tareas:  El pasaje de parámetros por el Stack  La creación y destrucción del Stack Frame  La creación y destrucción de variables locales en el stack  El acceso a los parámetros y las variables locales a través del Frame pointer.  El programador ya no debe preocuparse por el tamaño de las variables. 1-Recomendamos releer lo visto en introducción sobre este tema.

3 17/09/2014Catedra de Programacion I3 Funciones Definición La definición de cualquier función responde a la siguiente sintaxis Toda función se define de la siguiente manera: Tipo nombre (Argumentos formales) bloque nombre: Es el nombre de la función Argumentos formales : es el nombre y tipo de los parámetros que recibe la función. Tipo Es el el tipo devuelto por la función. Para retornar un valor se usa la sentencia return cuya sintaxis es: [return expresión;] Bloque: es el que contiene las sentencias que se ejecutan cuando la función es invocada. Este bloque queda definido por un par de llaves ( { } ).

4 17/09/2014Catedra de Programacion I4 Funciones Definición Ejemplo int suma (int a, int b) { int resultado; resultado=a+b; return resultado; } a y b son los parámetros formales resultado es una variable local resultado es el valor que devuelve la función a través del stack

5 17/09/2014Catedra de Programacion I5 Invocación Funciones int suma (int a, int b) { int resultado; resultado=a+b; return resultado; } int suma(int,int); int c, n1=500, n2=6000; void main (void) { c=suma(n1,n2); } PSHX Hacemos lugar en el Stack para el primer parámetro LDD n1 TSX STD 0,X Y lo guardamos LDD n2 JSR suma STD c PULX RTS PSHB Guardamos el segundo parámetro en el stack PSHA PSHX Creamos la variable local resultado TSX LDD a,X Parámetro ‘a’ ADDD b,X Parámetro ‘b’ STD resultado,X Guardamos la suma en resultado PULX devolvemos la zona ocupada por resultado PULX devolvemos la zona ocupada por el segundo parámetro RTS El resultado vuelve en el registro D Prototipo de la función Parámetros actuales aequ6 Desplazamientos respecto del Stack Frame bequ2 resultadoequ0

6 17/09/2014Catedra de Programacion I6 Funciones Void Cuando una función no devuelve nada de debe explicitar de la siguiente manera void motor( int velocidad); /* Prototipo */ void motor( int velocidad)/* Definición */ { ……… } De igual manera si no recibe nada: int temperatura (void); /* Prototipo */ int temperatura (void) /* Definición */ { int val; …………………… return (val) }

7 17/09/2014Catedra de Programacion I7Funciones Visibilidad y Tipo de almacenamiento Del ejemplo anterior se puede verificar lo siguiente: 1.Los parámetros actuales n1,n2 se pasan por VALOR es decir la función recibe una copia de los mismos en el stack.Esta copia desaparece en cuanto termina el cuerpo de la función. 2. La variable local resultado también se encuentra en el Stack y por lo tanto también desaparece al terminar la función. 3. De 1 y2 tenemos que los nombres de las variables locales y los de los parámetros formales solo existen dentro de la función se dice que su duración esta limitada al ámbito o entorno (scope) de la función. Dicho en otras palabras la visibilidad de dichas variables queda confinada a la función. Esto ultimo nos permite repetir nombres en otras funciones. Observar que el nombre de las variables a, b y resultado no son otra cosa que los desplazamientos respecto del frame pointer. No representan posiciones absolutas!!. LDD 6, X LDD a, X ADDD 2, X STD resultado, X STD 0, X ADDD b, X

8 17/09/2014Catedra de Programacion I8Funciones Visibilidad y Tipo de almacenamiento Es decir que podemos hacer lo siguiente sin entrar en conflictos No hay conflicto porque la variable resultado es local en ambas funciones. En efecto cuando se invoca a main se crea un SF donde habita resultado. Cuando main invoca a suma se vuelve a crear un SF diferente del de main. Allí es donde se encuentra resultado. int suma(int,int); int n1=500, n2=6000; void main (void) { int resultado; resultado=suma(n1,n2); } int suma (int a, int b) { int resultado; resultado=a+b; return resultado; }

9 17/09/2014Catedra de Programacion I9Funciones Visibilidad y Tipo de almacenamiento Supongamos ahora que a la variable resultado la hacemos global Es decir : En este caso el compilador le da prioridad a la definición de la variable local resultado sobre la variable global resultado. Es decir que siguen siendo diferentes. Una variable en un bloque exterior no puede ser accedida desde un bloque interior si tienen el mismo nombre. En estos casos la variable local oculta a la global. int suma(int,int); int resultado, n1=500, n2=6000; void main (void) { resultado=suma(n1,n2); } int suma (int a, int b) { int resultado; resultado=a+b; return resultado; }

10 17/09/2014Catedra de Programacion I10Funciones Visibilidad y Tipo de almacenamiento Que pasa si hacemos lo siguiente? En este caso la variable global resultado si es vista por la función suma dado que no existe dentro de suma una variable local con igual nombre que la global Nótese que el valor de resultado1 se pierde.!!! int suma(int,int); int resultado, n1=500, n2=6000; void main (void) { resultado=suma(n1,n2); } int suma (int a, int b) { int resultado1; resultado1= a+b; return resultado; }

11 17/09/2014Catedra de Programacion I11Funciones Visibilidad y Tipo de almacenamiento Que pasa si hacemos lo siguiente? En este caso la variable global resultado si es vista por la función suma dado que no existe dentro de suma una variable local con igual nombre que la global Nótese que el valor de resultado1 se pierde.!!! int suma(int,int); int resultado, n1=500, n2=6000; void main (void) { resultado=suma(n1,n2); } int suma (int a, int b) { int resultado1; resultado1= a+b; return resultado; }

12 17/09/2014Catedra de Programacion I12Funciones Visibilidad y Tipo de almacenamiento Predecir la salida del siguiente programa: #include void fun1(void); void fun2(void); int n1=1; void main (void) { int n1=2; { int n1=3; printf("A:%d\n ",n1); fun1(); fun2(); } printf("D:%d\n ",n1); } void fun1(void) { int n1=4; printf("B:%d\n ",n1); } void fun2(void) { printf("C:%d\n ",n1); }

13 17/09/2014Catedra de Programacion I13Funciones Visibilidad y Tipo de almacenamiento #include void fun1(void); void fun2(void); int n1=1; void main (void) { int n1=2; { int n1=3; printf("A:%d\n ",n1); fun1(); fun2(); } printf("D:%d\n ",n1); } void fun1(void) { int n1=4; printf("B:%d\n ",n1); } void fun2(void) { printf("C:%d\n ",n1); } RTA: A:3 B:4 C:1 D:2

14 17/09/2014Catedra de Programacion I14Funciones Cual es el valor de resultado? #include int suma(char,char); unsigned char c, n1=129,n2=1 ; int resultado; void main(void) { resultado=suma(n1,n2); printf("%d",resultado); } int suma(char a, char b) { int resultado1; resultado1=a+b; return resultado1; }

15 17/09/2014Catedra de Programacion I15Funciones Cual es el valor de resultado? #include int suma(char,char); unsigned char c, n1=129,n2=1 ; int resultado; void main(void) { resultado=suma(n1,n2); printf("%d",resultado); } int suma(char a, char b) { int resultado1; resultado1=a+b; return resultado1; } RTA: unsigned char -> char 129  -127 1  1 resultado -127+1= -126


Descargar ppt "17/09/2014Catedra de Programacion I1 Programación I Funciones."

Presentaciones similares


Anuncios Google