Programación con EVC Clases 1

Sistemas electrónicos para robots móviles Capítulo 1 Programación con EVC 4 _________________________________ 1 1 Clases _________________________

4 downloads 77 Views 79KB Size

Recommend Stories


Escuela y clases subalternas 1
Cuadernos Políticos, Número 37, México, D.F., Editorial Era, julio –septiembre de 1983, pp. 70-80. Justa Ezpeleta / Elsie Rockwell Escuela y clases

CLASES DE PALABRAS 1: PALABRAS VARIABLES
CLASES DE PALABRAS 1: PALABRAS VARIABLES. 1. EL ADJETIVO CALIFICATIVO - Definición. Palabras que acompañan al sustantivo especificando o completando s

BLOQUE V: LAS CLASES DE PALABRAS 1
1 BLOQUE V: LAS CLASES DE PALABRAS LAS UNIDADES DE LA LENGUA La lengua puede estudiarse desde diversos puntos de vista. Para hacerlo, cada una de la

CLASES HOMOCLINICAS GENERICAS CON INTERIOR. 23 de Junio de 2008
CLASES HOMOCLINICAS GENERICAS CON INTERIOR RAFAEL POTRIE 23 de Junio de 2008 Resumen. La idea de estas notas es dar un resumen de lo que es mi tesis

Story Transcript

Sistemas electrónicos para robots móviles

Capítulo 1

Programación con EVC 4 _________________________________ 1

1

Clases _______________________________________________________ 1

2

Las cadenas de caracteres_______________________________________ 3 2.1 Juego de caracteres ASCII ______________________________________ 3 2.2 Juego de caracteres UNICODE___________________________________ 5 2.3 Cadenas de caracteres __________________________________________ 5

3

CString ______________________________________________________ 6

4

Programación de interfaces en Windows __________________________ 7 4.1 Controles ____________________________________________________ 9 4.2 Gestión de controles desde el entorno de desarrollo __________________ 11

0

Sistemas electrónicos para robots móviles

Capítulo 1 PROGRAMACIÓN CON EVC 4 1 Clases Una clase es una estructura de datos que contiene variables (también llamadas propiedades o estados), y funciones (también llamados métodos o comportamientos). Como estructura de datos que es, cuando se define se crea un nuevo tipo de datos, cuyo nombre se indica al lado de la palabra clave class. La forma de declarar una clase en C++ es (las declaraciones en C++ siempre van en los ficheros *.h): class CRobot { public: // Accesible desde fuera de la clase int get_numero_sensores(); // método CRobot(int numero_sensores); // constructor ~CRobot(); // destructor private: // Inaccesible desde fuera de la clase CSensor *vector_sensores; // sensores que tiene el robot int m_numero_sensores; // propiedad };

Tanto las variables como las funciones pueden ser públicas o privadas. Aquellas que son públicas son accesibles desde fuera de la clase; es decir, cualquier función que no se encuentre dentro de la clase puede acceder a parte pública de la clase. Aquellas que son privadas sólo son accesibles desde las funciones que pertenecen a la clase. Cuando se crea una variable del tipo de la clase, se ha creado un objeto; es decir, una variable es a un tipo de dato como un objeto es a una clase. La creación de un objeto de una clase se denomina instanciar la clase; es decir, un objeto de una clase es una instancia de la misma. En toda clase existen unas funciones miembro muy especiales que son:

1

Sistemas electrónicos para robots móviles



El constructor: es una función que tiene el mismo nombre que el de la clase y no se puede llamar directamente, sino que se llama en el momento de la creación de un objeto de la clase.



El destructor: es una función que tiene el mismo nombre que la clase, pero precedido de ~. No se puede llamar directamente, sino que se llama de forma automática en el momento en el que un objeto desaparece. void main(void) { // llama al constructor de robot ya que se crea CRobot robot(4); // crea un robot con 4 sensores. Instancia un robot int n = robot.get_numero_senosres(); // guarda en n el número de sensores

// error!!!! no se puede acceder a la parte privada de una clase desde fuera n = robot.m_numero_sensores; }; // se llama al destructor de robot ya que se sale de la función main

Se ha visto que la declaración de una clase se hace en los ficheros *.h. Pues bien, la definición de una clase se hace en los ficheros *.cpp: // constructor de robot CRobot::CRobot(int numero_sensores) { m_numero_sensores = numero_sensores; vector_sensores = new CSensor[m_numero_sensores]; }; // destructor de robot CRobot::~CRobot(){ delete[] vector_sensores; } // función miembro int CRobot::get_numero_sensores(){ return(m_numero_sensores); }

Cada función va precedida del nombre de la clase seguido de ::, para que se sepa que las funciones son de la clase.

2

Sistemas electrónicos para robots móviles

2 Las cadenas de caracteres Cuando un texto informático utiliza las expresiones juego de caracteres ("Character set") o codificación de caracteres ("Character encoding"), se refiere siempre a una convención (norma) para relacionar una secuencia de octetos con una secuencia de glifos, denominados genéricamente caracteres, que corresponden a letras, símbolos, cifras o ideogramas de un sistema de escritura. En el interior de la máquina, esta correspondencia entre glifos y octetos, se materializan en una tabla denominada página de códigos. Un determinado juego de caracteres se refiere generalmente a un idioma (aunque no siempre), y no tiene porqué contener todos los caracteres y signos del idioma. Existen dos tipos de juegos de caracteres: •

ASCII (8 bits)



UNICODE (16bits)

2.1 Juego de caracteres ASCII Como su propio nombre indica, ASCII (American Standard Code for Information Interchange), tiene origen americano, en el instituto ANSI. El ASCII es simplemente una convención para codificar un conjunto de 128 caracteres (letras, números y símbolos), numerados del 0 a 127. Este número se debe a que emplea sólo 7 bits (27 == 128), algo que parecía suficiente en la época en que se propuso el estándar. Mucha gente cree que el código ASCII tiene 256 caracteres (numerados del 0 al 255), que es la capacidad de los 8 bits de un Byte, pero lo cierto es el denominado "ASCII puro", también conocido como US-ASCII (técnicamente es el ANSI X3.41968), se compone de sólo 7 bits y 128 caracteres (rango 00h-7fh en hexadecimal). El primero es el carácter nulo, y tiene el número 0; el último es el 127.

En los 128 caracteres del código ASCII original se encuentran las letras del alfabeto inglés (mayúsculas y minúsculas), los números, y algunos signos comunes (espacio en blanco, paréntesis, corchetes, suma y resta, dólar, porcentaje, etc.) además de

3

Sistemas electrónicos para robots móviles

otros como retorno de carro, tabulador, campana, etc.

Estos últimos, que eran

necesarios para controlar el funcionamiento de los antiguos teletipos, ocupan las 32 primeras posiciones y la última, y se denominan precisamente por eso caracteres de control o no imprimibles. Puesto que no representan ninguna letra ni signo de puntuación, se designan mediante nemónicos (NULL, NAK, CR, NL, etc), ver Figura 1.

Figura 1: Código ASCII

Con la internacionalización de los ordenadores, se cayó en la cuenta que los 128 caracteres del US-ASCII no eran suficientes para trabajar con los signos de otros idiomas (tildes; signos especiales como las interrogaciones o exclamaciones de apertura; letras como la eñe, la cedilla y otras), de modo que los fabricantes comenzaron a usar un conjunto de caracteres ASCII ampliado de 8 bits (256 caracteres), que además coincidía con el tamaño de palabra de los procesadores de la época. Las 128 posiciones primeras seguían conteniendo el US-ASCII, pero en los 128 caracteres adicionales, que constituyen lo que se denomina ASCII extendido, añadieron todas las letras y signos especiales de uso común en lenguas de Europa occidental, como el español, francés o alemán.

4

Sistemas electrónicos para robots móviles

Por desgracia, en aquel momento no se siguieron estándares únicos, ni hubo una decisión internacional al respecto. Cada fabricante de ordenadores y software usó su propio código seudo-ASCII en variaciones códigos sin pensar en los problemas que esto acarrearía a la informática del futuro. 2.2 Juego de caracteres UNICODE Microsoft en sus sistemas NT y sucesores, incorporó un nuevo sistema para codificar los caracteres que es el sistema denominado UNICODE que utiliza 16 bits para representar los caracteres; sus 65.537 posibilidades permiten representar los de todas las lenguas del mundo. 2.3 Cadenas de caracteres Las cadenas de caracteres son vectores de caracteres cuyo último elemento es el 0 o carácter nulo ‘\0’ (¡Ojo! no confundir con el carácter ‘0’), que indica final de cadena. Según el juego de caracteres que use la cadena de caracteres, se puede definir de diferente manera: •

unsigned short* cadena = _T(“hola”). Cadena de caracteres con caracteres UNICODE. En Windows este tipo de datos también se llama LPCTSTR.



unsigned

char*

cadena

=

“hola”. Cadena de caracteres

concaracteres ASCII. En Windows este tipo de datos también se llama LPTSTR. Para inicializar una cadena de caracteres UNICODE se usa indistintamente la macro o función TEXT() o _T(). Para convertir una cadena de caracteres en un número y viceversa se pueden usar las funciones: •

double atof(char *cadena): convierte una cadena de caracteres ASCII en un número real.

5

Sistemas electrónicos para robots móviles



int

atoi(const

char

*cadena): convierte una cadena de

caracteres ASCII en un número entero. •

char

*_itoa(int

valor,

char

*cadena,

int

base):

convierte un número en una cadena de caracteres ASCII.

3 CString Es una clase preparada para almacenar cadenas de caracteres, que provee un interfaz sencillo su manejo. Gracias a esta clase ya no es necesario usar el tipo de dato unsigned char* (en Windows LPTSTR), aunque la clase CString internamente sí que lo use; de hecho esta clase ofrece la posibilidad de dejar ver sus unsigned char* internos. La clase CString tiene muchos métodos orientados al acceso de caracteres, a la búsqueda de los mismos, a la comparación de cadenas de caracteres y a la conversión de cadenas de caracteres. En esta sección sólo se van a describir los métodos que se consideran más útiles: •

int CString::GetLength(): devuelve el número de caracteres de la cadena.



CString CString::Mid(int first, int count): devuelve una subcadena de caracteres formada por los caracteres que van desde el primero indicado en first y hasta el first+count.



LPTSTR CString::GetBuffer(int nMinBufLength): devuelve la cadena de caracteres en formato unsigned char*. El parámetro MinBufLength debe ser menor o igual que la longitud de la cadena de caracteres; en caso contrario se pierde la información de la cadena.



void

CString::Format(LPCTSTR

formato,

...): permite dar

formato a una cadena de caracteres de la misma manera que lo hace printf. Por ejemplo: void main(void) { CString s; int i = 123; s.Format(_T(“%d”),i); // almacena en s la cadena “123” }

6

Sistemas electrónicos para robots móviles



int CString::Find( LPCTSTR subcadena, int inicio): es una

función que busca una subcadena dentro de la cadena de caracteres a partir de la posición inicio.

Ejemplo: // inicializaciones CString sCadena; CString sCadena2("hola2"); sCadena = "hola"; imprime(sCandena, sCadena2); // saca por pantalla “hola hola2”

// paso de char*

a CString y viceversa

char szCadena[10]="adios"; sCadena = szCadena; imprime(sCadena); // saca por pantalla “adios” sCadena = "hola"; strcpy(szCadena,sCadena.GetBuffer(sCadena.GetLength)); imprime(szCadena); // saca por pantalla “hola”

// operaciones de acceso imprime(sCadena[3]);

// saca por pantalla “a”

imprime(sCadena.Mid(0,3)); // saca por pantalla “hol”

// operaciones de busqueda imprime(sCadena.Find("la",0)); // saca por pantalla 2 // operación de concatenación imprime(sCadena + sCadena2); // saca por pantalla “holahola2” // operación de comparación imprime(sCadena == sCadena); // saca por pantalla “1” (true)

4 Programación de interfaces en Windows Las ventanas en Windows son clases específicas que ha desarrollado Microsoft para que puedan ser manejadas de forma sencilla. Una ventana en Windows está formada por controles. Los controles son componentes que se sitúan en una ventana y sirven para interaccionar con el usuario. Aunque hay muchas clases para gestionar ventanas (CWnd, CWindow, CDialog), en esta sección sólo se va a explicar CDialog. CDialog es la ventana más básica de

7

Sistemas electrónicos para robots móviles

Windows y permite situar controles encima de ella. Cuando se quiere desarrollar una aplicación basada en una ventana de diálogo, se crea una clase con el nombre de la aplicación que es una ventana de diálogo. En esta clase se pueden ir incorporando diferentes tipos de controles, los cuales formarán parte de las propiedades o variables que tiene la clase. Además se pueden añadir nuevas variables o funciones de forma que finalmente la clase creada es una ventana de dialogo con un aspecto y características especiales que son las que el programador ha elegido. Si por ejemplo se crea una aplicación que se llama “Ejemplos”, la clase de diálogo se llamará “CEjemplosDlg”. A continuación se muestra un ejemplo de clase ventana de dialogo que tiene un botón que se llama “BotonRun”. class CEjemplosDlg : public CDialog { public: CEjemplosDlg(CWnd* pParent = NULL);

// constructor

// funciones públicas de la clase int get_contador(); // para devolver el valor del contador private: // variables y funciones privadas globales a esta clase // que quiera usar el programador int contador; void control();

// para llevar cuentas // para controlar un proceso

// funciones eventos que se van a asociar a controles //{{AFX_MSG(CEjemplosDlg) virtual BOOL OnInitDialog(); // evento de visualización de la ventana afx_msg void OnBotonRun(); // evento de clic de un botón //}}AFX_MSG DECLARE_MESSAGE_MAP() };

Además las ventanas tienen un conjunto de eventos asociados; es decir, acciones que pueden suceder en un momento determinado. Desde le punto de vista de la programación un evento no es más que una función, que se ejecuta cuando se produce el evento. El evento más importante de una ventana es:

8

Sistemas electrónicos para robots móviles



OnTimer: las ventanas tienen asociado un timer, que es un contador de tiempo. Gracias a este contador de tiempo se puede hacer que se ejecuten de forma periódica un conjunto de instrucciones.

4.1 Controles Un control es una clase que sirve de interfaz con el usuario y se coloca en una ventana de diálogo. Los controles dentro de un dialogo pueden tener eventos asociados, que no son más que funciones que se ejecutan en el momento en que se produce dicho evento. Dichas funciones tienen un nombre con el prefijo On para indicar que es un evento; por ejemplo OnChange. Hay muchos tipos de controles pero los más importantes son: •

CButton: es la clase que permite crear un botón. El evento por defecto es el OnClic.



CEdit: es la clase que le permite al usuario introducir datos en un programa. El evento por defecto asociado es el OnChange.

Windows provee un conjunto de controles para el manejo de controles y son: •

unsigned int GetDlgItemInt(int id_del_control, int* conversion_ok, int con_signo): función que obtiene el número entero que se ha escrito en el control. Se usa fundamentalmente con controles CEdit. Se pasa como parámetro el identificador del control, una variable booleana que indica si el número lo interpreta con signo o no. Devuelve el número entero que contiene el control y en el parámetro segundo devuelve si la transformación del texto del control al número ha sido correcta. Hay que tener en cuenta que todos los interfaces con el usuario son en modo texto y por lo tanto para poder obtener un número hay que hacer una conversión de texto a número que puede ser o no correcta.



int

GetDlgItemText(

int

id_del_control,

LPTSTR

texto, int cantidad_de_texto_maxima): función que obtiene el texto que hay escrito en el control. Se usa fundamentalmente con controles

9

Sistemas electrónicos para robots móviles

CEdit. Se pasa como parámetro el identificador del control, una cadena de caracteres (que tiene que tener reservada memoria) donde se va a escribir el texto y el número máximo de caracteres que puede coger del control (este parámetro debe ser menor que el número de caracteres que se han reservado para la cadena de caracteres del parámetro segundo). •

void

SetDlgItemText(int

id_del_control,

LPCTSTR

texto_a_escribir): función que escribe en texto en un control. Se usa fundamentalmente con controles CEdit. Se pasa como parámetro el identificador del control, y la cadena de texto que se tiene que escribir en el control. •

void SetDlgItemInt(int id_del_control, unsigned int valor, int con_signo): escribe un número entero en un control. Se usa fundamentalmente con controles CEdit. Se pasa como parámetro el identificador del control, el valor que se tiene que escribir y si se quiere que se escriba con o sin signo. Es necesario recordar que como todos los interfaces con el usuario son en modo texto, esta función hace una conversión de número a texto y por lo tanto necesita información de si debe interpretar el número con o sin signo.

A continuación se muestra un ejemplo de cómo se usan estas funciones: int i = 10; unsigned short sout[] = TEXT("hola"); // reserva 5 caracteres de memoria unsigned char cout[] = "hola"; unsigned short in[MAX]; // reserva MAX caracteres de memoria CString s = cout; int ok;

SetDlgItemText(IDC_EDIT1,sout); SetDlgItemText(IDC_EDIT3,s); SetDlgItemInt(IDC_EDIT2,i,false); i = GetDlgItemInt(IDC_EDIT2,&ok,false); if (ok) GetDlgItemText(IDC_EDIT1,in,MAX-1);

10

Sistemas electrónicos para robots móviles

4.2 Gestión de controles desde el entorno de desarrollo Desde la ventana de recursos del entorno de desarrollo, haciendo clic con el botón derecho sobre un control y accediendo al apartado de propiedades se puede modificar el identificador (ID) de dicho control, o lo que es lo mismo se puede cambiar su nombre (no deja de ser el nombre de una “variable” un tanto especial), que por defecto tiene uno genérico relacionado con el tipo de control que es. Además se pueden modificar sus propiedades (caption, visible, tipo de letra,…). No se debe confundir el nombre que tiene un control a la hora de programar (ID), con el texto que aparece por ejemplo sobre un botón o al lado de un check box (caption). El nombre que se asigna al control deberá ser intuitivo, ya que a la hora de escribir el código o de revisarlo será éste el que se tiene que tener en cuenta. Por defecto los controles tienen asociado un evento, o lo que es lo mismo una acción del usuario sobre los mismos. Por ejemplo en el caso de un botón el usuario puede apretar el botón (surge el evento OnButton) y en el caso de un cuadro de texto el usuario puede cambiar el texto que aparece en el mismo (OnChange). No confundir este último ejemplo con el texto que aparece grabado sobre un botón. Cuando se produce dicho evento se pueden ejecutar una serie de acciones, que serán programadas como una función que se ejecutará cada vez que se realice el evento sobre el control correspondiente. Se pueden añadir diferentes eventos a cada control, pero por ahora sólo se va a describir el evento principal o por defecto de cada uno de ellos. El evento por defecto “aparecerá” si se hace doble clic sobre el control. Entonces se crea una función en el fichero de código asociado al control donde se pueden programar las acciones a ejecutar cuando surja el evento. El nombre de esta función puede ser modificado, pero se aconseja mantener el nombre de la misma para poder relacionarlo fácilmente con el control correspondiente. Además informa del tipo de evento y el control asociado al mismo. A continuación se van a comentar las modificaciones que hay que hacer sobre un programa si se deciden eliminar o modificar controles:

11

Sistemas electrónicos para robots móviles

-

Si se decide modificar el nombre de un control se debe tener en cuenta que no solo hay que hacerlo en la ventana de recursos sino también en todas las zonas de código que lo referencien; exactamente en el fichero *.cpp en la zona de BEGIN_MESSAGE_MAP, ver ejemplo acontinuación.

-

Si se quiere borrar un control, no hará falta eliminar nada en el código, ya que se mantiene tal cual y esto no generará ningún tipo de error. Siempre y cuando no añadamos ningún control del mismo tipo, en cuyo caso hay que tomar la solución del siguiente punto.

-

Por último si decidimos borrar un control y crear uno nuevo del mismo tipo que tenga asociado el mismo evento debemos ponerle el mismo nombre para simplificar.

12

Sistemas electrónicos para robots móviles

// fichero *.h class CEjemplosDlg : public CDialog { public: CEjemplosDlg(CWnd* pParent = NULL); // constructor // funciones públicas de la clase int get_contador(); // para devolver el valor del contador private: // variables y funciones privadas globales a esta clase // que quiera usar el programador int contador; // para llevar cuentas void control(); // para controlar un proceso // funciones eventos que se van a asociar a controles //{{AFX_MSG(CEjemplosDlg) virtual BOOL OnInitDialog(); // evento de visualización de la ventana afx_msg void OnBotonRun(); // evento de clic de un botón //}}AFX_MSG DECLARE_MESSAGE_MAP() }; // fichero *.cpp // lugar para los includes #include "stdafx.h" // constructor CEjemplosDlg::CEjemplosDlg(CWnd* pParent /*=NULL*/) : CDialog(CEjemplosDlg::IDD, pParent){ .... } // asociación del evento de un control a una función BEGIN_MESSAGE_MAP(CEjemplosDlg, CDialog) //{{AFX_MSG_MAP(CEjemplosDlg) // asocia el evento de clic del botón IDC_BOTON_RUN a la función OnBotonRun ON_BN_CLICKED(IDC_BOTON_RUN, OnBotonRun) //}}AFX_MSG_MAP END_MESSAGE_MAP() // función que atiende el evento de arranque de la ventana de diálogo BOOL CEjemplosDlg::OnInitDialog() { ... } // función que atiende el evento de clic del botón IDC_BOTON_RUN void CEjemplosDlg::OnBotonRun() { ... }

13

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.