Declarar un array de structs de tamaño dinamico – c++

Pregunta:


buenas, lo que quiero conseguir es declarar un struct con array que tenga su tamaño dinamico, pero cuando lo hago el programa se me cierra mostrando un error.

aqui esta lo que he logrado

#include<iostream>
using namespace std;

struct datos{
    double porc, peso,porc_peso;
    string nombre;
};

int main(){
    int a,b,c, i = 0;
    datos *d;   //<<esto es lo  que quiero declarar de tamanyo dinamico

    while(true){
        cout<<"nombre bebe : ";
        cin>>d[i].nombre;
        if(d[i].nombre == "stop")break;

        cout<<"peso de "<<d[i].nombre<<" (Gr): " ;
        cin>>d[i].peso;
        i++;
    }
    i--;
}

al principio se ejecuta bien, pero al ingresar el peso por 2da vez ( cin>>d[1].peso ) se me cierra el programa.

O mas bien dicho,windowns me dice que el programa ha dejo de funcionar.

Preguntado por: bassily

Paula_plus_plus

Problema

al principio se ejecuta bien, pero al ingresar el peso por 2da vez ( cin>>d[1].peso ) se me cierra el programa.

Lo sorprendente es que te funcione siquiera la primera vez, ya que en los usos que le das a d, dicho puntero jamás contuvo una instancia de datos así que incurres en comportamiento indefinido y podría pasar cualquier cosa… que funcione, que no funcione o que salgan demonios disparados de tus fosas nasales.


Sugerencia

Dado que estás tratando datos dinámicos, debes solicitar memoria para dichos datos en tiempo de ejecución (dinámicamente). Usando un puntero la operación se complica mucho a no ser que pidas de antemano la cantidad de datos a tratar:

int cantidad = 0;
cout << "cantidad: ";
cin >> cantidad;
datos *dato = new datos[cantidad]; //<<aqui se solicita el tamanyo dinamico

for (int indice = 0; indice < cantidad; ++indice){
    cout << "nombre bebe : ";
    cin >> dato[indice].nombre;
    if (dato[indice].nombre == "stop") break;

    cout<< "peso de " <<dato [indice].nombre << " (Gr): " ;
    cin >> dato[indice].peso;
}

//...
delete[] dato; //<<aqui se LIBERAN los datos dinamicos

De no pedir de antemano los datos a tratar, a cada vuelta del bucle deberías:

  1. Crear un buffer con un elemento más.
  2. Copiar los datos antiguos en el buffer nuevo.
  3. Añadir los datos nuevos al buffer nuevo.
  4. Volver al punto nº1.

Lo cuál es complicado en exceso.

Solución

Por suerte C++ dispone de herramientas que hacen los pasos anteriores automáticamente, usando la plantilla std::vector de la stl:

std::vector<datos> coleccion; //<<aqui tiene tamanyo 0 (esta vacio)

while(true){
    cout<<"nombre bebe : ";
    datos dato; //<<aqui creamos un nuevo elemento
    cin>>dato.nombre;
    if(dato.nombre == "stop")break;

    cout<<"peso de "<<dato.nombre<<" (Gr): " ;
    cin>>dato.peso;
    coleccion.push_back(dato); //<<aqui anyadimos el nuevo elemento a la coleccion
}

La coleccion de datos crece dinamicamente, sin necesidad de preocuparse por solicitar o liberar memoria (ya se encarga std::vector).

Otras cosas a tener en cuenta

  1. Te falta incluir la cabecera <string>; deberías publicar código funcional si quieres que te ayuden a resolver tu problema.
  2. Las variables a, b y c no se usan.
  3. Evita usar nombres de variable de una sola letra a no ser que sean auto-explicativas (como por ejemplo las coordenadas x, y, z) ya que hace confuso leer, entender y depurar el código.
  4. Aunque no es estrictamente necesario, da un valor inicial a todas tus variables, en muchas ocasiones seguir esta recomendación te ayuda a evitar otros errores.
  5. No se para que decrementas i al finalizar el bucle.
  6. La función main SIEMPRE debe devolver un valor es aconsejable que devuelva un valor, añade return 0;.

Fuente

Related Posts:

Problemas con el registro de un archivo .tlb – c# windows vb6
Pregunta: La situación es la siguiente: He creado un pequeño proyecto de librería de clases en C# que me permita realizar ciertas operaciones. El nombre del ...
Uso de js y c# en unity. ¿Igual rendimiento? – javascript c# unity3d
Pregunta: Estoy comenzando con unity . Y veo que se pueden usar c# y js para programar. Mi pregunta es si tanto c# como js ...
Cómo puedo incluir librería beecrypt en un proyecto en C – c
Pregunta: Tengo un archivo .lib (librería) y quiero usarla en un proyecto de C. Para ser más especifica estoy intentando instalar beecrypt que es una librería ...
Ocultar y Mostrar con Mapa de Google – javascript c# asp.net
Pregunta: Tengo un div en mi página ASP.NET que contiene un Mapa de Google, y necesito mostrarlo y ocultarlo pero no me funciona. Este es el ...
para que sirve #ifdef_MSDOS_ en c++? – c++
Pregunta: He tenido problemas porque donde trabajo usan una versión de dev c++ 4.9 y yo uso en mi hogar la 5.1, ...
¿Como instalar C# en SublimeText? – c# sublimetext3 sublimetext
Pregunta: El problema es que actualmente quiero programar sobre esta tecnologia, pero no quiero descargar aun el visual studio porque consume recursos y es bastante ...
Thread en c++ error compilacion – c++
Pregunta: Estoy empezando con threads y he estado siguien varios tutos y creo que esta todo bien, pero a la hora de ejecutarlo me da ...
¿Es posible capturar un segfault con try/catch? – c++ try-catch
Pregunta: Para comprobar si es posible hice lo siguiente: try { int *x = 0; *x = 1234; } catch(...) { ...
Conexion C# con PostgreSQL mediante proveedor Npgsql – c# postgresql
Pregunta: Hola el problema es que la conexión esta bien solo cuando estoy utilizando el ODBC, pero cuando lo cambio al proveedor de PostgreSQL Npgsql, ...
Construcción extraña: objeto = funcion1() && funcion2() ¿Posible? – c#
Pregunta: acabo de encontrarme en una documentación una construcción como esta: var pose = Body.LeftHand.Near(Body.Head) && Body.LeftArm.Bended(90); posees una objeto que debe crearse a partir de la ...
Cómo importar datos de un Excel a DataGrid pero iniciarlo en la segunda fila? – c# sql-server postgresql
Pregunta: Disculpen una duda, como cargar de excel un formato iniciando en la segunda fila? tengo este código solamente que el excel esta justificado en ...
No completa el ciclo foreach – c#
Pregunta: Estoy haciendo un método para invertir palabras que contengan 5 o mas letras. El problema que tengo es que si mi cadena tiene mas ...
Obtener elementos específicos de un array – c array optimización
Pregunta: Buenas, si yo por ejemplo hago: char buf; fgets(buf, 1024, stdin); ¿Puedo coger los caracteres que escribí del array sin coger los elementos que no utilicé? ¿O ...
Averiguar número de elementos en un array de LUA – c++ array lua
Pregunta: ¿Cómo puedo averiguar el número de elementos que contiene un array en un fichero LUA? me gustaría poder volcarlo a un entero desde C++. -- ...
La consulta espera el parametro @Nombre que no se ha proporcionado – c# asp.net asp.net-mvc
Pregunta: public bool IngresarUsuario(Prueba objeto) { using (SqlConnection cn = Conexion.Conectar("cadenaCon")) { try ...
Tags:

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *