CAPÍTULO 7 LA FUNCIÓN MAIN Todos los programas en lenguaje C deben tener la función main(). Algunos programadores colocan el main() al principio del archivo, otros al final, puede ir en cualquier parte del archivo fuente. 7.1. ARGUMENTOS EN LA LINEA DE ORDENES El lenguaje C genera código procurando que el intercambio de argumentos sea compatible con UNIX cuando se realiza la ejecución de un programa. Por ejemplo, es muy común que los programas ( tal es el caso de los comandos del sistema operativo) acepten una serie de parámetros al realizar la ejecución, es decir: Ej 7.1. Paso de parámetros aun programa o comando en la línea de órdenes. copy archivo1 archivo2 dir *.c /p attrib - r -h -s *.* tarea /AYUDA tarea /? En el Turbo C, por convención la función main() acepta tres parámetros (o argumentos), ellos son: argc, argv, env Argumentos argc argv env Descripción # de argumentos Dirección de una matriz de punteros a c/u de los argumentos Dirección de una matriz de punteros a las variables de entorno Tabla 7.1. Descripción de argumentos de la función main(). Es decir main(int argc, char *argv[], char *env[]); argc : argv[1]: argv[2]: argv[argc-1]: argv[argc]: argv[0]: Número de argumentos pasados Dirección del primer argumento Dirección del 2º argumento Dirección del ultimo argumento NULL Apunta al primer caracter del nombre del programa 58 Preparado por Juan Ignacio Huircán Cada elemento env[] almacena una cadena de la forma ENVAR=valor , donde ENVAR es una variable de ambiente o de entorno, tal como el PATH. el elemento valor contiene el valor para el cual está seteada la variable ENVAR. Es decir, si la variable de ambiente es el PATH, su valor puede ser C:\DOS; C:\TC;C:\TC\BIN, etc. Algunos formatos válidos de la función main main(); main(int argc); main(int argc, char *argv[]); main(int argc, char *argv[], char *env[]); Ej 7.2. Uso de los argumentos en la función main(). /* Argu.c */ #include <stdio.h> void main(int argc,char *argv[],char *env[]) { int i; for(i=1;i<argc;i++) printf("%s \n",argv[i]); for(i=0;ent[i]!=NULL;i++) printf("%s \n",env[i]); } AL compilar dicho código fuente, se generará el programa Argu.exe , el cual puede ser ejecutado desde el "prompt" del sistema operativo. Si se ejecuta Argu, solamente imprime las variables de ambiente Si se ejecuta Argu 1, imprimirá el primer argumento y luego las variables de ambiente Ej 7.3. El siguiente programa imprime el número de argumentos pasados y detectados /*--------------------------------------------------------------------------------pro.c Imprime los argumentos pasados y el # de argumentos detectados. Este programa debe ejecutarse de la siguiente forma: Pro Hola 1 2 /p ---------------------------------------------------------------------------------*/ #include <stdio.h> void main(int argc,char *argv[],char *ent[]) { int i; for(i=0;i<argc;i++) printf("%s \n",argv[i]); printf("\n%d\n",argc); } Herramientas de programación 59 A este programa se le han pasado 4 argumentos: HOLA, 1 ,2 y /p Además imprime el nombre del programa, pues este se encuentra almacenado en argv[0]. Ej 7.4. Un ejemplo clásico del uso de argumentos puede ser el paso de un parámetro que modifique la ejecución de un determinado programa, esto de acuerdo al argumento pasado. Como los argumento son cadenas de caracteres, toda comparación que se realice, se debe hacerse con funciones dedicadas a tal efecto. #include <stdio.h> #include <string.h> void main(int argc,char *argv[],char *ent[]) { if(!strcmp(argv[1],"/?")) { printf("pro [/ARG]\n"); printf("[ARG]\n"); printf("/? : Ayuda\n"); printf("/1 : Imprime HOLA\n"); } if(!strcmp(argv[1],"/1")) { printf("HOLA\n"); } } 7.2. VALORES RETORNADOS POR LA FUNCIÓN main() El valor retornado por la función main() es un código de estado del programa, un número entero (int). Sin embargo, si el programa usa la instrucción exit para terminar, el valor retornado por el main será el argumento pasado al llamar a la función exit.Cuando el main() retorna un valor, este es almacenado en una variable de ambiente del sistema operativo. Ej 7.5. Función main retornando el valor 1. int main() { ... return(1); } void main() { ... exit(1); } Si quiere indicar que al main() no retorna valores y no se le pasan argumentos se escribe con el siguiente formato void main(void) 60 Preparado por Juan Ignacio Huircán