TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Thulsa Doom en 12 de Noviembre de 2016, 10:11:38

Título: ¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 12 de Noviembre de 2016, 10:11:38
Hola a todos, pues hace nada he me metido con la programación de Arduino y descubriendo por primera vez el lenguaje c++, me he quedado alucinado con todo el tema ese de las clases y los constructores y me preguntaba si eso no se podría hacer en C18, es que es una pasada para fabricarnos nuestras propias librerías.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: KILLERJC en 12 de Noviembre de 2016, 10:23:26
Eso es de C++. Realmente para mi lo unico envidiable de C++ respecto a C, en los microcontroladores SOLAMENTE ya que en PC hay mas diferencias a podeer usar, son las clases y el overload de operadores.

Te permiten simplificar la programacion en cierto modo, y organizar el codigo mejor. Pero nuevamente, esto es hablando de C++. C no posee esto.
Aunque todo lo que puedas hacer en C++, tambien lo podes hacer en C aunque de otras formas.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 12 de Noviembre de 2016, 11:03:50
Pues a eso me refiero, ¿si hay alguna formad e hacerlo?, ¿con estructuras y punteros o algo?
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: manwenwe en 12 de Noviembre de 2016, 11:16:32
Pues a eso me refiero, ¿si hay alguna formad e hacerlo?, ¿con estructuras y punteros o algo?

Sí claro. En C18 no lo sé porque hace tiempo que no programo PIC18 pero las librerías nuevas de PIC32 están todas en C "emulando" C++: usando estructuras como si fuesen clases y llamandolas con punteros. Ahora que es "lioso de cojones" :P, tienes que ser bastante bueno en C como para seguir el hilo del código...
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 12 de Noviembre de 2016, 11:22:29
Pues a eso me refiero, ¿si hay alguna formad e hacerlo?, ¿con estructuras y punteros o algo?

Sí claro. En C18 no lo sé porque hace tiempo que no programo PIC18 pero las librerías nuevas de PIC32 están todas en C "emulando" C++: usando estructuras como si fuesen clases y llamandolas con punteros. Ahora que es "lioso de cojones" :P, tienes que ser bastante bueno en C como para seguir el hilo del código...

si no te importa podrías poner algún ejemplo sencillo de encender un led o algo y explicarlo un poco a ver si le pillo el toque?, se me ocurren cosas para hacer pero prefiero ver algo ya machacado por alguien así evitaré errores.
gracias de nuevo.
Es que veo que una vez crees un driver de esa manera es muy fácil añadirlo a tu proyecto y se vería todo más claro
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: KILLERJC en 12 de Noviembre de 2016, 12:07:32
si no te importa podrías poner algún ejemplo sencillo de encender un led o algo y explicarlo un poco a ver si le pillo el toque?, se me ocurren cosas para hacer pero prefiero ver algo ya machacado por alguien así evitaré errores.
gracias de nuevo.
Es que veo que una vez crees un driver de esa manera es muy fácil añadirlo a tu proyecto y se vería todo más claro

Pone un ejemplo en C++ del led que queres y lo intento hacer lo mas parecido en C
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 13 de Noviembre de 2016, 11:27:55
Creo que no hay manera de utilizar C++ en C18.

Para trabajar con C++ tienes que pasarte a AVR  (p.e. Arduino) que trabaja con el compilador C++ gnu-avr.

De todas formas hay muchas razones para no trabajar con C++. Linus Torvalds por ejemplo es un gran defensor del C y siempre ha estado en contra de programar en C++ el sistema operativo Linux.

Saludos.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 13 de Noviembre de 2016, 16:09:58
Me refería si se puede hacer algo parecido a lo del constructor y las clases en C, he estado modificando un driver que tengo para medir temperatura con un termopar pero creo que no puedo hacerlo, no queda igual ni de lejos que con C++, el tema es que no veo la manera de hacer algo parecido al constructor de c++, sigo pensando soluciones pero no lo tengo nada claro, creo que no se podrá.

¿sabes las razones de por qué torvalds se decante más por uno que por el otro?
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: KILLERJC en 13 de Noviembre de 2016, 16:41:43
Citar
he estado modificando un driver que tengo para medir temperatura con un termopar pero creo que no puedo hacerlo, no queda igual ni de lejos que con C++

Pero podes hacerlo con C..

Citar
¿sabes las razones de por qué torvalds se decante más por uno que por el otro?

Algunos dicen que no tiene razon para no usar C++, pero queda decir que C++ no es un lenguaje simple de aprender, usar clases y constructores es lo que hace a C++, hay muchas cosas que pasan por debajo y son dejadas al compilador, y tal ves esto es lo que se quiere evitar. Da mayor seguridad saber que se esta haciendo en todo momento, las librerias han sido probadas millones de veces, lo cual tambien da seguridad.

Por lo intentado de aprender C++ (tutoriales+libros) no es para nada parecido a C y es MUCHO mas complejo, aquel que usa C++ en un microcontrolador, simplemente hace uso de C + clases y el overload de operadores (que no creo que muchos lo usen a este ultimo). Y en si se terminan manejando igual que C, por que la gran ventaja del manejo del HEAP en C++ no se puede aprovechar realmente por el costo computacional.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: manwenwe en 13 de Noviembre de 2016, 16:54:39
Me refería si se puede hacer algo parecido a lo del constructor y las clases en C, he estado modificando un driver que tengo para medir temperatura con un termopar pero creo que no puedo hacerlo, no queda igual ni de lejos que con C++, el tema es que no veo la manera de hacer algo parecido al constructor de c++, sigo pensando soluciones pero no lo tengo nada claro, creo que no se podrá.

¿sabes las razones de por qué torvalds se decante más por uno que por el otro?

Linus torvalds decia "nosequé" de que con C++ es demasiado facil "pegarse un tiro en un pie"... no recuerdo bien la frase...

Si no pones un ejemplo es muy dificil ayudarte. Lo del constructor no es complejo. 1º typedef struct (lo que sea), es la clase. 2º Una función que le pasas un puntero a ese tipo de estructura y te inicializa los miembros (ese es el constructor). 3º Declaras a estructura del tipo del paso 1º, declaras el puntero a la estructura y se lo pasas al constructor. 4º Sigues haciendo lo que sea con tu "clase" y tus "métodos" (funciones a las que les pasas el puntero a la estructura).

Échale un ojo a las librerías gráficas de Microchip: todo está hecho de esa forma...y de formas más complejas, con estructuras con miembros comunes a otras estructuras y con "casts" que hacen que los mismos métodos puedan recibir distintos tipos de estructuras (tipo herencia en C++).

Saludos.

Editado: sorry, cuando declaras una estructura del tipo en cuestion y un puntero que apunta a ella, el puntero es el objeto. Ese es lo pasas al constructor para inicializar. Y luego ya haces lo que sea con ese puntero pasandoselo a otro metodos (funciones). Lo siento pero es dificil explicarse jeje
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 13 de Noviembre de 2016, 19:01:20
voy a intentar todo eso que me explicas a ver que tal me sale, practicar practicar hasta la saciedad, por cierto y si no es abusar mucho ya de la confianza, ¿me indicas la librería gráfica a la que te refieres?.

A otra cosa que me confunde mucho al intentar lo de el constructor y las clases en c, el tema de configurar el hardware en arduino se puede hacer desde el constructor pero en c18 veo que se hace fuera en un archivo .h
lo de las clases lo tengo claro que es similar por no decir lo mismo que una estructura, pero lo del constructor eso me desorienta, veo que es como una función donde metes los punteros pero no sé si ahí se puede configurar el hardware, tengo que madurar todo esto todavía, ya entender lo de las clases y el constructor en c++ me costó como un día o dos más o menos...
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 13 de Noviembre de 2016, 19:43:52
¿sabes las razones de por qué torvalds se decante más por uno que por el otro?

Citar
C++ is a horrible language. It's made more horrible by the fact that a lot
of substandard programmers use it, to the point where it's much much
easier to generate total and utter crap with it. Quite frankly, even if
the choice of C were to do *nothing* but keep the C++ programmers out,
that in itself would be a huge reason to use C.

In other words: the choice of C is the only sane choice. I know Miles
Bader jokingly said "to piss you off", but it's actually true. I've come
to the conclusion that any programmer that would prefer the project to be
in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn't come and screw up any project I'm involved with.

C++ leads to really really bad design choices. You invariably start using
the "nice" library features of the language like STL and Boost and other
total and utter crap, that may "help" you program, but causes:

 - infinite amounts of pain when they don't work (and anybody who tells me
   that STL and especially Boost are stable and portable is just so full
   of BS that it's not even funny)

 - inefficient abstracted programming models where two years down the road
   you notice that some abstraction wasn't very efficient, but now all
   your code depends on all the nice object models around it, and you
   cannot fix it without rewriting your app.

In other words, the only way to do good, efficient, and system-level and
portable C++ ends up to limit yourself to all the things that are
basically available in C. And limiting your project to C means that people
don't screw that up, and also means that you get a lot of programmers that
do actually understand low-level issues and don't screw things up with any
idiotic "object model" crap.

So I'm sorry, but for something like git, where efficiency was a primary
objective, the "advantages" of C++ is just a huge mistake. The fact that
we also piss off people who cannot see that is just a big additional
advantage.

If you want a VCS that is written in C++, go play with Monotone. Really.
They use a "real database". They use "nice object-oriented libraries".
They use "nice C++ abstractions". And quite frankly, as a result of all
these design decisions that sound so appealing to some CS people, the end
result is a horrible and unmaintainable mess.

But I'm sure you'd like it more than git.

            Linus
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 13 de Noviembre de 2016, 19:48:21
Bjarne Stroustrup (https://en.wikipedia.org/wiki/Bjarne_Stroustrup):
Citar
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: manwenwe en 14 de Noviembre de 2016, 05:08:03
Bjarne Stroustrup (https://en.wikipedia.org/wiki/Bjarne_Stroustrup):
Citar
C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, it blows away your whole leg.

Eso era jejeje. Siempre me lo dice mi socio que es programador pero siempre se me olvida...
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: manwenwe en 14 de Noviembre de 2016, 05:22:39
voy a intentar todo eso que me explicas a ver que tal me sale, practicar practicar hasta la saciedad, por cierto y si no es abusar mucho ya de la confianza, ¿me indicas la librería gráfica a la que te refieres?.

A otra cosa que me confunde mucho al intentar lo de el constructor y las clases en c, el tema de configurar el hardware en arduino se puede hacer desde el constructor pero en c18 veo que se hace fuera en un archivo .h
lo de las clases lo tengo claro que es similar por no decir lo mismo que una estructura, pero lo del constructor eso me desorienta, veo que es como una función donde metes los punteros pero no sé si ahí se puede configurar el hardware, tengo que madurar todo esto todavía, ya entender lo de las clases y el constructor en c++ me costó como un día o dos más o menos...

Bájate MPALBX y XC32 (instalalos). Instala Harmony (busca en google como se hace, es sencillo). Abre un proyecto de ejemplo (C:/Microchip/Harmony/v_laquesea/apps/gfx/). Y a tirar del hilo....jeje. Cada componente que dibujas (circulo, linea, imagen, boton, etc.) es un como un objeto de C++. Imaginate que tienes un objeto "circulo"...el circulo será de la clase "circulos", que hereda de la clase "primiv¡tives", que hereda de la clase "gráficos".

Ale! a empollar código XD
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 14 de Noviembre de 2016, 12:37:29
A otra cosa que me confunde mucho al intentar lo de el constructor y las clases en c, el tema de configurar el hardware en arduino se puede hacer desde el constructor pero en c18 veo que se hace fuera en un archivo .h

Yo creo que si nos cuentas qué quieres hacer te podemos echar una mano para codificarlo en c de forma eficiente.

Un saludo.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Thulsa Doom en 15 de Noviembre de 2016, 13:02:13
si si, yo primero quiero hacerlo yo y luego ya lo pongo por aquí a ver que me dicen, ahora estoy implementado un driver para el manejo de termistores, cuando tenga algo concreto y que funciona lo paso, me explico el driver me funciona perfecto lo que me gustaría hacer algo como si fuera c++ que veo que es más fácil de utilizar luego las funciones, pero lo que no me gusta es que de momento uso muchas variables globales y eso ya no me mola tanto, bueno ya digo algo
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 15 de Noviembre de 2016, 17:23:08
Si utilizas variables globales dentro de un archivo en c y no las declaras externas fuera de ese archivo, es como si fueran variables privadas de una clase.
Sólo podrás verlas y manejarlas con las funciones de ese módulo (archivo) de c.
Así te aseguras que el resto del programa no las toque, sólo tu librería. Eso te dará el control que quieres sobre las variables globales.

Un saludo.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: KILLERJC en 15 de Noviembre de 2016, 18:18:05
Si utilizas variables globales dentro de un archivo en c y no las declaras externas fuera de ese archivo, es como si fueran variables privadas de una clase.
Sólo podrás verlas y manejarlas con las funciones de ese módulo (archivo) de c.
Así te aseguras que el resto del programa no las toque, sólo tu librería. Eso te dará el control que quieres sobre las variables globales.

Un saludo.

La primer sentencia a mi parecer esta mal. Declarando una variable como "global" (fuera de la funcion en el archivo .c) y no ponerle el static implica que su simbolo puede ser accedido desde otro lugar.
Es el caso que sucede si en el main.c creas la misma variable (mismo nombre y tipo) podes acceder a esta como si fuera compartido, ambos archivos acceden a la misma variable. En si, estas polucionando el espacio de simbolos.

Si queres que unicamente puedan ser accedidos desde el archivo.c concreto, usas el static (fuera de las funciones). Eso limita la visibilidad a unicamente el archivo en cuestion (aunque no probe crear otra variable con el mismo nombre, tipo y puesto como static).

-------

EDIT:

En realidad el static afectaria al "Linkage" (no se como se traduce), pero basicamente viene por el Linker quien es quien decide la posicion de las variables. Al no tener "Linkage" externo no deberia poder ser accedido desde otro lugar. O pensado de otra forma, el simbolo de esa variable unicamente pertenece a ese archivo y no es visto desde los otros.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 15 de Noviembre de 2016, 19:21:36
Si. A eso me refería. Variables "globales" en un archivo (definidas fuera de las funciones) e inaccesibles para otros archivos se comportan de manera semejante a las variables privadas de las clases.
Título: Re:¿Hay alguna manera de crear clases y constructores en C18?
Publicado por: Picuino en 16 de Noviembre de 2016, 10:43:18
Este tipo de programación:

librería.c
Código: C
  1. static int var1;
  2. int libreria_var1_value(void) { return var1; }
  3. void libreria_var1_assign(int value) { var1 = value; }

librería.h
Código: C
  1. int libreria_var1_value(void);
  2. void libreria_var1_assign(int value);

main.c
Código: C
  1. #include "libreria.h"
  2. int main(void) {
  3.    libreria_var1_assign(30);
  4.    printf("%d\n", libreria_var1_value());
  5. }