Me gustaría, si es posible, que me explicaras el termino "abstraccion" en programación en c, como ves soy profano en la materia, si me lo puedes aclarar con algún ejemplo mucho mejor.
Para empezar te diré que la abstracción de datos pertenece más al C++ que al C; de todos modos, es una buena práctica de programación, independientemente del lenguaje de que se trate. De todos modos, se trata de un concepto un tanto complejo, en el que muchas veces ni siquiera los "gurús" del tema se ponen de acuerdo. La idea, en c, es la de hacer "cajas negras" que una vez verificadas ya no haya que modificarlas. Una caja negra es un trozo de código, etc que, sin interesarnos sus tripas, usamos para que realice una tarea. Nosotros le damos unos valores y él nos devuelve unos resultados. Hemos, pues, "abstraído" un proceso, tenemos un elemento que realiza unas funciones conforme a una especificación. La característica que lo define como abstracto es la de no necesitar nada externo -varable global, etc- y estar encapsulado (empaquetado) de tal forma que su comportamiento no genere, ni pueda generar, efectos laterales no deseados. Vamos con un ejemplo concreto. Se necesita hacer una caja negra que calcule la potenciación de un número real. La primera opción -y la única en basic- es tener una variable global y realizar la potenciación de ella: extern double dbl; extern int enlevar; void Potencia(void) { dbl^elevar; } La verdad es que esta realización es una verdadera chapuza. Efectos laterales, muchos, las variables globales pueden ser modificadas por cualquiera, etc. La opción más lógica en C es la de realizar una función que tome un doble y un entero y devuelva un doble que sea el resultado de la potencia: Double pow(double dbl,int elevar) { return dbl^elevar; } Aquí tenemos una "caja negra" que toma un doble y un entero y nos devuelve otro doble. Realmente no nos interesa para nada lo que hay dentro de las llaves, simplemente la cosa funciona y no genera efectos laterales (realmente sí: si se produce un overflow porque el resultado supera el máximo de un doble se llamará a la función mathrerr y el programa abortará, pero hemos reducido en lo posible los efectos laterales). Ampliando el ejemplo, nos hacemos con una serie de funciones matemáticas que calculen operaciones matemáticas típicas (potencias, logaritmos, trigonometría, etc) y las empaquetamos en una biblioteca y la ofrecemos: un fichero .lib con el código, y un .h con las definiciones. Ahora lo que hemos abstraído son las funciones matemáticas básicas, en dos ficheros; las hemos abstraído de, por ejemplo, las funciones de acceso a ficheros, que vienen en otro módulo y con otro fichero cabecera... si te das cuenta es lo que hace el c estándar, cada grupo de funciones está separada por temas (stdio.h, mem.h, etc), están "abstraídas". Creo habértelo dejado más o menos claro; si tienes alguna duda, no tengas reparo en seguir preguntándome.