Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 1
Departamento de Lenguajes y Ciencias de la Computación Universidad de Málaga
E.T.I. Informática Gestión
Sistemas OperativosSistemas Operativos
Curso 2004/2005Curso 2004/2005
Revisión de ANSI C
Profesor: Francisco Rus Mansilla
2
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ANSI C (RevisiANSI C (Revisióón)n)
• Introducción a Ansi C• Variables, operadores y expresiones• Control de flujo• Arrays y cadenas de caracteres• Funciones• Estructuras y Uniones• Punteros• El pre-procesador de C• Programación modular en ANSI-C• C, UNIX y las bibliotecas de funciones
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 2
3
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
IntroducciIntroduccióón a n a AnsiAnsi CC
• Pequeño tamaño• Uso de funciones de librería• Lenguaje estructurado• Propósito general y prog. Sistemas• Poco tipado, inseguro• Bajo nivel , operaciones de bits y punteros
CaracterCaracteríísticassticas
4
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
IntroducciIntroduccióón a n a AnsiAnsi CC
• Construcciones de alto nivel• Manejo de tareas de bajo nivel• Programas eficientes• Compiladores para múltiples plataformas
CaracterCaracteríísticassticas
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 3
5
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
IntroducciIntroduccióón a n a AnsiAnsi CC
• C se diseñó para implementar UNIX• Comandos escritos en C• Las funciones de librería para acceso al sistema
se usan mejor desde C
UNIX y CUNIX y C
6
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
IntroducciIntroduccióón a n a AnsiAnsi CC
• Un programa C contiene– Ordenes para el preprocesador– Definiciones de tipos– Prototipos para funciones– Variables – Funciones– Una función especial main()
Estructura de un programaEstructura de un programa
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 4
7
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructura bEstructura báásica sica
EjemploEjemplo/* Convierte de Celcius a Fahrenheit */#include <stdio.h>main(){/* Declaraciones */
float celsius;float fahrenheit;
/* Peticion de la entrada al usuario */printf( "Type a number: ");scanf( "%f", &celsius);
/* Calculo del resultado */fahrenheit = celsius * 9 / 5.0 + 32;
/* Impresion del resultado */printf( "Celsius: %5.1f, Fahr: %5.1f\n",
celsius, fahrenheit);exit( 0 );
} /* fin del programa */
E/S
LIBRERÍAS
8
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructura bEstructura báásica sica EjemploEjemplo
• Copia la entrada en la salida• La entrada puede ser con buffer• Puede redireccionarse la entrada y salida
#include <stdio.h>
int main(void){
int c;
c = getchar();while ( c!= EOF ) {
putchar(c);c = getchar();
}}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 5
9
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructura bEstructura báásica sica EjemploEjemplo
• Cualquier expresión tiene un valor, y puede usarse en otras expresiones
#include <stdio.h>
int main(void){
int c;
while ( (c = getchar()) != EOF ) {putchar(c);
}}
10
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructura bEstructura báásica sica EjemploEjemplo
• Las notaciones n++, ++n, n-- y --n incrementan y disminuyen en 1
#include <stdio.h>
int main(void){
int nc;
nc = 0;while (getchar() != EOF )
nc++;printf(“%ld\n”, nc);
}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 6
11
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
CompilaciCompilacióónn
• Modelo de compilación• Compiladores• Ejecución
Temas a tratar ...Temas a tratar ...
12
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
CompilaciCompilacióónnModelo de compilaciModelo de compilacióónn
Preprocesador
Compilador
Ensamblador
Editor de enlace
ejecutable
fuente
librerías
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 7
13
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
CompilaciCompilacióónn
• Los mas frecuentes: cc gcc– cc -o ejecutable fuente.c– gcc -o ejecutable fuente.c – gcc fuente.c
CompiladorCompilador
14
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
CompilaciCompilacióónnCompiladorCompilador
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 8
15
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
CompilaciCompilacióónnEjecuciEjecucióónn
16
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
EJERCICIOSEJERCICIOSIntroducciIntroduccióón n
1.1 Escribir un programa que copie la entrada en la salida, sustituyendo cada cadena de espacios en blanco por un único espacio en blanco.
1.2 Escribir un programa que elimine los espacios en blanco y tabuladores al final de cada línea, y que borre las líneas en blanco.
1.3 Escribir una función reverse(s) que invierta una cadena de caracteres s.
1.4 Escribir un programa que elimine todos los comentarios de unprograma C.
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 9
17
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y Operadores
• Tipos de datos• Declaración de variables• Variables locales, globales, externas y estáticas.
Ámbitos. • Operadores aritméticos, relaciones y lógicos• Operadores de asignación• Expresiones condicionales• Precedencia de operadores• Conversión de tipos
Temas a tratar ...Temas a tratar ...
18
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y OperadoresTipos de datos bTipos de datos báásicossicos
arraysshort
campo de bit
punterodouble
enumerados long int
unionesfloat
estructurasint, unsigned int
voidchar, unsigned char
OtrosBásicos
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 10
19
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y OperadoresTamaTamañños de lo tipos de datosos de lo tipos de datos
#include <stdio.h>#include <limits.h>
int main (){printf("Size of Char %d\n", CHAR_BIT);printf("Size of Char Max %d\n", CHAR_MAX);printf("Size of Char Min %d\n", CHAR_MIN);printf("Size of int min %d\n", INT_MIN);printf("Size of int max %d\n", INT_MAX);printf("Size of long min %d\n", LONG_MIN);printf("Size of long max %d\n", LONG_MAX);printf("Size of short min %d\n", SHRT_MIN);printf("Size of short max %d\n", SHRT_MAX);printf("Size of unsigned char %d\n", UCHAR_MAX);printf("Size of unsigned long %d\n", ULONG_MAX);printf("Size of unsigned int %d\n", UINT_MAX);printf("Size of unsigned short %d\n", USHRT_MAX);
return 0;}
20
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y Operadores
Tipo Variable1, Variable2;
int entero;char caracter, c1, c2;enum Color { Verde, Amarillo, Rojo };
Declaraciones de variablesDeclaraciones de variables
• Nombres de variables: – letra + letras y dígitos– Distinción entre mayúsculas y minúsculas
• Declaraciones
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 11
21
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y Operadores
• Locales: declaradas dentro de una función• Globales: declaradas fuera de funciones• Externas: declaradas en otro módulo• Estáticas: no se eliminan hasta el final de la
ejecución, privadas• Tipo de almacenamiento y tipo de acceso:
– auto, register, static, extern, const, volatile
Atributos de las variablesAtributos de las variables
22
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Variables y OperadoresVariables y Operadores
• Aritméticos– Binarios
• + , -, *, /, %
• Relacionales– Los de mas precedencia
• > , >=, <, <=– Los de menos precedencia
• ==, !=
• Lógicos• &&, ||
• Manejo de bits• & | ^ << >> ~
OperadoresOperadores
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 12
23
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
• Variable operador = expresionX *= y +1X = x * (y +1)
/* cuenta los bits 1 en x */int bitcount(unsigned x){
int b;
for (b = 0; x != 0; x &= (x-1))b++;
return b;}
Variables y OperadoresVariables y OperadoresOperadores de asignaciOperadores de asignacióónn
24
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Precedencia y orden de evaluaciPrecedencia y orden de evaluacióónn
Variables y OperadoresVariables y Operadores
Izquierda a derecha,
Derecha a izquierda= += -= *= /= %= &= ^= |= <<= >>=
Derecha a izquierda?:
Izquierda a derecha||
Izquierda a derecha&&Izquierda a derecha|
Izquierda a derecha^
Izquierda a derecha&
Izquierda a derecha== !=
Izquierda a derecha< <= > >=
Izquierda a derecha<< >>Izquierda a derecha* / %
Derecha a izquierda! ~ ++ -- + - * & (tipo) sizeof
Izquierda a derecha() [] ->
Orden de evaluaciónOperadores
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 13
25
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Conversiones de tipoConversiones de tipo
• Conversión implícita en argumentos de funciones• Conversión explícita con el operador “cast”
– Variable = (tipo) expresión
Variables y OperadoresVariables y Operadores
26
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
EJERCICIOSEJERCICIOSVariables, operadores Variables, operadores
2.1 Escribir una función mi_htoi(s) que devuelva el entero equivalente a una cadena de dígitos hexadecimales.
2.2 Escribir la funcion lower que convierte de mayusculas a minúculas usando la expresión condicinal.
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 14
27
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• Bloques de Instrucciones• Instrucciones de Selección
– Sentencia if– Sentencia switch
• Bucles– Sentencia for– Sentencia while– Sentencia do-while– Sentencias break, continue y goto
Temas a tratar ...Temas a tratar ...
28
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• Instrucción o proposición simpleSentencia ;
• Bloque de instrucciones{
Sentencia1 ;Sentencia2 ;....SentenciaN ;
}
• El bloque puede contener declaraciones de variables
Bloques de instruccionesBloques de instrucciones
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 15
29
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• Se emplea para expresar decisiones
if (expresión)Sentencia1 ;
else Sentencia2 ;
if (expresión)Bloque1
else Bloque2
SelecciSeleccióón n ifif
30
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujoSelecciSeleccióón n ifif
/* Imprime el area a partir del radio*/
#define Pi 3.14159
main() {
float radius;
printf( "Type a radius: ");scanf( "%f", &radius );
if ( radius < 0 ) {printf( "Error: Negative values not permitted\n" );
} else {printf( "Radius is %5.2f, area is %5.2f\n",radius,Pi * radius *
radius);}exit( 0 );
}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 16
31
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• Se emplea para expresar decisiones múltiples• Cada case se anota con uno o varios valores
constantes
switch (expresión) {case exp-cont: Sentenciascase exp-cont: Sentencias case exp-cont: Sentencias ......default : Sentencias
}
SelecciSeleccióón n switchswitch
32
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujoSelecciSeleccióón n switchswitch
main (){ int month;
printf ( "Type the number of a month: " );scanf ( "%d", &month );printf( "\nName of month %d is ", month );switch ( month ) {case 1: printf ( "January" ); break;case 2: printf ( "February" ); break;case 3: printf ( "March" ); break;case 4: printf ( "April" ); break;case 5: printf ( "May" ); break;case 6: printf ( "June" ); break;case 7: printf ( "July" ); break;case 8: printf ( "August" ); break;case 9: printf ( "September" ); break;case 10: printf ( "October" ); break;case 11: printf ( "November" ); break;case 12: printf ( "Devember" ); break;default: printf ( "Unknown" );
}putchar ( '\n' );
}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 17
33
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• La expresión se evalúa antes de ejecutar el cuerpo• Para continuar, expresión debe ser distinto de
cero
while (expresión)sentencia;
while (expresión)bloque
while (expresión);
Bucle Bucle whilewhile
34
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
for (expr1; expr2; expr3)sentencia; ó bloque
equivale a
expr1;while (expr2){
sentencia; ó bloqueexpr3
};
Bucle Bucle forfor
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 18
35
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujoBucle Bucle forfor
#include <stdio.h>
main(){ float in, sum = 0.0,
max = -1000000.0, min = 1000000.0; int i;
for (i=0;i<10;++i){ printf("Enter number %d: \n", i+1);
scanf("%f",&in);
if ( max < in )max = in; /* in is current largest */
if ( min > in )min = in; /* in is current smallest */
sum += in;}
printf("\nLargest = %10.3f, Smallest = %10.3f, Average %10.3f\n", max, min, sum / 10.0);
exit(0);}
36
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• expr1 y expr3 pueden ser compuestas
for (expr1; expr2; expr3)sentencia; ó bloque
Bucle Bucle forfor
void reverse(char s[]){
int c, i, j;
for (i=0, j = strlen(s)-1; i<j; i++, j--){
c = s[i];s[i] = s[j];s[j] = c;
}}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 19
37
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• La expresión se evalúa después de ejecutar
dosentencia; ó bloque;
while (expresión);
Bucle doBucle do--whilewhile
void itoa(int n, char s[]) {int i, sign;sign = n;
i = 0;do {
s[i++] = abs(n % 10) + '0';} while ( n /= 10 );if (sign < 0)
s[i++] = '-'; s[i] = '\0';reverse(s);
}
38
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Control de flujoControl de flujo
• break sale de una rama de switch o del bucle for , while ódo más interno
• continue corta la iteración de un bucle e inicia una nueva
breakbreak y y continuecontinue
int trim(char s[]) {int n;sign = n;
for(n = strlen(s)-1; n >= 0; n--)if(s[n] != ‘ ‘ && s[n] != ‘\t’ && s[n] != ‘\n’)break;
s[n+1] = ‘\0’;return(n);}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 20
39
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
EJERCICIOSEJERCICIOSControl de flujoControl de flujo
3.1 Escribir la función expand(s1, s2) que expanda la notación abreviada a-z, indicada en la cadena s1, en una lista completa abc ..xyz en s2.
3.2 Escribir una función itob(n,s,b) que convierte el entero n en y una cadena s que representa al numero en base b.
3.3 Escribir una funcion itoa(n, l, s) que convierte el numero entero n en una cadena de caracteres de longitud l (insertando blancos por la izquierda hasta completar la longitud).
40
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteres
• Declaracióntipo nombre[tamaño];
• Acceso a un elementonombre[índice]
• índice varía de 0 a tamaño – 1• La asignación de arrays completos es Ilegal !!• Inicialización
tipo nombre[] = {const, const, .. const};
ArraysArrays unidimensionalesunidimensionales
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 21
41
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteresArraysArrays unidimensionalesunidimensionales
#include <stdio.h>main()
{ int arr[10]; int i; /* indice del array */int in;
for (i=0;i<10;++i) arr[i] = i; /* inicializacion con valores*/
for (i=0;i<10;++i) printf("%d ", arr[i]); /* impresion del array */
printf("Enter number to be searched for:\n"); scanf("%d", &in);
i=0;while ( (i < 10) && ( arr[i++] != in) );
if ( i == 10 )printf("Number %d not found in array\n", in);
elseprintf("Number %d found at array location %d\n", in, i-1);
}
42
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteres
• Declaración como arrayschar nombre[tamaño];
• Acceso como array y con funciones especiales• Almacenamiento con un terminador ‘\0’, que ocupa
una posición
• Inicialización char cadena[] = {‘u’, ‘n’, ‘o’, ‘\0’};char cadena[] = {“uno”};
Cadenas de caracteresCadenas de caracteres
\0etnatsnocanu
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 22
43
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteresCadenas de caracteresCadenas de caracteres
#include <stdio.h>#define MAXLINE 1000 int getline(char line[], int maxline);void copy(char to[], char from[]);
int main(void){ int len; /* loingutud de la linea actual */int max=0; /* maxima longitud actual */char line[MAXLINE]; /* linea actual*/char longest[MAXLINE]; /* linea mas larga */
while((len = getline(line, MAXLINE)) > 0){printf("%d: %s", len, line);if(len > max){max = len;copy(longest, line);
}}if(max > 0)
printf("Longest is %d characters:\n%s", max, longest);printf("\n");
}
44
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteresCadenas de caracteresCadenas de caracteres
/* copy: copia una cadena de caracteres en otra */void copy(char to[], char from[]){
int i;
i = 0;while((to[i] = from[i]) != '\0'){++i;
}}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 23
45
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ArraysArrays y cadenas de caracteresy cadenas de caracteres
• Declaracióntipo nombre[tamaño1][tamaño2][tamaño3][tamaño4];
• Acceso a un elementonombre[índice1][índice2][índice3][índice4]
• Inicializacióntipo nombre[][] =
{{const, const, .. const},{const, const, .. const}}
ArraysArrays multidimensionalesmultidimensionales
46
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
FuncionesFunciones
• En C se usan como funciones y procedimientos• Todas se definen como globales, sin anidamiento
DeclaraciDeclaracióón de funcionesn de funciones
tipo_devuelto nombre(par1, par2, ..)
{
variables locales
cuerpo
}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 24
47
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
FuncionesFunciones
• Pueden devolver cualquier tipo– excepto tipos función o arrays– si no se especifica, devuelve int– proposición return devuelve el valor– void para “procedimientos”
• Se necesita una definición o declaración antes de usarlas,
DeclaraciDeclaracióón de funcionesn de funciones
tipo_devuelto nombre(tipo_par1, tipo_par2, ..);
48
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
FuncionesFunciones
• Los parámetros son de cualquier tipo• Los parámetros se pasan por valor
– excepto los arrays– se realizan conversiones automáticas de tipo
• Almacenamiento automático para parámetros y variables locales
• Posibilidad de declarar variables locales como estáticas
DeclaraciDeclaracióón de funcionesn de funciones
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 25
49
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
FuncionesFunciones
• Las funciones ya disponibles y las que se creen en otros ficheros deben declararse para utilizarlas
• Declaraciones agrupadas en ficheros .h– Entrada/salida <stdio.h>– Manipulación de cadenas <string.h>– Funciones matemáticas <math.h>
• La notacion < > indica que se encuentran en directorios estándar
Ficheros de cabecerasFicheros de cabeceras
50
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
FuncionesFunciones
• Las variables no pueden devolver arrays• Los arrays como parámetros se tratan por
referencia– Pueden pasarse como arrays abiertos– Sólo puede dejarse abierta la primera dimensión
Funciones y Funciones y arraysarrays
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 26
51
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructuras y unionesEstructuras y uniones
• Una estructura es una colección de variables (incluidas estructuras)
• En ANSI-C, una estructura puede utilizarse como una variable (asignación, paso como parámetro, valor de vuelta de una función)
• Las estructuras no se pueden comparar
DefiniciDefinicióón de estructurasn de estructuras
struct nombre {
tipo nombre_campo;
tipo nombre_campo;
.......
}
52
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructuras y unionesEstructuras y uniones
• Diferentes formas de declarar variables
• Acceso a campos con “.”
DefiniciDefinicióón de estructurasn de estructuras
struct point {
int x;
int y;
};
......
struct point a, b;
struct {
int x;
int y;
} a, b;
b = a.x;
a.y = c;
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 27
53
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
Estructuras y unionesEstructuras y uniones
• Se puede renombrar un tipo simple o dar un nombre a un tipo compuesto
DefiniciDefinicióón de estructurasn de estructuras
typedef struct point {
int x;
int y;
} Coordenadas;
......
Coordenadas a, b;
typedef int Longitud;
Longitud i, j;
54
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• Un puntero es una variable que contiene la dirección de una variable
• Declaración
• Asignación de dirección (&) y desreferenciación (*)
DefiniciDefinicióónn
Int(y)
int *(puntero)
struct(coordenadas)
Int(x)
char( c)
tipo *nombre;
int *puntero;
int y;
puntero = &y;
x = *puntero;
*puntero = *puntero + 5;
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 28
55
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunterosDefiniciDefinicióónn
56
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• El valor NULL puede asignarse a cualquier tipo de puntero
• Significa que el puntero no apunta a ningún sitio• No se puede desreferenciar
DefiniciDefinicióónn
Int(y)
int *(puntero)
struct(coordenadas)
Int(x)
char( c)
puntero = NULL;
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 29
57
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• El incremento o decremento de una variable tipo puntero depende del tipo de variable a la que apunta
AritmAritméética de punterostica de punteros
int y, *py;
py = &y;
py++;
58
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• En general, C pasa los argumentos por valor• El paso “por referencia” se realiza pasando la
dirección de la variable
Punteros y funcionesPunteros y funciones
void swap(int x, int y)
{
int c;
c = x;
x = y;
y = c;
}
void swap(int *px, int *py)
{
int c;
c = *px;
*px = *py;
*py = c;
}
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 30
59
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• Una función puede devolver un puntero
Punteros y funcionesPunteros y funciones
typedef struct point {
int x;
int y;
} Coordenadas;
Coordenadas a, b, *crea_Coord();
main()
{
a = crea_Coord();
}
60
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• En C, punteros y arrays están muy relacionados
• El paso “por referencia” se realiza pasando la dirección como parámetro
Punteros y Punteros y arraysarrays
int a[10], x;
int *pa;
pa = &a[0];
x = *pa;
int a[10], x;
int *pa;
pa = a;
x = *pa;
a[i] ≡ *(a + i)
pa[i] ≡ *(pa + i)
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 31
61
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• Importante– Un puntero es una variable (pa=a y pa++ es legal)– Un array no es una variable (a = pa y a++ es ilegal)
• El paso de un array a una función se realiza con un puntero al primer elemento
Punteros y Punteros y arraysarrays
int suma(int a[]);
int suma(int *a);
62
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• Los arrays de punteros son útiles para evitar movimientos de datos
Punteros y Punteros y arraysarrays
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 32
63
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• El almacenamiento depende de la declaración
Punteros y Punteros y arraysarrays
Char aname[][15] =
{“no month”, “jan”, “feb”, ...}
Char *name[15] =
{“no month”, “jan”, “feb”, ...}
64
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
• La sintaxis para acceder a los campos de estructuras mediante punteros es distinta
PunterosPunterosPunteros y estructurasPunteros y estructuras
struct point {
int x;
int y;
}a, *pb;
a.x = pb->x;
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 33
65
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• Una función C no es una variable, pero– Se puede apuntar a la memoria donde comienza un segmento
de código (función)– Se puede usar el puntero como el de una variable
• Se define el tipo de las funciones– que tienen el mismo tipo de retorno– y los mismos argumentos
• Las funciones definidas que lo cumplan son valores del tipo
Punteros a funcionesPunteros a funciones
66
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunterosPunteros a funcionesPunteros a funciones
int (*pf) () /* puntero a función que devuelve un entero */
void (*pv) () /* puntero a función que devuelve void */
char (*(*x())[])() /* puntero a función que devuelve un array de punteros a funciones que
devuelven char */
char (*(*x[3])())[5] /* array de 3 punteros a funciones que devuelven punteros a
arrays de 5 char */
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 34
67
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• El programa puede acceder a los argumentos que lo acompañan
cc es el programa -o copy y copy.c son los argumentos
argc : número de argumentos, incluido el nombre del programa argv apunta a cada argumento
Procesamiento de la lProcesamiento de la líínea de argumentosnea de argumentos
%cc -o copy copy.c
main(int argc, char **argv)
68
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• C permite crear de forma dinámica espacio para cualquier tipo de variable y obtener su dirección en un puntero
• Funciones de la librería estándar (<stdlib.h>)
GestiGestióón dinn dináámica de memoriamica de memoria
void *malloc(size_t size)
void free(void *p)
void *calloc(size_t elem, size_t size)
void *realloc(void *p, size_t size)
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 35
69
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunterosGestiGestióón dinn dináámica de memoriamica de memoria
#include <stdio.h>#include <malloc.h>
main(){ int size;
int *arr; int i = 0;
printf(“Introduzca el numero de elementos del array\n");scanf("%d",&size);
if ( (arr = (int *) malloc(size*sizeof(int))) == NULL){ printf("Error: No hay memoria suficiente\n");exit(-1);
}
/* lee los datos */
while (i< size){ printf(”Introduzca numero %d:\n", i);scanf("%d", arr + i);++i;
} }
70
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PunterosPunteros
• No asignar memoria antes de usar
• Reserva de memoria en la variable apuntada
Errores frecuentesErrores frecuentes
int *x;
*x = 40;
int *x;
x = &y;
*x = 40;
*x = (int *)malloc(200); x = (int *)malloc(200);
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 36
71
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PreprocesadorPreprocesador de Cde CConstantes y macrosConstantes y macros
#define FALSE 0
#define TRUE !FALSE
#define MAX(A,B) ( (A > B) ? (A) : (B) )
#define IGUAL ==
#define SIN_FIN while(1)
#define cuadrado(x) (x)*(x)
cuadrado (z+1); /* (z+1)*(z+1) */
cuadrado (z++); /* (z++)*(z++) */
72
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
PreprocesadorPreprocesador de Cde C
• Cualquier tipo de fichero de texto– El directorio de búsqueda depende de < > ó “ “
• Inclusión condicional
InclusiInclusióón de ficherosn de ficheros
#include <stdio.h>
#include “funciones.h”
#if defined STANDARD
#include <stdio.h>
#else
#include “miio.h”
#endif
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 37
73
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ProgramaciProgramacióón modular en Cn modular en C
• Motivos– Tamaño– Desarrollo en equipo– Reutilización de código
• Estrategia– Fichero .h con declaración de funciones y variables globales
como externas– Fichero .c con el cuerpo de las funciones y declaración de las
variables
DivisiDivisióón de un programa en ficherosn de un programa en ficheros
74
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ProgramaciProgramacióón modular en Cn modular en CDivisiDivisióón de un programa en ficherosn de un programa en ficheros
Definición f.h
extern int v1;extern int f1(..)extern int f2(..)
Implementación f.c
int v1;int f1() {.. }int f2 {.. }
main{a = f1( ..);b = f2(..);
..}
Programa p.c
Declaración#include “f.h”
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 38
75
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ProgramaciProgramacióón modular en Cn modular en C
• Necesidades– Compilación se los .c, incluyendo los .h adecuados
– Generación del ejecutable
• Si el número de ficheros es grande, hay que automatizar !!
CompilaciCompilacióón separadan separada
gcc –o exe f.o p.o
gcc –c f.c
gCc –c p.c
76
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
ProgramaciProgramacióón modular en Cn modular en C
• Automatizar con script del shell– Se compila todo por cada cambio
• Automatizar de forma inteligente– recompilan sólo los necesarios– conocen las dependencias entre ficheros
• Herramientas inteligentes– make, touch– sistemas de control de versiones
CompilaciCompilacióón separadan separada
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 39
77
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesBiblioteca estBiblioteca estáándar de Cndar de C
<stdio.h> entrada/salidafopen(), fflush(), fprintf(), fscanf(), fgetc(), putchar()
<errno.h> manejo de erroresclearerr(), feof(), ferror(), perror()
<string.h> manejo de cadenas de caracteresstrcpy(), strcat (), strcmp(), strstr(), strlen()
<math.h> funciones matemáticassin(), cos(), log(), sqrt(), exp(),
78
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesBiblioteca estBiblioteca estáándar de Cndar de C
<stdlib.h> utilidades variasatof(), atoi (), malloc (), free(), abort() , system()
<assert.h> diagnósticoassert()
<stdarg.h> manejo de una lista de argumentosva_list, va_start(), var_arg(), va_end()
<time.h> fecha y horaclock(), time(), difftime(),
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 40
79
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesEntrada/salida estEntrada/salida estáándar <ndar <stdiostdio.h> .h>
• Caracteres– int putchar (int);– int getchar (void); /* EOF */
• Cadenas– int puts (char* s);– char *gets (char*);
• E/S con formato– int printf (char* s, ...);– int scanf (char* s,...);
80
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesEntrada/salida estEntrada/salida estáándar <ndar <stdiostdio.h> .h>
• Algunos descriptores de formatod: decimalo: octalx: hexadecimalu: decimal sin signoc: carácters: cadenap: punteroe,f,g: número en punto flotante
Sistemas Operativos 04/04/2005
Tema 3: Mecanismos de comunicación y sincronización 41
81
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesEntrada/salida estEntrada/salida estáándar <ndar <stdiostdio.h> .h>
• Manejo de ficheros con FILE *• El tipo FILE* representa un flujo de caracteres• Los flujos de entrada/salida estándar ya están
abiertos– stdin– stdout– stderr
82
SO -
ANSI
C
Francisco Rus Mansilla Departamento de Lenguajes y Ciencias de la Computación. Universidad de Málaga
C, C, UnixUnix y bibliotecas de funcionesy bibliotecas de funcionesEntrada/salida estEntrada/salida estáándar <ndar <stdiostdio.h> .h>
• Operaciones sobre ficheros– FILE* fopen ( const char* filename, const char* mode);
El modo: r, w, a, r+, w+, a+, rb, wb, ab, ...
– int fclose (FILE*);– int fflush (FILE*);– Int fprintf(FILE* filename, const char* )– Int fscanf(FILE* filename, const char* )
Top Related