elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / [c++11] ¿Como pasar n argumentos a una función? 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:



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
  1. #ifndef M_REGISTER_H
  2. #define M_REGISTER_H
  3.  
  4. #include <QString>
  5. #include <map>
  6.  
  7. class m_register
  8. {
  9.    QString m_Name;
  10.    std::map<int, QString> m_Field_1;
  11.    std::map<int, QString> m_Field_2;
  12.    std::map<int, QString> m_Field_3;
  13.  
  14. public:
  15.    m_register(QString name) : m_Name(name) {}
  16.    QString getName(void) const;
  17.    void setField_1(const std::map<int, QString> field);
  18.    std::map<int, QString> getField_1(void) const;
  19.    void setField_2(const std::map<int, QString> field);
  20.    std::map<int, QString> getField_2(void) const;
  21.    void setField_3(const std::map<int, QString> field);
  22.    std::map<int, QString> getField_3(void) const;
  23. };
  24.  
  25. #endif // M_REGISTER_H
  26.  

m_register.cpp
Código
  1. #include "m_register.h"
  2.  
  3. QString m_register::getName() const
  4. {
  5.    return m_Name;
  6. }
  7.  
  8. void m_register::setField_1(const std::map<int, QString> field)
  9. {
  10.    m_Field_1 = field;
  11. }
  12.  
  13. std::map<int, QString> m_register::getField_1() const
  14. {
  15.    return m_Field_1;
  16. }
  17.  
  18. void m_register::setField_2(const std::map<int, QString> field)
  19. {
  20.    m_Field_2 = field;
  21. }
  22.  
  23. std::map<int, QString> m_register::getField_2() const
  24. {
  25.    return m_Field_2;
  26. }
  27.  
  28. void m_register::setField_3(const std::map<int, QString> field)
  29. {
  30.    m_Field_3 = field;
  31. }
  32.  
  33. std::map<int, QString> m_register::getField_3() const
  34. {
  35.    return m_Field_3;
  36. }
  37.  

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:


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
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines