Argumentos

Anuncio
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
Descargar