






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Fonaments de programació, Profesor: , Carrera: Enginyeria Tèc. Telecomunicació, Especialitat de Sistemes Electrònics, Universidad: UAB
Tipo: Apuntes
1 / 12
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







Al acabar esta práctica serás capaz de:
sido creados en Visual C++
En esta práctica vamos a aprender a construir aplicaciones que usen Visual Basic y también Visual C++. Esto es muy apropiado cuando queremos que la aplicación tenga una interfaz de ventanas agradable para el usuario, parte que haremos en Visual Basic, pero también debe tener una parte de cálculo y manejo de estructuras de datos, que haremos en Visual C++. La idea básica es que la parte de cálculo la codificaremos en forma de objetos de Visual C++, con sus estructuras de datos y métodos de uso, y a partir de los objetos construiremos una DLL (Dynamic-Link Library) plana. Después, en los procedimientos y funciones de Visual Basic realizaremos llamadas a los métodos de la DLL.
La primera aplicación que vamos a construir leerá una matriz de 5x5 enteros de un fichero de texto llamado “datos.txt”, (operación que realizaremos en Visual C++) y mostrará esa matriz en pantalla (mediante un formulario de Visual Basic que usará un objeto de tipo MSFlexGrid ). Después, cada vez que hagamos clic en un botón (objeto CommandButton ) substituirá la matriz por su traspuesta (operación que también realizaremos en Visual C++). E primer lugar, crea una carpeta llamada prueba1. Dentro de esta carpeta crea una carpeta que se llamará VC , en la que ubicaremos todos los ficheros del proyecto Visual C++, y una carpeta llamada VB , en la que ubicaremos todos los ficheros del proyecto Visual Basic. El siguiente paso es construir, con el Visual C++, el objeto matriz, con los métodos para cargar la matriz del fichero y para trasponerla. Crea, en la carpeta VC, un proyecto Visual C++ de tipo Win32 Dynamic-Link Library , que llamaremos matriz. Al proyecto tenemos que añadirle cuatro ficheros, que se describen a continuación. Los ficheros matriz.h y matriz.cpp contienen las cabeceras y los métodos del objeto matriz. El código de estos ficheros es el siguiente:
Como vemos, hay un método para cargar la matriz del fichero, otro para trasponerla, y otro para consultar cualquiera de sus elementos.
El tercer fichero del proyecto Visual C++ se llamará DLLmatriz.cpp, y contiene la declaración de un objeto de tipo matriz y la definición de los procedimientos y funciones que realmente serán llamados desde Visual Basic. Cada uno de esos procedimientos y funciones ejecutará el método correspondiente del objeto matriz. El contenido del fichero es:
Como ves, los procedimientos y funciones prácticamente lo único que hacen es trasladar la llamada al método correspondiente del objeto matriz. Por esta razón es normal que tengan nombres parecidos. Debes adoptar la costumbre de poner DLL al inicio del nombre de los procedimientos y funciones, para que quede claro que éstos son los procedimientos y funciones de la DLL y no los métodos del objeto. El nombre de los procedimientos y funciones de la DLL debe ser precedidos por las palabras claves FAR PASCAL. Es importante incluir Windows.h porque de lo contrario no reconocerá estas dos palabras clave. El cuarto fichero del proyecto Visual C++ se llamará matriz.def, y tiene el siguiente contenido:
matriz.TextMatrix(matriz.Row, matriz.Col) = dato Next Next End Sub
El código recorre todas las casillas del objeto matriz, obtiene el dato correspondiente del objeto mi_matriz (a través de la llamada a la función DLLdame_dato de la DLL), y lo pone en la casilla que le corresponde. Observa que este procedimiento de Visual Basic no se invocará como consecuencia de ningún evento (clic sobre botones, etc.) sino como consecuencia de una llamada desde otros procedimientos de Visual Basic. El código que debe ejecutarse cuando se produce un clic sobre el botón es el siguiente: Private Sub Command1_Click() DLLtrasponer pintar_matriz End Sub Simplemente llamaremos al procedimiento DLLtrasponer de la DLL, y luego volveremos a pintar la matriz. El último paso es añadir al proyecto de Visual Basic un módulo en el que especificaremos las funciones y la ubicación de la DLL. Para ello, seleccionaremos la pestaña Proyecto-> agregar modulo , y escribiremos el código siguiente: Public Declare Sub DLLcargar _ Lib " matriz.dll" _ ()
Public Declare Sub DLLtrasponer _ Lib " matriz.dll" _ ()
Public Declare Function DLLdame_dato _ Lib " matriz.dll" _ (ByVal i As Long, ByVal j As Long) _ As Long En cada uno de los tres bloques de código estamos declarando uno de los procedimientos o funciones de la DLL, indicando su nombre, la ubicación del fichero matriz.dll, y los parámetros y resultados, si es que tiene. Observa las palabras claves que se usan para declarar los parámetros (por valor) y el resultado de la función DLLdame_dato. El carácter “_” se usa para indicar que la sentencia de código sigue en la línea siguiente. Ahora, para poder ejecutar la aplicación debes crear un fichero de texto llamado datos.txt que contenga los 25 números (5 filas y 5 columnas) que se cargarán en el objeto matriz. Ejecuta ahora el proyecto Visual Basic y observa lo que pasa. Veras que te aparece un mensaje de error como el que muestra la figura:
El error es que no ha encontrado el fichero matriz.dll donde esperaba encontrarlo. Este es un error muy común y vale la pena tener muy claro qué está pasando. El sistema está intentando localizar el fichero matriz.dll en una carpeta especial que llamaremos carpeta por defecto. La carpeta por defecto es siempre la carpeta desde donde se inició la ejecución de la aplicación en curso. Recuerda que la aplicación que estás intentado ejecutar (tu proyecto Visual Basic) se inició poniendo en marcha el programa Visual Basic. En el ordenador en el que se está escribiendo este documento, el programa Visual Basic está en la carpeta: 4
C:\Archivos de programa\Microsoft Visual Studio\VB En este caso, ésta es la carpeta por defecto y es ahí donde el sistema va a buscar el fichero matriz.dll. Como no lo encuentra, da un mensaje de error.
Cierra ahora el proyecto Visual Basic y ponlo en marcha de nuevo pero ahora clicando directamente sobre el fichero del proyecto, que tienes en tu carpeta VB. Ahora, tu carpeta VB es la carpeta por defecto porque la aplicación se ha puesto en marcha desde ahí. Por tanto, coloca ahora el fichero matriz.dll en esa carpeta e intenta ejecutar de nuevo la aplicación. ¿Más problemas? Efectivamente, ahora ya ha encontrado el fichero matriz.dll, pero el que no ha encontrado es el fichero datos.txt, que intenta abrir nada más iniciarse tu aplicación. El mensaje de error es como el que se muestra en la figura:
El problema que tienes es exactamente el mismo que antes. Debes colocar el fichero datos.txt en la carpeta por defecto, es decir, la carpeta VB. Hazlo y comprueba que ahora todo funciona correctamente. Lo habitual es que inicies la ejecución de tus aplicaciones desde Visual Basic. Por tanto, coloca siempre el fichero DLL y los ficheros de datos en la carpeta VB.
La experiencia nos dice que la mayoría de errores que se producen en la construcción de aplicaciones que mezclen Visual C++`y Visual Basic son alguno de los siguientes. Es bueno que los tengas siempre bien presentes, y verifiques que no estás cometiendo ninguno de ellos: (^1) Se han mezclado los fichero de Visual Basic con los de Visual C++. Los primeros deberían estar en la carpeta VB y los segundos en la carpeta VC. 2 En la carpeta que contiene el proyecto Visual C++ no están todos los ficheros. Solo están los ficheros “raros” que genera el sistema (los que tienen extensión .dsw o .dsp, la carpeta Debug, etc.). No están los ficheros con el código fuente (los ficheros con extensión .h, .cpp o .def). Todos estos ficheros deben estar juntos en la carpeta del proyecto Visual C++. (^3) El fichero DLL o alguno de los ficheros de datos no están en la carpeta por defecto.
Vamos a construir ahora una aplicación para trabajar con una lista de personas. La lista de personas será un objeto de Visual C++ con métodos para poner y sacar personas. La interfaz se hará en Visual Basic, mediante un formulario que nos permitirá especificar los datos de las personas que queremos poner en la lista y ver los datos de las personas que sacamos de la lista. Para construir los objetos persona y lista de personas podemos aprovechar el trabajo realizado en la práctica sobre orientación a objetos. En todo caso, si no tienes el código a mano, a continuación tienes un código que te puede servir. Puedes hacer cut&paste para crear la aplicación (acuérdate de crear una carpeta para este nuevo proyecto, con dos carpetas dentro, una para Visual Basic y otra para Visual C++). Objeto persona persona.h class CPersona { 5
class CLista { private: int numero; // numero de personas en la lista CPersona personas[10]; // vector de personas public: CLista(); // constructor int pon_persona(CPersona p); // coloca la persona al final // de la lista // devuelve 0 si ha ido bien // y -1 si no hay sitio int dame_persona (CPersona &p);// pone en p la ultima persona de // la lista y la elimina // devuelve 0 si ha ido bien // y -1 si la lista está vacia };
lista.cpp
#include "persona.h" #include "lista.h"
CLista::CLista () { numero = 0; }
int CLista::pon_persona (CPersona p) { if (numero < 10) { personas[numero++] = p; return 0; } else return -1; }
int CLista::dame_persona (CPersona &p) { if (numero >0) 7
p = personas[--numero]; return 0; } else return -1; }
El código para crear la DLL es el más complicado. Míratelo con calma, y presta atención a los comentarios.
DLLpersonas.cpp
#include "Windows.h" #include "persona.h" #include "lista.h" #include "string.h"
// declaración del objeto de tipo lista de personas CLista mi_lista;
// declaración de los procedimientos y funciones que llaman // a los métodos del objeto
int FAR PASCAL DLLpon_persona (int e, float a, char nom[20]) { // recibimos de Visual Basic, como parámetros // los datos de la persona CPersona p; int er;
// ponemos los datos de la persona en un objeto de tipo persona p.pon_edad (e); p.pon_altura (a); p.pon_nombre (nom);
// añadimos el objeto de tipo persona a la lista er=mi_lista.pon_persona (p); 8
DLLpon_persona @ DLLdame_persona @
Con todo esto ya puedes construir el fichero personas.dll.
Vamos ahora con la parte de Visual Basic. Haz que el formulario principal de la aplicación Visual Basic tenga el aspecto de la figura:
En la parte izquierda escribiremos los datos de las personas que queremos añadir a la lista (operación que se hará al clicar el botón poner ), y en la parte derecha se mostrarán los datos de las personas que salen de la lista (al clicar el botón sacar ). Vemos ahora el código del formulario. Presta sobre todo atención a la forma en que se recibe en Visual Basic como parámetro por referencia un string (en este caso, el nombre de la persona):
Private Sub poner_Click() ‘este es el procedimiento que se ejecutará al clicar el boton poner
Dim er As Long ‘envio a la lista los datos de la persona ‘los cuadros de texto en los que estan los datos se llaman ‘edad_in, altura_in, nom_in
er = DLLpon_persona(edad_in, altura_in, nom_in)
If (er = 0) Then MsgBox "Operación correcta" Else MsgBox "No hay sitio en la lista" End If End Sub
Private Sub sacar_Click() ‘este es el procedimiento que se ejecutará al clicar el boton sacar
Dim er As Long Dim e As Long Dim a As Single Dim nom As String ‘ para recibir un string por referencia en Visual Basic es necesario ‘ inicializar (por ejemplo a espacios) el string
10
nom = " " ‘ ahora obtenemos los datos de la persona de la lista er = DLLdame_persona(e, a, nom)
‘si no ha habido error ponemos los datos en los cuadros de texto ‘correspondientes a la parte derecha del formulario If (er = 0) Then edad_out = e altura_out = a nom_out = nom MsgBox "Operación correcta" Else MsgBox "No hay personas en la lista" End If
End Sub
Para acabar, solo falta crear el módulo:
Public Declare Function DLLpon_persona _ Lib "personas.dll" _ (ByVal e As Long, ByVal a As Single, ByVal nom As String) _ As Long
Public Declare Function DLLdame_persona _ Lib "personas.dll" _ (ByRef e As Long, ByRef a As Single, ByVal nom As String) _ As Long
Ahora ya puedes ejecutar la aplicación (recuerda que debes poner el fichero DLL en la carpeta por defecto). Prueba a ir añadiendo personas a la lista. Verifica que cuando ya has añadido 10, no te deja añadir más porque la lista está llena. Intenta sacar una persona de la lista. Comprobarás que los datos que salen son incorrectos. Hay un error en la aplicación y hay que detectarlo. Para ello, debes aprender a hacer un depurado del código, para lo cual debes aprender alguna cosa nueva que te explicamos en el apartado siguiente.