Título: [c++11] ¿Como pasar n argumentos a una función? Publicado por: carl0s_47 en 8 Marzo 2017, 05:07 am Que tal,
Es mi primer pregunta acá, se un poco de C y estoy intentando aprender a programar C++ "moderno" de forma autodidacta y es mi primer proyecto "útil", así que estaré atento a consejos para mejorarlo xD. Quiero diseñar una GUI (con Qt) con la cual pueda mandarle datos a un microcontrolador por puerto serial, con estos datos se van a configurar varios registros de un sensor que esta conectado al microcontrolador. El sensor tiene varios registros, cada registro tiene varios campos y cada campo tiene varios valores que cambian la configuración del sensor, en la siguiente imagen se pueden ver el registro CONFIG_0 y sus campos NUM_TX y TX_FREQ_DIV: (http://i.imgur.com/41UledG.png) Para representar cada campo del registro utilice un std::map, la llave (key) es el número que se le escribirá al campo en el registro (por ejemplo de 0 a 7 en TX_FREQ_DIV) y el valor (value) es la descripción de cada llave ("Divide by 2", "Divide by 4", etc.), el contenido de cada uno de estos campos los agrego a un combobox de Qt. Cada registro del sensor puede tener un número diferente de campos, hay registros con dos campos y otros con 3, 4, etc., así que hice una clase básica: m_register.h Código
m_register.cpp Código
Se ve que los métodos setField y getField de cada campo hacen lo mismo, mi duda es si es posible hacer una sola función que acepte n argumentos (n campos) y cree el mismo número de variables de tipo std::map. ¿Podría inicializar un vector sin especificar cuantos elementos contiene y especificar su tamaño en el constructor de m_register?. He visto que para métodos con número de argumentos variables utilizan ... (olvide el nombre de esos tres puntos) pero no termino de entenderlos, ¿funcionan como argc y argv? Así va mi GUI xD: (http://i.imgur.com/alOtV58.png) El grupo de arriba es de una prueba que hice sin la clase y el de abajo es una variable de tipo m_register. Saludos Título: Re: [c++11] ¿Como pasar n argumentos a una función? Publicado por: class_OpenGL en 8 Marzo 2017, 09:25 am Yo tampoco sé el nombre de los tres puntos, pero el tema va así:
Existe una librería de C (por lo que también está para C++) que se llama cstdarg. Esta es la que te permite pasar n parámetros. Cuando pasas un número indeterminado de parámetros, la función no sabe cuántos parámetros hay o de qué tipo son, además no sabe donde comienzan en memoria por lo que esas tres cosas se deberían indicar con un parámetro de la función. Por ejemplo, voy a hacer una función que acepte n parámetros y que haga la media aritmética: Código
Título: Re: [c++11] ¿Como pasar n argumentos a una función? Publicado por: MAFUS en 8 Marzo 2017, 12:17 pm Lo más sensato sería que representaras el sensor en tu código, así, incluso, te sería más fácil depurar.
C, y por ende C++ son lenguajes creados para hablar con la máquina pero muchas veces, sobre todo quien trabaja a más alto nivel olvida o desconoce ese potencial del lenguaje. En tu caso deberías usar los bitfields. En tu ejemplo, para representar el registro CONFIG_0 podrías hacer así: Código
Título: Re: [c++11] ¿Como pasar n argumentos a una función? Publicado por: ivancea96 en 8 Marzo 2017, 13:45 pm Si pones un ejemplo del código en el que uses los métodos de la clase m_register, se me despejarían algunas dudas.
No estoy seguro de que realmente te interese una función variadic. Si quieres comprimir los 3setters y los 3 getters en 1 setter y 1 getter, podrías meter los 3 maps en un array (o en una std::list si te interesa que sea una cantidad de maps variable (o std::vector, vaya, según necesidades)), y en los setters/getters, recibir como parámetro el índice del map. Si aun quieres utilizar un método variadic, ver un ejemplo de uso sería muy explicativo. Y por cierto, ¿qué valores almacenas exactamente en el map? Título: Re: [c++11] ¿Como pasar n argumentos a una función? Publicado por: carl0s_47 en 8 Marzo 2017, 17:26 pm Que tal,
Por ahora utilizo la clase solo para llenar de información a la ventana, la primer parte del constructor MainWindow le paso la información al grupo CONFIG_0, con la clase paso la información a CONFIG_0_c. Código
Me falta añadir una variable que guarde la locación del campo (a partir de que bit empieza), entonces podría hacer un struct con el std::map y la posición, y en la clase m_register tener un vector de este struct. Saludos Título: Re: [c++11] ¿Como pasar n argumentos a una función? Publicado por: ivancea96 en 8 Marzo 2017, 18:40 pm Ya que lso números son contiguos de 0 a N, en vez de un map, tal vez te interese utilizar un vector o una list.
A parte de eso, sobre el método variadic, lo dicho. Si puedes, pon un ejemplo de cómo usarías el método variadic con una cantidad indefinida de argumentos. No digo que lo hagas, sinó que lo utilices como si existiera para saber qué quieres hacer con él. |