Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: huchoko en 25 Octubre 2018, 02:50 am



Título: Optimizar este código en C++
Publicado por: huchoko en 25 Octubre 2018, 02:50 am
Tengo este código, el cual funciona, pero tiene un error garrafal.

Código
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <ctime>
  5.  
  6. typedef struct
  7. {
  8. int precio;
  9. int id;
  10. char name[255];
  11. char adc[512]; // caracteristicas adicionales
  12. } prod;
  13.  
  14. void addpr(prod *a);
  15. void db(prod *a);
  16.  
  17. unsigned int pos = 0;
  18. unsigned int nume = 0;
  19.  
  20. int main()
  21. {
  22. int op = 0;
  23.  
  24. // Necesitamos una estructura llamada pres y una llamada *punpress
  25. // la cual apuntara a pres.
  26. prod pres[512], *punpres; // <- creando 512 estructuras??? ineficiente!!!
  27. punpres = pres;
  28. do
  29. {
  30. printf("[1]A%cadir producto [3]Ver base de datos [4]Salir\n", 164);
  31. std::cout << "-> ";
  32. std::cin >> op;
  33. switch (op)
  34. {
  35. case 1:
  36. addpr(punpres);
  37. break;
  38. case 3:
  39. db(punpres);
  40. break;
  41. case 4:
  42. return 0;
  43. default:
  44. std::cout << "Opcion invalida!" << std::endl;
  45. break;
  46. }
  47.  
  48. } while (! std::cin.fail());
  49. return 0;
  50. }
  51.  
  52. void addpr(prod *estr)
  53. {
  54. fflush(stdin);
  55. srand(time(NULL));
  56. std::cout << "Inserte nombre del producto: ";
  57. std::cin.getline(estr[pos].name, 100, '\n');
  58. std::cout << "Inserte precio: ";
  59. std::cin >> estr[pos].precio;
  60. estr[pos].id = rand();
  61. ++pos;
  62. ++nume;
  63. }
  64.  
  65. void db(prod *a)
  66. {
  67. for (pos = 0; pos < nume; ++pos)
  68. {
  69. printf("Nombre: %s\n", a[pos].name);
  70. printf("Precio: $ %i\n", a[pos].precio);
  71. printf("ID: %i", a[pos].id);
  72. printf("\n------------------------\n");
  73. }
  74. }
  75.  
  76.  
En el mismo código se comenta el error, pues el cual es que estoy creando 512 estructuras, por lo cúal hay un límite de productos que se pueden ingresar. Pero me gustaría hacerlo dinámico, osea que el número de estructuras sea proporcional al número de productos. O(n)?
Ya le he tratado de hacer, con malloc, pero no era lo que buscaba...
Saludos :)
PD: Si compilo esto con g++, todo bien (también probé compilando con el standard C++11 y sigue funcionando), pero si compilo con cl (el compiler de VS Studio), al ejecutarlo y elegir la opción 1, se bugea y se salta el campo de ingresar nombre a ingresar precio.


Título: Re: Optimizar este código en C++
Publicado por: elgilun en 25 Octubre 2018, 06:55 am
En C++ un array de dimensión dinámica es de preferencia un std::vector
https://es.cppreference.com/w/cpp/container/vector



Título: Re: Optimizar este código en C++
Publicado por: huchoko en 25 Octubre 2018, 17:57 pm
En C++ un array de dimensión dinámica es de preferencia un std::vector
https://es.cppreference.com/w/cpp/container/vector


Me podrías dar un ejemplo con mi código?


Título: Re: Optimizar este código en C++
Publicado por: elgilun en 25 Octubre 2018, 20:09 pm
Código:
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>

struct prod
{
prod(std::string name, int precio, int id)
: name{ name }
, precio{ precio }
, id{ id }
{}

int precio;
int id;
std::string name;
std::string adc; // caracteristicas adicionales
};

void addpr(std::vector<prod>& vProd);
void db(std::vector<prod>& vProd);

int main()
{
std::vector<prod> vProd; // el "array" de productos

// ...
// ... etcétera
// ...

// añadir producto:
addpr(vProd);

// ...
// mostrar productos:
db(vProd);
}

void addpr(std::vector<prod>& vProd)
{
std::string name;
int precio;

std::cout << "inserte nombre del producto: ";
std::cin >> name;
std::cout << "inserte precio: ";
std::cin >> precio;

vProd.emplace_back(name, precio, std::rand());
}

void db(std::vector<prod>& vProd)
{
for (const auto& i : vProd) {
std::cout << "mombre: " << i.name << '\n'
<< "precio: " << i.precio << '\n'
<< "ID: " << i.id << "\n------------------------\n";
}
}