Universidad Carlos III de Madrid

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

13. Actividades

13.1. Probando tus programas con el compilador

13.1.3. Plan de trabajo

Repite en tu máquina virtual los pasos que se muestran en el vídeo que se menciona en la sección anterior.

13.2. Corrección de errores de compilación en C

13.2.3. Plan de trabajo

  1. Abre el documento Los errores y advertencias del compilador en el que se explican los mensajes de error más frecuentes con el compilador. Tenlo a mano para consultarlo mientras arreglas los errores de los siguientes programas.

  2. Descarga el fichero errors1.c y copialo a tu carpeta de trabajo. Compila el programa de forma que se muestren todos los mensajes de error y advertencias posibles. Guarda los mensajes de error que aparecen en esta primera compilación.

    Busca la forma de arreglar los errores y apunta lo que has tenido que cambiar para cada uno de ellos. Comenta la solución con el profesor si lo necesitas.

    ¿Qué cambio has hecho para que el error errors1.c:16: error: ‘M_PI’ undeclared (first use in this function) haya desaparecido?

  3. Descarga los ficheros errors2a.c, errors2b.c y errors2.h y copialos a otra carpeta de trabajo. El programa consta de dos ficheros de código y uno de definiciones. Compila el programa.

    Al igual que en el apartado anterior, anota todos los cambios que has hecho para eliminar los mensajes de error y advertencia. Puedes mover definiciones y/o declaraciones entre los tres ficheros. Recuerda también, que si una función no está definida es posible que sea parte de una biblioteca. Compruébalo con el comando man.

13.3. Preguntas sobre gcc

13.3.2. Plan de trabajo

  1. Arranca la máquina virtual y abre una ventana de comandos.

  2. Responde individualmente a estas preguntas y contrasta las respuestas con tu compañero de prácticas:

    • ¿Para qué sirve la opción -o?

    • Pon un ejemplo de advertencia que sólo se muestra con la opción -Wall.

    • ¿Cómo se puede saber el tiempo que tarda en ejecutarse un comando?

    • Si un programa se invoca desde el intérprete con el comando programa a b c d, ¿qué valor tiene el primer parámetro de la función main?

13.4. El preprocesador y las líneas que comienzan por #

13.4.2. Recursos

  • La máquina virtual.

  • Ficheros main.c y main.h que debes descargarte en tu directorio actual.

13.4.3. Plan de trabajo

  • Asegúrate de que entiendes cual es el efecto de las directivas #include, #define y #ifdef ... #endif.

  • Responde a las siguientes preguntas y comprueba las respuestas con tu compañero de prácticas antes de la sesión del laboratorio.

    1. ¿Qué diferencia hay entre las directivas #include <fichero.h> y #include "fichero.h"?

    2. Si el programa main.c incluye el fichero main.h, ¿es correcto el siguiente comando?

      $ gcc -o main main.c
    3. ¿Qué diferencia hay entre la directiva #define SIMBOLO y #define SIMBOLO 10?

    4. Supongamos que quieres tener dos versiones de un programa que has diseñado tú. La primera versión la utilizas para depurar errores con lo que el programa imprime por pantalla todo tipo de mensajes de comprobación. La segunda versión es para el cliente y esos mensajes no pueden aparecer en pantalla. ¿Cómo conseguirías esto utilizando la directiva #ifdef?

  • Prepara la máquina virtual para trabajar con un terminal de comandos y el compilador.

  • Edita los ficheros main.c y main.h. Además de la directiva #ifdef el programa utiliza la directiva #ifndef que simplemente es la negación de la anterior. Crea dos versiones del ejecutable una que imprima msg1 y no msg2, y la otra que imprima los dos mensajes.

13.5. Compilación y ejecución de un programa en el Nokia N810

13.5.2. Recursos

13.5.3. Plan de trabajo

  1. Compila y ejecute un programa en tu carpeta src de tu espacio de trabajo (recuerda que para ejecutar has de anteponer el prefijo ./ al nombre del fichero).

  2. El ejecutable que acabas de producir es para ejecutar en el ordenador personal. Para ejecutar este mismo programa en el Nokia N810 se necesita generar una versión especial para ser ejecutada en el nuevo entorno. Para ello se utiliza un compilador cruzado (sb2) que estudiaremos en detalle en una sesión futura.

    Compila de nuevo el programa pero ahora anteponiendo al comando el prefijo sb2, por ejemplo:

    sb2 gcc -Wall *.c -o filename

    El compilador que se ejecuta no es el normal, sino el que genera código (filename) para el Nokia N810. Tras compilar el programa, trata de ejecutarlo con el comando ./filename. ¿Puedes explicar lo que sucede?

  3. Ejecuta de nuevo el programa, pero insertando de nuevo el prefijo sb2, por ejemplo:

    sb2 ./filename
  4. Enciende el Nokia N810 y conecta el cable USB al ordenador personal en el que está el programa que acabas de crear. En la máquina virtual aparecerá la notificación ofreciendo la posibilidad de abrir la carpeta del nuevo dispositivo. También puedes acceder a esta opción a través del icono de USB en el panel en la parte inferior derecha de la pantalla y que se muestra en la siguiente figura.

  5. Copia el ejecutable que acabas de crear en la carpeta del Nokia N810. Para ello puedes utilizar el gestor de ficheros que al pulsar F3 muestra dos carpetas a la vez y permite arrastrar ficheros de una a la otra.

  6. Cierra el gestor de ficheros y a través del icono en la parte inferior derecha de la pantalla desmonta el dispositivo y desconecta el cable USB.

  7. En el N810 abre el menú de aplicaciones (icono con cuatro cuadrados) en la parte izquierda de la pantalla. Selecciona Utilities y al fondo del menú que aparece, selecciona el terminal de comandos (X Terminal). A continuación se abre una ventana con un intérprete de comandos similar al que utilizamos en la máquina virtual.

  8. La carpeta en la que copiaste el fichero está debajo del directorio /media/mmc2. Busca el programa y copialo con un comando similar a:

    cp /media/mmc2/filename filename

    Este comando copiará el programa filename a la carpeta /home/user

    Si no se encuentra bajo /media/mmc2 prueba con /media/mmc1.

  9. Tal y como se ha copiado, el programa no tiene permisos de ejecución, con lo que hemos de asignarlos con el comando

    chmod u+x filename

    Tras este comando ya puedes ejecutar el programa. Recuerda anteponer el prefijo ./. Comprueba que el comportamiento es idéntico al que has visto en la máquina virtual.

13.6. Diseño, creación y compilación de un programa en C

13.6.2. Recursos

13.6.3. Plan de trabajo

  1. Abre los documentos anteriores. En ellos se explican las opciones más usadas del compilador gcc y como usar la función printf para imprimir un mensaje por pantalla. Tenlos a mano para consultarlos durante la práctica.

  2. Crea una carpeta src en tu carpeta de trabajo.

  3. Descarga los ficheros data_read.o, menu.h, menu_operations.c y copialos en la carpeta src, creada en el paso anterior.

  4. Diseñe y crea una aplicación que cumpla los siguientes requisitos: cargar la información de las redes wifi escaneadas por un teléfono móvil, esta información está almacenada en un array estático dado; listar todas las redes por pantalla; que se pueda consultar la información de una de ellas en concreto y que permita salir del programa. La aplicación debe imprimir en la pantalla un menú con cuatro opciones tal como el que se muestra en la siguiente figura.

    • Primero define los componentes (ficheros: .c, .h) que harán parte de tu programa. Para ello agrupa las funciones teniendo en cuenta las funcionalidades del programa (Ejemplo: programa principal, mostrar el menú, operaciones del menú, definiciones de prototipos). Debes tener en cuenta que ya tienes dos ficheros: menu.h y menu_operations.c, los cuales debes usar para completar la práctica.

    • Escribe el código de la función void menu() para imprimir el menú por pantalla.

    • Crea la función main(), dentro de esta define las variables locales que considere necesarias para que el programa funcione. Entre ellas debes definir una de tipo long int para guardar el valor tecleado cuando se invoca la función data_read(), que retorna una valor de dicho tipo. El código de esta función se incluye en el fichero data_read.o; y para usarla, debes incluirlo en el comando de compilación, cuando vayas a compilar su programa. También debes definir una variable local tipo array de 6 posisiciones (ARRAY_SIZE). Cada posición guardará en una estructura struct ap_scan_info la información de una red wifi. La estructura está definida en el fichero menu.h.

    • Crea las funciones necesarias para implementar la funcionalidad para cada opción del menú:

      • La opción [1] inicializa el array local definido en la función main() con los datos del array wifi definido como una variable estática en la función array_load() en el fichero menu_operations.c

      • La opción [2] imprime por pantalla los datos de las redes wifi disponibles, guardadas en el array. Debes imprimir los datos tabulados y con el formato tal como se muestra en la figura siguiente.

      • la opción [3] imprime la información de una red seleccionada. Para seleccionar la red se debe teclear un valor entre 1 y 6. La informción impresa en la pantalla debe estar formateada tal como se muestra en la figura siguiente

      • la opción [4] termina la ejecución del programa y retorna al sistema operativo.

  5. Compila el código escrito usando el comando gcc, corrige los errores si los hubiese. Al compilar debes incluir en el comando los ficheros .c y el fichero data_read.o. Ejecuta el programa y muestra el resultado al profesor.