¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. C++
  3. De C a C++
Extrait - C++ De los fundamentos del lenguaje a las aplicaciones
Extractos del libro
C++ De los fundamentos del lenguaje a las aplicaciones Volver a la página de compra del libro

De C a C++

Programación estructurada

Los lenguajes de programación comenzaron muy temprano a ensamblar instrucciones en forma de grupos reutilizables, las funciones. Las variables naturalmente tomaron el mismo camino, aunque un poco más tarde.

El array permite tratar ciertos algoritmos, siempre que los datos a procesar sean de tipo uniforme (char, int, etc.). Cuando los datos a procesar contienen información de diferente naturaleza, es necesario utilizar varios arrays o incluso, un solo array utilizando un tipo ‘todo vale’ void*. Hay que admitirlo, esta solución se debe evitar.

En su lugar, definimos estructuras que agrupan varias variables llamadas campos. Estas variables existen en tantas copias como se desee, y cada copia toma el nombre de la instancia.

El lenguaje C++ conoce varias formas compuestas:

  • las estructuras y las uniones, dispuestas desde C;

  • las clases, que se tratarán en el próximo capítulo.

1. Estructuras

Las estructuras de C++, como las de C, definen nuevos tipos de datos. El nombre que se le da a la estructura genera un tipo de datos:

struct Persona 
{ 
  char nombre[50]; 
  int edad; 
} ; 

A partir de esta estructura Persona, crearemos variables, siguiendo la sintaxis de declaración habitual que asocia un tipo y un nombre:

Persona jean, albertine; 

jean y albertine son dos variables de tipo Persona. Como se trata de un tipo no primitivo (char, int, etc.), decimos que se trata de instancias de la estructura Persona. El término instancia recuerda que el nombre y la edad son características propias de cada persona.

images/cap2-pag2.png

Usamos una notación particular para alcanzar los campos de una instancia:

jean.edad = 50;  // la edad de jean 
printf("%s",albertine.nombre); // el nombre de albertine 

Esta notación vincula el campo a su instancia.

a. Constitución de una estructura

Una estructura puede contener un número ilimitado de campos. Para el lector que es nuevo en este tipo de programación y que está acostumbrado a las bases de datos, es útil comparar una estructura con una tabla en una base de datos.

C++

SQL

estructura

tabla

campo

campo/columna

instancia

registro

Cada campo de la estructura es, por supuesto, de un tipo particular. Puede ser de tipo primitivo (char, int, etc.) o de un tipo estructura. También podemos obtener...

Gestión de la memoria

La memoria es vital para el sistema operativo, cuya tarea principal consiste en separar cada proceso de los demás, asignándole una cantidad inicial de memoria. Descubrimos diferentes estrategias de asignación en función de los sistemas. Los más antiguos (MS-DOS) y los más básicos (en un microcontrolador), adoptan una asignación por bloques de un tamaño determinado (64 kB por ejemplo). Este tamaño no puede cambiar con el tiempo. Otros sistemas utilizan la paginación, una segmentación fina del espacio de memoria en bloques de 4 kB, lo que permite una gestión de la memoria dinámica y eficiente. Siguiendo el uso de la memoria paginada, la dirección expresada por un puntero nunca es una dirección física, sino lógica, el microprocesador se encarga de la traducción.

En cuanto al modelo de aplicación, es decir la segmentación de la memoria del proceso, generalmente tenemos las siguientes áreas:

images/cap2-pag24.png

Siendo el lenguaje C++ como su antecesor muy cercano al sistema operativo, es recomendable estar familiarizado con los diferentes tipos de gestión de memoria. 

1. Alineación de los datos

El desarrollador debe tener en cuenta este aspecto de la gestión de la memoria, si la portabilidad es un criterio importante. No todos los compiladores y microprocesadores almacenan...

La librería estándar de C

Con las estructuras y la asignación de memoria, nos damos cuenta de que un lenguaje debe depender de las librerías del sistema para construir aplicaciones completas. El lenguaje C++ tiene su propia librería, pero muchos programadores todavía usan las funciones estándar del lenguaje C.

1. Las funciones comunes del lenguaje C <stdlib.h>

La librería estándar stdlib.h contiene funciones generales. Algunas funciones también se pueden declarar en otros encabezados.

Aquí hay una lista que resume algunas funciones interesantes para el desarrollo actual. Es una buena idea consultar el libro de Kernighan y Ritchie o la documentación suministrada con el compilador, para conocer tanto la lista completa de funciones como al mismo tiempo su firma.

Kernighan y Ritchie es la obra de referencia escrita por los creadores del lenguaje C. Siempre se edita y actualiza a partir de las evoluciones del lenguaje C.

Funciones

Utilidad

atoi, atof, strtod...

Funciones de conversión entre un tipo cadena y un tipo numérico.

getenv, setenv

Acceso a las variables de entorno del sistema.

malloc, calloc

Asignación de memoria.

rand, abs

Funciones matemáticas.

La librería estándar stdlib también contiene macros de instrucciones basadas en la sintaxis #define:

Macro

Utilidad

__min, __max

Da los valores mín. y máx. de dos argumentos.

NULL

Literalmente (void*)0.

Un pequeño ejemplo muestra cómo utilizar la librería:

char* lectura = new char[500]; 
printf("¿Número? "); 
scanf("%s",lectura); 
 
double numero = atof(lectura); 
double pi = 3.14159265358; 
 
printf("El número más grande es %2f\n",__max(numero,pi)); 
images/cap2-pag27.png

2. Cadenas<string.h>

El lenguaje C++ siempre gestiona sus literales de cadena en el formato char* definido por el lenguaje C. Por lo tanto, es importante conocer las funciones principales de la librería string.h.

Funciones

Herramienta

memcpy, memcmp, memset

Vista de memoria de cadenas de caracteres: copia, comparación, inicialización.

Strcpy, strcmp, strcat, strlen

Copia, comparación, concatenación, longitud.

strchr, strstr

Búsqueda de carácter, de subcadena.

strlwr, strupr

Conversión de minúsculas/mayúsculas....

Trabajos prácticos

1. Carga de scripts en tiny-lisp

El módulo Labmain.cpp define la función load_script() utilizada para cargar un script en la memoria y aplicarle la coloración sintáctica. Esta función se basa en una versión segura de la librería stdlib, y sus métodos son reconocibles por su sufijo _s (que significa secure).

#pragma region load_script 
void load_script(char*filename,bool show_script=false) 
{ 
   string script; 
  FILE* f = NULL; 
  try 
  { 
     // utiliza la versión segura del C++ Runtime 
     int err = fopen_s(&f,(const char *)filename, "rb"); 
     if (err != 0) 
     { 
        cerr << "error de apertura de " << filename << endl; 
        return; 
     } 
 
     int c; 
     char buf[4001]; 
     while ((c = fread(buf, 1, 4000, f)) > 0) 
     { 
        buf[c] = 0; 
        script.append((char*)buf); ...