Consejos para programar en C

domingo, julio 30, 2006

Manejo de errores

  • Es muy importante detectar a tiempo que ha habido un error cuando se ejecuta nuestro programa y en ese momento terminar la ejecución para evitar qué seguir con ella nos lleve a errores más graves que puedan "colgar" la máquina, por ejemplo.

  • Es recomendable que la salida del programa vaya a stdout (o salida estándar) y los errores vayan a stderr. Por ejemplo:

fprintf(stdout, "La palabra es aceptada\n”);

fprintf(stderr, "Los argumentos de entrada son invalidos\n");

En la lectura de ficheros

Cuando se accede a un fichero para leerlo nos pueden ocurrir los siguientes casos que debemos evitar;


  • Se intenta leer un fichero que no existe y en vez de dar error y salir del programa se continúa y al final el programa termina fallando.

  • Nuestro programa no detecta el final de fichero y se cuelga. Con las funciones de detección de final de fichero y con las funciones de lectura de fichero debemos poder detectar cuando terminamos de leer un fichero.

  • Cuando se está leyendo un fichero no se comprueba que las cosas que se desean leer estén como se espera y esto puede producir que nuestro programa "cuelgue" la máquina. Cuando se está leyendo de un fichero y rellenando con lo que lee unos datos se debe comprobar que se lee lo deseado para evitar problemas.

En el paso de argumentos al main

  • Si nuestro programa puede recibir parámetros a la hora de ejecutarse y estos no son introducidos, lo más lógico es, o bien pedirlos a continuación, o dar un error diciendo cual es la sintaxis de lo que se debería haber introducido - Y para completar podría el programa mostrar una ayuda de los parámetros que acepta y su uso a través del parámetro -? o -h tras el nombre del programa.

  • Si el programa espera argumentos en línea de comandos, hay que asegurarse de que el usuario los ha introducido comprobando el valor de argc.

Trabajo con memoria dinámica

  • Lo primero que tenemos que tener en cuenta es que tenemos en nuestro fichero los includes: y .

  • Siempre que usemos una variable definida como puntero hay que reservar memoria, el siguiente ejemplo sería erróneo ya que no se le da memoria en ningún sitió al puntero a char:

char *cadena;

y después:

scanf("%s", cadena);


  • Se tiene que reservar la memoria para la cadena de caracteres utilizada.

  • Si el programa tiene que parar la ejecución por un error, se debe liberar la memoria reservada hasta el momento.

Trabajo con includes (.h);

  • . No se puede poner ningún include del tipo

  • Indicando el path completo al archivo: #include “a:\mifichero.h” Se pone de forma relativa: #include “mifichero.h”

  • De un archivo de código: #include “mifichero.c” Nunca un .c en un include.

  • De un archivo nuestro, entre "<" y ">": #include Se pone con comillas: #include “mifichero.h”

Siendo mifíchero.h o mifíchero.c ficheros creados por nosotros. Lógicamente no nos referimos a stdlib.h o stdio.h, u otros includes del sistema.


  • No olvidar poner ningún include, es típico olvidar , (sin estos includes el programa puede dejar la maquina “colgada” a la hora de ejecutarse). Para saber si nos olvidamos poner algún include hay que configurar el Turbo C para que nos avise con un “warning” de ello. Lo más cómodo y recomendable es activar en las opciones del compilador Turbo C (o el que utilicemos) para que avise con un mensaje en todos los casos que nos ofrece.

  • Cuando creamos nuestro fichero de cabecera (.h) tenemos que tener las siguientes instrucciones en éste:

#ifndef__IDENTIFICADOR

#define__IDENTIFICADOR

(...)

#endif