Taller de Programación en C 2008-II Argumentos Argumentos • Paso por valor Daniel Herrera P. [email protected] • Paso por referencia Paso por valor void intercambio (int x, int y) { int temp; temp = x; x = y; y = temp; } • Error: función intercambia copias de las variables )Valores de x e y afuera de función no cambian )Función recibe una copia de los valores de los argumentos )Función puede modificar copias sin alterar variables originales )Función recibe dirección de los argumentos )Modificaciones sí afectan variables originales Paso por referencia void intercambio (int *x, int *y) { int temp; temp = *x; *xx = *y; y; *y = temp; } • Función recibe direcciones de variables )Usar operador & intercambio(&a, &b); Función main() Perfil de uso de main() • Todas las funciones de C están al mismo nivel • Estándar define )No es posible anidar funciones )Todas las funciones tienen alcance global )Son visibles en todo el archivo • main() es la única función ‘especial’ de C )Es la primera función en ejecutarse )Sólo puede haber una por programa int main(void), o int main(int argc, char *argv[]) • Únicos prototipos válidos! • main() debe retornar un entero )Valor es usado por el sistema operativo ` 0, EXIT_SUCCESS ` Constante EXIT_FAILURE ÃIncluir <stdlib.h> ©Daniel Herrera P. 1 Taller de Programación en C Argumentos a main() • Argumentos de línea de comando del programa )int argc: número de argumentos del programa )char *argv[]: argv[]: puntero a un vector de cadenas de caracteres que contienen los argumentos 2008-II Argumentos de línea de comandos • Función main() sólo puede tener argumentos )void )int argc, char **argv • A Argc: cuenta t argumentos g t del d l comando d • Argv: puntero a vector de ristras )Puede escribirse como int argc, char *argv[] argc y argv Vector argv • gcc prog1.c prog2.c –o prog.exe argc 5 g c c \0 argv p r o g 1 . c \0 p r o g 2 . c \0 \0 - o \0 p r o g . e x e \0 • Vector de punteros a caracteres )Terminado por un NULL )Primer elemento es siempre el nombre del programa ejecutado • Para imprimir sólo los argumentos while (*++argv != NULL) { printf(“%s\n”, *argv); } Usando argv int main(int argc, char *argv[]) { int i, j; for (i = 0; i < argc; i++) { printf("argv[%d] i f(" [%d] = % %s\n", \ " i, i argv[i]); [i]) for (j = 0; argv[i][j]; j++) printf ("argv[%d][%d] is %c\n", i, j, argv[i][j]); } return(0); } ©Daniel Herrera P. Depuración Daniel Herrera P. [email protected] 2 Taller de Programación en C 2008-II Depuración Depuración • Errores de programación • Depuración es una herramienta del programador )Debido a la sintaxis (a = b / a = b;) )Avisos (warnings), funcionamiento depende del condiciones que asume el compilador )Errores de enlazado: funciones que no están definidas en ninguno de los ficheros objetos ni en las librerías )Errores de ejecución: se genera archivo ejecutable pero se cierra abruptamente o no sigue la ejecucion esperada Donde Encontrarlo? )Permiten ejecutar un programa, hacer pausas, volver a comenzarlo, comenzarlo ejecutarlo por partes, partes ver o cambiar los valores de las variables, etc. )Beneficio de aislar la fuente del error. )Determinar una solución para el error. )Aplicar la solución. )Probar el programa. Como opera? Como opera? El preprocesador Daniel Herrera P. [email protected] ©Daniel Herrera P. 3 Taller de Programación en C El preprocesador • Realiza manipulaciones al texto del programa antes de compilarlo )Borra Borra los comentarios )Inserta los archivos de inclusión )Reemplaza macros )Compilación condicional 2008-II Constantes • __FILE__: nombre del archivo siendo compilado • __LINE__: Línea siendo compilada • __DATE__: DATE Fecha de compilación ó )“May 31 2006” • __TIME__: Hora de compilación )“18:40:35” #define #define • Reemplaza un texto por otro • Usado para definir constantes • Ejemplo: #define nombre texto • Ejemplos: #define MAXIMO 24 #define complejo struct complex #define lazoInfinito for(;;) #define CASE break;case #define DEBUG_PRINT printf(“x = %x” \ “y = %y\n”, x, y) )No lleva signo = ni ; final x = 2*x; y += x; DEBUG_PRINT; #define con argumentos Macros con argumentos • Llamado también macro • Otro ejemplo #define CUADRADO(x) x*x • Puede causar problemas! )CUADRADO(6 CUADRADO(6 + 7) equivalente i l a 6 +7*6 + 7 )Mejor usar #define CUADRADO(x) (x)*(x) ©Daniel Herrera P. #define DOBLE(x) x+x • Puede causar problemas! )10*DOBLE(5) 10*DOBLE(5) equivalente i l a 10*5+5 )Mejor usar #define DOBLE(x) ((x)+(x)) 4 Taller de Programación en C 2008-II Macros con argumentos Operador # • Otro ejemplo • El operador # antes del argumento de una macro crea una ristra con éste #define MAX(a, b) ((a) > (b) ? (a) : (b)) x = 5; y = 8; z = MAX(x++, y++); printf(“%d %d %d\n”, x, y, z); #define STR(x) #x Convierte a STR(prueba) en “prueba” prueba • Ejemplo #define printint(var) \ printf(#var “= %i\n”, var) printint(count); se convierte en printf(“count” “= %i\n”, count); Operador ## Macros ó funciones? • El operador ## une los argumentos anterior y siguiente de la macro • Ejemplo • Macros pueden realizar computaciones simples #define #d fi printx(n) i t ( ) printf(“%i\n”, i tf(“%i\ ” x##n) ## ) Une los argumentos x y n printx(20); se convierte en printf(“%i\n”, x20); )Macros mas rápidas que funciones ` No requieren paso de parámetros vía la pila )Macros aumentan el tamaño del código )Macros no definen el tipo del argumento ` Muchas funciones del sistema están implementadas vía macros )Convención: nombres de macros en MAYUSCULAS Compilación condicional • Control de la compilación dependiendo de valores de expresiones #if expresion codigo #endif • Preprocesador evalúa expresión )Expresión debe ser constante o #define ©Daniel Herrera P. Compilación condicional • Ejemplo #if DEBUG printf(“x = %x, y = %y\n”, x, y); #elif .... #endif • Compilación controlada por valor de DEBUG #define DEBUG 1 5 Taller de Programación en C Compilación condicional • Control de la compilación dependiendo de símbolos previamente definidos #ifdef SIMBOLO codigo #endif )También puede usarse #if defined(SIMBOLO) #ifndef SIMBOLO #if !defined(SIMBOLO) 2008-II Compilación condicional #ifdef LINUX #if defined(REDHAT) g _p para_REDHAT;; codigo #endif #if defined(SUSE) codigo_para_SUSE; #endif #endif Definición de símbolos Inclusión de encabezados • Ejemplo anterior depende de si símbolo LINUX está definido • Incluye archivos de declaraciones )Definir Definir con #define #define LINUX • Definir al momento de compilar )Opción –D al compilador gcc gcc –D LINUX tarea1.c )Preprocesador lee el archivo y lo incluye en el g fuente código #include <stdio.h> #include “misfunciones.h” )Archivos de encabezado generalmente usan extensión .h ` Uso de < y > indica archivo del sistema ` Uso de “” indica archivo del usuario Inclusión anidada • Incluir archivos de declaraciones sólo una vez )En archivo de encabezado, definir un símbolo único p para este p proyecto y #ifndef _MIARCHIVO_H_ #define _MIARCHIVO_H_ ... #endif ©Daniel Herrera P. 6