Repite en tu máquina virtual los pasos que se muestran en el vídeo que se menciona en la sección anterior.
Fichero errors1.c
.
Ficheros errors2a.c
, errors2b.c
y errors2.h
.
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.
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?
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
.
Arranca la máquina virtual y abre una ventana de comandos.
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
?
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.
¿Qué diferencia hay entre las directivas
#include <fichero.h>
y #include
"fichero.h"
?
Si el programa main.c
incluye
el fichero main.h
, ¿es correcto el siguiente
comando?
$ gcc -o main main.c
¿Qué diferencia hay entre la directiva #define
SIMBOLO
y #define SIMBOLO 10
?
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.
Dispositivo Nokia N810 y cable USB.
Fichero: data_read_m.o
.
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).
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?
Ejecuta de nuevo el programa, pero insertando de nuevo el prefijo “sb2”, por ejemplo:
sb2 ./“filename”
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.
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.
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.
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.
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
.
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.
Ficheros data_read.o
, menu.h
y menu_operations.c
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.
Crea una carpeta src en tu carpeta de trabajo.
Descarga los ficheros data_read.o
, menu.h
, menu_operations.c
y copialos
en la carpeta src, creada en el paso
anterior.
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.
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.