Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Uso de clases, ¿que estoy haciendo mal? (https://www.clubdelphi.com/foros/showthread.php?t=51696)

gerardorom 25-12-2007 20:05:10

Uso de clases, ¿que estoy haciendo mal?
 
Hola amigos Feliz Navidad! Mi duda es la siguiente:

Estoy creando un reproductor + efectos para .wav haciendo uso de una series de buffer de memoria de tipo short. Al principio, cree mi aplicacion sin clases haciendo lo siguiente,y consiguiendo reproducir mi archivo wav sin problemas una y otra vez:

Código Delphi [-]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
int tambuffer,tamcir,z,j;
bool buf1;
short *datos,*buffer1,*buffer2,*cir;
    tambuffer=2000;
    tamcir=20000;
...
for(j=0;j< tambuffer;++j)
             {
              cir[z]=datos[j];           
                   if(buf1)
                    {
                      buffer1[j]=datos[j];
                    }
                   else
                    {
                      buffer2[j]=datos[j];
                    }
              }
...

Bueno, de echo, la clase si estaba creada y añadida al proyecto, pero no la usaba, usaba las variables buffer, cir y datos, creadas directamente dentro de la rutina asiciada al click del boton de "play".

Posterior mente, empece a hacer uso de mi clase, que tiene el siguente aspecto:

Código Delphi [-]
class Cefecto
{
 private:
         short *buffer1;
         short *buffer2;
         short *cir1;
         short *cir2;
         short *cir3;
         
 public:
       int delaym;
       int tambuf;
       int tamcir;
       Cefecto();
       Cefecto(int delaym,int tambuf,int tamcir);
       ~Cefecto();
        void conftarj();
        void reproducir(char* nombre);
        void memoria();
 };

Despues, en mi aplicacion, hago lo siguiente:

Código Delphi [-]
Cefecto efecto(5000,2000,20000);
...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
...
efecto.memoria();       
 efecto.conftarj();      
efecto.reproducir(nombre);
...

Y por ultimo os pongo un trocito de esas tres rutinas, donde yo creo que puede estar el fallo:
Código Delphi [-]
 void Cefecto::memoria()
    {
     buffer1 = new short[tambuf];
     buffer2 = new short[tambuf];
     cir1= new short[tamcir];
     cir2= new short[tamcir];
     cir3= new short[tamcir];
     };
 
 void Cefecto::reproducir(char* nombre)
    {...
     short *datos;
    datos = new short[tamiter];
    ...
    for(j=0;j< tambuf;++j)
             {
                 cir1[z]=datos[j];            
                   if(buf1)
                    {
                      buffer1[j]=datos[j];
                    }
                   else
                    {
                      buffer2[j]=datos[j];
                    }
...
}
//Es igual que antes pero ahora cir1 y buffer1 no lo creo en "void reproducir" sino que lo tomo de la clase.


El fallo que me da es el siguiente:

"Project Project2.exe raised exception class Eaccessviolation with message 'Access violation at address 01193EA6. Write of adress 0119FFEE'. Process stoped. Use step or run to continue. "

Y me aparece cuando llamo por 2ª vez a "reproducir" o cuando cierro mi aplicacion, pero la 1ª vez que llamo a reproducir no me da ningun, fallo, yme reproduce bien, osea, que me esta llenando los buffers correctamente.


¿Alguna idea?¿?¿¿ Muchisimas gracias de antemano. y Feliz Navidad!! :)

xEsk 26-12-2007 03:45:08

Hola, no me lo he mirado a fondo, si tengo tiempo me lo miro bien (:p)... pero por lo que explicas, de que funciona bien una primera vez pero no una segunda, y sumandole que usas buffers y que el error es un Access Violation... a mi me viene a la cabeza que el error quizas ocurre porque no liberas los buffers correctamente al terminar la primera repetición, y por esto al intentar usarla por segunda vez (con su buffer lleno y todo esto, vamos que no es virgen xD) pues puede provocar que intentes leer en un sitio fuera de memoria, etc... etc....

Ya te digo que no me lo he mirado a fondo, es todo fruto de la imaginación, o sea que no te lo tomes como si este fuera el fallo, simplemente comprueba que liberas todos los buffers al terminar, etc... etc...

Saludos y bones festes.

gerardorom 26-12-2007 15:35:38

tio mil gracias, estaba super convencido que era por el uso de las clases, y era que me salia del indicie de uno de los buffer!! pero esque esebuffer, en el "reproducir" pues se llenaba por lomenos 300 veces, y solo me saltaba el fallo al cerrar la aplicacion! o intentar reproducir de nuevo, jujujujujuj que felicidad gracias !!


La franja horaria es GMT +2. Ahora son las 05:55:46.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi