Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con asignacion dinamica de memoria

Estas en el tema de Problema con asignacion dinamica de memoria en el foro de C/C++ en Foros del Web. Hola, ¿que tal? este es mi primer mensaje en el foro. necesito ayuda para un programa que estoy haciendo. uso el compilador dev - C++ ...
  #1 (permalink)  
Antiguo 07/06/2008, 20:15
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 10 meses
Puntos: 0
Problema con asignacion dinamica de memoria

Hola, ¿que tal? este es mi primer mensaje en el foro. necesito ayuda para un programa que estoy haciendo. uso el compilador dev - C++ .
al compilar el programa me da un error, y trate de hacer varias modificaciones pero sigue pasando lo mismo.
hasta el momento los metodos que probe andan bien, pero falla el metodo agregardisco de la clase coleccion. agradezco una respuesta
saludos



Clase Fecha :


fecha.h :

#ifndef FECHA_H
#define FECHA_H
#include <iostream>
#include <cstdlib>

using namespace std;

class Fecha
{
public:
Fecha(int=1,int=1,int=2007);
~Fecha();
void imprimefecha()const;
int getdia()const;
int getmes()const;
int getanio()const;
void setdia(int);
void setmes(int);
void setanio(int);
void setfecha(int,int,int);
private:
int dia;
int mes;
int anio;
};

#endif


fecha.cpp

#include "Fecha.h"

Fecha::Fecha(int d,int m,int a)
{
setfecha(d,m,a);
}

Fecha::~Fecha()
{

}

void Fecha::setfecha(int d,int m,int a)
{
setdia(d);
setmes(m);
setanio(a);
}

void Fecha::setanio(int a)
{
if((a>1900) && (a< 2200))
{
anio=a;
}
else
{
anio=2007;
}
}

void Fecha::setmes(int m)
{
if((m>=0) && (m<13) )
{
mes=m;
}
else
{
mes=1;
}
}

void Fecha::setdia(int d)
{

// verificardia(d) crearia una funcion para verificar que el dia ingresado es correcto
//de no serlo, por defecto el dia seria 1. tambien verificaria
//que el año sea o no bisiesto, para saber si corresponde
//en febrero almacenar un dia 29 o no
//no creé esta funcion, por motivos de complejidad y que
//se desvian del objetivo principal del programa, que es
//practicar composicion

dia=d;
}

int Fecha::getanio()const
{
return anio;
}

int Fecha::getmes()const
{
return mes;
}

int Fecha::getdia()const
{
return dia;
}

void Fecha::imprimefecha()const
{
cout<<dia<<"/"<<mes<<"/"<<anio<<endl;
}



Clase Discos

Discos.h :


#ifndef DISCOS_H
#define DISCOS_H
#include <cstring>
#include <iostream>
#include <stdlib.h>
#include "Fecha.h"

using namespace std;

class Discos
{

friend ostream & operator<<(ostream&,const Discos &);


public:
Discos();
Discos(string,string,int);
Discos(string,string,int,int,int,int,int,int);
~Discos();
string getnombredisco()const;
string getinterprete()const;
void setnombredisco(string);
void setinterprete(string);
static int getcantidaddiscos();
void setcantidadtemas(int);
void settema(string,int);
void operator+();
void operator-();


private:
string nombredisco;
string interprete;
Fecha lanzamiento;
int minduracion;
int segduracion;
static int cantidaddiscos;
string *temas;
int cantidadtemas;
bool dond;
};

#endif


Discos.cpp


#include "Discos.h"
#include <conio.h>
#include <stdio.h>
#include <cstdlib>



using namespace std;



ostream & operator<<(ostream & salida, const Discos &cd)
{
salida<<"CD ="<<cd.getnombredisco()<<endl<<"Artista = "<<cd.getinterprete();
}

void Discos::operator+()
{
cout<<endl;

if(dond==false)
{

for(int j=0;j<cantidadtemas;j++)
{
cout<<"track 0"<<j+1<<":"<<temas[j]<<endl;
}
}
dond=true;

}

void Discos::operator-()
{
if(dond==true)
{
system("CLS");
cout<<nombredisco<<endl<<interprete;
}
dond=false;
}

int Discos::cantidaddiscos=0;

Discos::Discos()
{
nombredisco="xx";
interprete="yy";
cantidaddiscos++;
cantidadtemas=0;
minduracion=0;
segduracion=0;
temas=NULL;
dond=false;
}


Discos::Discos(string nomdisc,string interp,int ct)
{
nombredisco=nomdisc;
interprete=interp;
cantidaddiscos++;
cantidadtemas=ct;
minduracion=10;
segduracion=10;
temas=new string [ct];
for(int i=0;i<ct;i++)
{
temas[i]="track 01"; //seria bueno poner track i , no se como hacerlo
}
dond=false; //significa que no esta desplegada la lista de temas
}

Discos::Discos(string nomdisc,string interp,int ct,int md,int sd,int dl,int ml,int al):lanzamiento(dl,ml,al)
{
nombredisco=nomdisc;
interprete=interp;
cantidadtemas=ct;
cantidaddiscos++;
minduracion=md;
segduracion=sd;
temas=new string [cantidadtemas];
for(int i=0;i<cantidadtemas;i++)
{
temas[i]="track 01"; //seria bueno poner track i , no se como hacerlo
}
dond=false;

}

Discos::~Discos()
{

if(temas!=NULL)
{
delete []temas;
}
else
{
delete temas;
}

cantidaddiscos--;
}

string Discos::getinterprete()const
{
return interprete;
}

string Discos::getnombredisco()const
{
return nombredisco;
}

int Discos::getcantidaddiscos()
{
return cantidaddiscos;
}

void Discos::setcantidadtemas(int ct)
{
if(ct>0)
{
cantidadtemas=ct;
}
else
{
cantidadtemas=1;
}

}

void Discos::setinterprete(string interp)
{
interprete=interp;
}

void Discos::setnombredisco(string ndisc)
{
nombredisco=ndisc;

}

void Discos::settema(string nomtema, int numtema)
{
for(int i=0;i<cantidadtemas;i++)
{

if(i==numtema-1)
{
temas[i]=nomtema;
}
}
}


Clase coleccion


coleccion.h


#ifndef COLECCION_H
#define COLECCION_H
#include "Discos.h"

using namespace std;

class Coleccion
{

/*friend ostream & operator<<(ostream&,const Coleccion &);*/



public:
Coleccion();
Coleccion(string);
void modificarinterprete(string);
void modificarnombredisco(string);
//void modificarndei(string,string);
void imprimirtodoslosdiscos();
void agregardisco(Discos);
void eliminardisco(/*&*/Discos);
Discos operator[](int);


~Coleccion();
private:
Discos * cds;
int cantdiscos;
string nombrecoleccion;
void ordenarporfecha();
};
#endif



Coleccion.cpp :



#include "Coleccion.h"





/*ostream & operator<<(ostream & salida ,const Coleccion & c)
{
salida<<c.imprimirtodoslosdiscos();
}*/


void Coleccion::imprimirtodoslosdiscos()
{
int i=0;


if(cds==NULL)
{
cout<<"No hay discos cargados en la coleccion"<<endl;
}
else
{


for(int i=0;i<cantdiscos;i++)
{

cout<<endl;
cout<<cds[i];

}

}

}

Discos Coleccion::operator[](int i)
{

return cds[i];

}

Coleccion::Coleccion()
{
cds=NULL;
nombrecoleccion="Coleccion predeterminada";
cantdiscos=0;
}

Coleccion::Coleccion(string nc)
{
cds=NULL;
nombrecoleccion=nc;
cantdiscos=0;
}

Coleccion::~Coleccion()
{

delete [] cds;

}

void Coleccion::modificarinterprete(string nint)
{


if(cds!=NULL)
{


int i=0;
string nuevonombre="";
cout<<endl;
cout<<"Ingrese el nuevo nombre de interprete : "<<endl;
cin>>nuevonombre;

for(i=0;i<cantdiscos;i++)
{

if(cds[i].getinterprete()==nint)
{
cds[i].setinterprete(nuevonombre);
break;

}

}

}

}

void Coleccion::modificarnombredisco(string nnd)
{



int i=0;
string nuevonombre="";
cout<<endl;
cout<<"Ingrese el nuevo nombre de disco : "<<endl;
cin>>nuevonombre;

for(i=0;i<cantdiscos;i++)
{

if(cds[i].getnombredisco()==nnd)
{
cds[i].setnombredisco(nuevonombre);
break;

}

}




}

void Coleccion::agregardisco(/*&*/Discos d1)
{

if(cds==NULL)
{
cds=new Discos();
cantdiscos++;
return;
}

if(cantdiscos==1)
{
Discos * arraydiscos=new Discos[2];

arraydiscos[0]=cds[0];
delete cds;
cds=new Discos[2];

cds[0]=arraydiscos[0];
cds[1]=d1;
cantdiscos++;
}

Discos * arraydiscos=new Discos[cantdiscos+1];



arraydiscos=cds;
/*for(int i=0;i<cantdiscos;i++)
{
arraydiscos[i]=cds[i];
cout<<arraydiscos[i].getnombredisco()<<endl;
cout<<cds[i].getnombredisco()<<endl;
}*/
arraydiscos[cantdiscos]=d1;
delete [] cds;
cantdiscos++;
cds=NULL;
cds=new Discos[cantdiscos];
cds=arraydiscos;

/*for(int i=0;i<cantdiscos;i++)
{
cds[i]=arraydiscos[i];
}
*/


}

void Coleccion::eliminardisco(/*&*/Discos d1)
{


/* if(cds==NULL)
{
cout<<"No se cargaron cds"<<endl;
return;
}

if(cantdiscos==1)
{
delete []cds;
cds=NULL;
cantdiscos--;
}*/


//Discos * arraydiscos=new Discos[cantdiscos-1];

/* if(cds[cantdiscos-1].getnombredisco()==d1.getnombredisco())
{

for(int i=0;i<cantdiscos-2;i++)
{
arraydiscos[i]=cds[i];
}
cds=NULL;
cantdiscos--;
cds=arraydiscos;

}
else
{

for(int i=0;i<cantdiscos;i++)
{
if(cds[i].getnombredisco()==d1.getnombredisco())
{

for(int j=i;j<cantdiscos-1;j++)
{
cds[j]=cds[j+1];
break;
}
}
else
{
break;
return;
}


}

for(int k=0;k<cantdiscos-2;k++)
{
arraydiscos[k]=cds[k];
}
delete []cds;
cantdiscos--;
cds=arraydiscos;




}*/



}
  #2 (permalink)  
Antiguo 07/06/2008, 20:19
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con asignacion dinamica de memoria

aclaro que hay partes que estan comentadas en el metodo agregardisco, ya que fueron distintas variantes que probe y ninguna anduvo, tambien agregue otras cosas recientemente y sigue sin andar. el objetivo del programa es agregar y eliminar discos a una clase coleccion y poder imprimirlos en pantalla
  #3 (permalink)  
Antiguo 08/06/2008, 02:00
Avatar de aloqui  
Fecha de Ingreso: diciembre-2007
Mensajes: 973
Antigüedad: 16 años, 5 meses
Puntos: 24
Respuesta: Problema con asignacion dinamica de memoria

Si quieres que alguien te ayude deberías indicar cual es el error de compilación y/o ejecución que tienes.
__________________
Grupos de Música
Pop Music Stars
  #4 (permalink)  
Antiguo 08/06/2008, 10:56
 
Fecha de Ingreso: junio-2008
Mensajes: 5
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema con asignacion dinamica de memoria

mencione que falla el metodo agregardisco . el programa compila, pero tengo un error cuando uso ese metodo. cuando salgo del programa aparece un cartel de error en el compilador.
me fije que estaba pasando, asi que decidi imprimir en pantalla los elementos del array cds, y del array arraydiscos, y cuando agrego tres discos en el main, los datos se copian mal (eso aparece como comentarios en el codigo, pero como ya mencione, es por que fui probando distintas cosas y ninguna anduvo).
lo ideal seria que crees un proyecto en el Dev y le agregues un archivo donde tengas un main para probar los metodos, asi te fijas bien que es lo que ocurre.
saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:38.