Actualizado el 15 de Junio del 2021 (Publicado el 17 de Noviembre del 2018)
1.344 visualizaciones desde el 17 de Noviembre del 2018
2,6 MB
39 paginas
Creado hace 11a (04/09/2013)
Fundamentos de la programación
8
Grado en Ingeniería Informática
Grado en Ingeniería del Software
Grado en Ingeniería de Computadores
Facultad de Informática
Luis Hernández Yáñez
Universidad Complutense
Programas multiarchivo y compilación separada
Interfaz frente a implementación
Uso de módulos de biblioteca
Ejemplo: Gestión de una lista ordenada I
Compilación de programas multiarchivo
El preprocesador
Cada cosa en su módulo
Ejemplo: Gestión de una lista ordenada II
El problema de las inclusiones múltiples
Compilación condicional
Protección frente a inclusiones múltiples
Ejemplo: Gestión de una lista ordenada III
Implementaciones alternativas
Espacios de nombres
Implementaciones alternativas
Calidad y reutilización del software
757
762
768
770
778
780
782
784
789
794
795
796
804
808
817
827
Fundamentos de la programación: Programación modular
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Fundamentos de la programación: Programación modular
Página 757
Programas multiarchivo
Código fuente repartido entre varios archivos (módulos)
Cada módulo con sus declaraciones y sus subprogramas
Módulo: Unidad funcional (estructura de datos, utilidades, ...)
ListaLista
Archivos
Archivos
Principal
Principal
Cálculos
Cálculos
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tArray;
void init(tArray &lista);
void insert(tArray &lista,
double elem, bool &ok);
void remove(tArray &lista,
int pos, bool &ok);
...
int main() {
tArray lista;
bool ok;
init(lista);
cargar(lista, "bd.txt");
sort(lista);
double dato;
cout << "Dato: ";
cin >> dato;
insert(lista, dato, ok);
cout << min(lista) << endl;
cout << max(lista) << endl;
cout << sum(lista) << endl;
guardar(lista, "bd.txt");
double mean(tArray lista);
double min(tArray lists);
double max(tArray lista);
double desv(tArray lista);
int minIndex(tArray lista);
int maxIndex(tArray lista);
double sum(tArray lista);
bool cargar(tArray &lista,
string nombre);
bool guardar(tArray lista,
string nombre);
bool mezclar(string arch1,
string arch2);
int size(string nombre);
bool exportar(string nombre);
return 0;
}
Ejecutable
Ejecutable
Fundamentos de la programación: Programación modular
Página 758
Compilación separada
Cada módulo se compila a código objeto de forma independiente
ListaLista
lista.obj
lista.obj
Archivos
Archivos
bool cargar(tArray &lista,
string nombre);
bool guardar(tArray lista,
string nombre);
bool mezclar(string arch1,
string arch2);
int size(string nombre);
bool exportar(string nombre);
archivos.obj
archivos.obj
11101010110010100100101010010
10100101010111110101010001010
01010101010100101010101010110
01010101010101010101010010101
01010101000001010101011010100
10101010101010000101010111100
10101010101111001100101010110
10101010100100101010011110010
10101010010101001010100101010
01010101001010000100111101001
01010110010101010010101001010
10101010100101010010101010100
00101010111001010100101000111
01010111010011010101001010101
11111101010110011010101110000
10010101001010101010101101111
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tArray;
void init(tArray &lista);
void insert(tArray &lista,
double elem, bool &ok);
void remove(tArray &lista,
int pos, bool &ok);
...
Cálculos
Cálculos
double mean(tArray lista);
double min(tArray lists);
double max(tArray lista);
double desv(tArray lista);
int minIndex(tArray lista);
int maxIndex(tArray lista);
double sum(tArray lista);
00101110101011001010010010101
00101010010101011111010101000
10100101010101010010101010101
01100101010101010101010101001
01010101010100000101010101101
01001010101010101000010101011
11001010101010111100110010101
01101010101010010010101001111
00101010101001010100101010010
10100101010100101000010011110
10010101011001010101001010100
10101010101010010101001010101
01000010101011100101010010100
01110101011101001101010100101
01011111110101011001101010111
00001001010100101010101010110
calculos.obj
calculos.obj
01011001010010010101001010100
10101011111010101000101001010
10101010010101010101011001010
10101010101010101001010101010
10100000101010101101010010101
01010101000010101011110010101
01010111100110010101011010101
01010010010101001111001010101
01001010100101010010101001010
10100101000010011110100101010
11001010101001010100101010101
01010010101001010101010000101
01011100101010010100011101010
11101001101010100101010111111
10101011001101010111000010010
10100101010101010110001111010
Fundamentos de la programación: Programación modular
Página 759
Compilación separada
Al compilar el programa principal, se adjuntan los módulos compilados
Bibliotecas del sistema
Módulos del programa
Módulos del programa
Bibliotecas del sistema
Principal
Principal
int main() {
lista.obj
calculos.obj
tArray lista;
bool ok;
init(lista);
cargar(lista, "bd.txt");
sort(lista);
double dato;
cout << "Dato: ";
cin >> dato;
insert(lista, dato, ok);
cout << min(lista) << endl;
cout << max(lista) << endl;
cout << sum(lista) << endl;
guardar(lista, "bd.txt");
iostream.obj
fstream.obj
archivos.obj
......
return 0;
}
math.obj
......
Ejecutable
Ejecutable
Fundamentos de la programación: Programación modular
Página 760
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Compilación separada
Principal
Principal
¡Sólo los archivos fuente modificados necesitan ser recompilados!
COMPILACIÓN
COMPILACIÓN
iostream.obj
fstream.obj
math.obj
......
ENLACE
ENLACE
lista.cpp
main.cpp
lista.obj
calculos.obj
archivos.obj ......
main.obj
Ejecutable
Ejecutable
Fundamentos de la programación: Programación modular
Página 761
Fundamentos de la programación: Programación modular
Página 762
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Creación de módulos de biblioteca
Código de un programa de un único archivo:
Definiciones de constantes
Declaraciones de tipos de datos
Prototipos de los subprogramas
Implementación de los subprogramas
Implementación de la función main()
Constantes, tipos y prototipos indican cómo se usa: Interfaz
Estructura de datos con los subprogramas que la gestionan
Conjunto de utilidades (subprogramas) de uso general
Etcétera
+ Implementaciónde los subprogramas (cómo se hace)
Fundamentos de la programación: Programación modular
Página 763
Creación de módulos de biblioteca
Interfaz: Definiciones/declaraciones de datos y prototipos
¡Todo lo que el usuario de la unidad funcional necesita saber!
Implementación: Código de los subprogramas que hacen el trabajo
No hay que conocerlo para usarlo: ¡Seguro que es correcto!
Interfaz e implementación en dos archivos separados:
Cabecera: Definiciones/declaraciones de datos y prototipos
Implementación: Implementación de los subprogramas.
Archivo de cabecera: extensión .h
Archivo de implementación: extensión .cpp
Mismo nombre
Mismo nombre
Repartimos el código entre ambos archivos (lista.h/lista.cpp)
Fundamentos de la programación: Programación modular
Página 764
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
Creación de módulos de biblioteca
Interfazfrente a implementación
lista.h
lista.h
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tArray;
lista.cpp
lista.cpp
#include "lista.h"
void init(tArray &lista) {
lista.cont = 0;
}
ok false;
void insert(tArray &lista,
double elem, bool &ok) {
if (lista.cont == N) {
}
else {
...
void init(tArray &lista);
void insert(tArray &lista,
double elem, bool &ok);
void remove(tArray &lista,
int pos, bool &ok);
...
Si otro módulo quiere usar algo de esa biblioteca:
Debe incluir el archivo de cabecera
Módulo
Módulo
Unidad
Unidad
Biblioteca
Biblioteca
main.cpp
main.cpp
#include "lista.h"
...
Los nombres de archivos de cabecera
Los nombres de archivos de cabecera
propios (no del sistema) se encierran
propios (no del sistema) se encierran
entre dobles comillas, no entre ángulos
entre dobles comillas, no entre ángulos
Fundamentos de la programación: Programación modular
Página 765
lista.h
lista.h
const int N = 10;
typedef double tArray[N];
typedef struct {
tArray elem;
int cont;
} tArray;
void init(tArray &lista);
void insert(tArray &lista,
double elem, bool &ok);
void remove(tArray &lista,
int pos, bool &ok);
...
Interfaz
Creación de módulos de biblioteca
Archivo de cabecera (.h): todo lo que necesita
conocer otro módulo (o programa principal)
que quiera utilizar sus servicios (subprogramas)
La directiva #includeañade las declaraciones del archivo
de cabecera en el código del módulo (preprocesamiento):
Preprocesador
Preprocesador
Todo lo que se necesita saber para
comprobar si el código de main.cpp
hace un uso correcto de la lista
(declaraciones y llamadas)
main.cpp
main.cpp
#include "lista.h"
...
void remove(tArray &lista, int pos,
bool &ok);
...
void insert(tArray &lista, double elem,
bool &ok);
const int N = 10;
typedef double tArray[N];
typedef struct {
main.cpp
main.cpp
void init(tArray &lista);
tArray elem;
int cont;
} tArray;
Fundamentos de la programación: Programación modular
Página 766
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
z
e
ñ
á
Y
z
e
d
n
á
n
r
e
H
s
i
u
L
lista.cpp
lista.cpp
#include "lista.h"
void init(tArray &lista) {
lista.cont = 0;
}
void insert(tArray &lista,
double elem, bool &ok) {
if (lista.cont == N) {
Creación de módulos de biblioteca
Implementación
Compilar el módulo significa compilar
su archivo de implementación (.cpp)
También necesita conocer sus propias declaraciones:
Al compilar el módulo se genera el código objeto
Si no se modifica no hay necesidad de recompilar
Código que usa el módulo:
Necesita sólo el archivo de cabecera para compilar
Se adjunta el código objeto del módulo durante el enlace
lista.cpp
lista.cpp
#include "lista.h"
...
ok false;
}
else {
...
lista.
Comentarios de: FP08 - Programación modular (0)
No hay comentarios