150 likes | 339 Views
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información. Sistemas Operativos. Introducción a C. Compiladores. Windows – Visual Studio Linux / Solaris – gcc. Mi primer programa en C. archivo.c #include <stdio.h> int main(void) { int a = 1;
E N D
Universidad Tecnológica Nacional Facultad Regional Buenos Aires Ingeniería en Sistemas de Información Sistemas Operativos Introducción a C
Compiladores • Windows – Visual Studio • Linux / Solaris – gcc
Mi primer programa en C archivo.c #include <stdio.h> int main(void) { int a = 1; int b = 2; int c; c = a + b; printf("La suma de las variables es: %d\n", c); } Consola # gcc archivo.c –o archivo # ./archivo La suma de las variables es: 3
Tipos de datos (32bits) • int (4 bytes) • char (1 byte) • puntero a tipo de datos (4 bytes) http://en.wikipedia.org/wiki/C_syntax#Primitive_data_types
Introducción a C • Medianamente “tipado”. Toda la memoria se puede castear como otro tipo de datos. • Todo devuelve un valor por ende todo se puede preguntar. Ej: If (a+b). Si ==0 falso y si !=0 verdadero • El punto de inicio del programa es la función “main”. • El código se puede ampliar mediante el uso de bibliotecas.
Makefile – Ejemplo all: make clean make archivo clean: rm archivo archivo: gcc –ggdb archivo.c –o archivo
Makefile – Ejemplo debian:~/charlasC# make make clean make[1]: Entering directory `/root/charlasC' rm archivo make[1]: Leaving directory `/root/charlasC' make archivo make[1]: Entering directory `/root/charlasC' gcc -ggdb archivo.c -o archivo make[1]: Leaving directory `/root/charlasC' debian:~/charlasC# http://es.wikipedia.org/wiki/Make
Punteros Proceso #include <stdio.h> int main(void) { int a = 39; char *b; b = (char*) malloc(128); } 39 a ????? ??????????????? ???????????????? B0CACACA B0CACACA b Stack (asignaciones estáticas) Datos (memoria dinámica) Código (solo lectura)
Operadores & y * #include <stdio.h> int main(void) { int a = 1; char b = 'L'; int *c; c = &a; a = a + 1; printf("La variable 'a' vale: %d y la variable 'c' lo mismo: %d y la variable b: %c\n", a, *c, b); } Puntero a un entero ‘c’ y ‘a’ referencian la misma variable
Strings – cadenas #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char[20] nombre; char *pnombre; strcpy (nombre, "Maria"); nombre[4] = 'o'; Printf ("El valor de nombre es %s y su long: %d\n", nombre, strlen(nombre)); pnombre = (char*)malloc(sizeof(char)*20); if (!pnombre) { printf("Se asigno la memoria"); } else { printf("La asignación falló"); } free (pnombre); }
Streams != Strings Un stream es una secuencia de chars contiguos (vector) char cadena[10]; H o l a Un caso particular de los streams es el String, el cual es finalizado con ‘\0’ char cadena[10]; H o l a \0 Todas las operaciones sobre strings (<string.h>, printf, etc), no debe ser ejecutada sobre streams!
Sobre los Strings • Como todos los vectoresla primer posición es la cero! • En la reserva de memoria se debe considerar el ‘\0’. (20 pos = 19 char + ‘\0’) • La ausencia del ‘\0’ al final de una cadena puede generar que se sobreescriban variables del programa y en el mejor de los casos un Segmentation Fault
Structs – un ejemplo #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { struct persona { int legajo; char nombre[20]; char apellido[25] ; char genero; float altura; }; struct persona p; struct persona *q; strcpy(p.nombre, "Santiago"); strcpy(p.apellido, "Ciciliani"); p.genero = 'M'; p.altura = 1.75; q = (struct persona*)malloc(sizeof(struct persona)); strcpy(q->nombre, "Peter"); strcpy(q->apellido, "Capusoto"); q->genero = 'F'; q->altura = 1.60; printf("Los dos nombres son: %s y %s", p.nombre, q->nombre); free(q); } Puntero a la estructura (4bytes) Como es un puntero, le tengo que asignar un espacio de memoria a donde apuntar! Operador “flechita” (->) equivalente a poner: (*q).
Pasar como referencia void elevarAlCuadrado (int *x); #include <stdio.h> int main(void) { int a = 2; elevarAlCuadrado (&a); printf("El valor del cuadrado de a es: %d\n", a); } void elevarAlCuadrado (int *x) { (*x) = (*x) * (*x); } No paso “a”, sino su dirección Trabajo con “eso que está apuntado en la dirección x” y no con x que tiene una dirección de memoria
Biblioteca estandar <assert.h> Contiene la macro assert (aserción), utilizada para detectar errores lógicos y otros tipos de fallos en la depuración de un programa. <complex.h> Conjunto de funciones para manipular números complejos (nuevo en C99). <ctype.h> Contiene funciones para clasificar caracteres según sus tipos o para convertir entre mayúsculas y minúsculas independientemente del conjunto de caracteres (típicamente ASCII o alguna de sus extensiones). <errno.h> Para testar los códigos de error devueltos por las funciones de biblioteca. <fenv.h> Para controlar entornos en coma flotante (nuevo en C99). <float.h> Contiene la definición de constantes que especifican ciertas propiedades de la biblioteca de coma flotante, como la diferencia mínima entre dos números en coma flotante (_EPSOLON), el número máximo de dígitos de precisión (_DIG), o el rango de valores que se pueden representar (_MIN, _MAX). <inttypes.h> Para operaciones de conversión con precisión entre tipos enteros (nuevo en C99). <iso646.h> Para utilizar los conjuntos de caracteres ISO 646 (nuevo en NA1). <limits.h> Contiene la definición de constantes que especifican ciertas propiedades de los tipos enteros, como rango de valores que se pueden representar (_MIN, _MAX). <locale.h> Para la función setlocale() y las constantes relacionadas. Se utiliza para seleccionar el entorno local apropiado (configuración regional). <math.h> Contiene las funciones matemáticas comunes. <setjmp.h> Declara las macros setjmp y longjmp para proporcionar saltos de flujo de control de programa no locales. <signal.h> Para controlar algunas situaciones excepcionales como la división por cero. <stdarg.h> posibilita el acceso a una cantidad variable de argumentos pasados a una función. <stdbool.h> Para el tipo booleano (nuevo en C99). <stdint.h> Para definir varios tipos enteros (nuevo en C99). <stddef.h> Para definir varios tipos de macros de utilidad. <stdio.h> Proporciona el núcleo de las capacidades de entrada/salida del lenguaje C (incluye la venerable función printf). <stdlib.h> Para realizar ciertas operaciones como conversión de tipos, generación de números pseudo-aleatorios, gestión de memoria dinámica, control de procesos, funciones de entorno, de señalización (??), de ordenación y búsqueda. <string.h> Para manipulación de cadenas de caracteres. <tgmath.h> Contiene funcionalidades matemáticas de tipo genérico (type-generic) (nuevo en C99). <time.h> Para tratamiento y conversión entre formatos de fecha y hora. http://es.wikipedia.org/wiki/Biblioteca_est%C3%A1ndar_de_C