[C++] problème avec des classes

problème avec des classes [C++] - Programmation

Marsh Posté le 03-02-2002 à 17:38:44    

Bonjour, voici mon problème, répondez moi svp !
(j'utilise VC++ 6.0 et DirectX SDK 7)
 
voila mon code
 
#include <Windows.h>
#include <dsound.h>
 
class CDSoundBuffer
{
public:
 Load( TCHAR* strFileName );
 Close();
 Play();
 PlayAsMusic();
 Stop();
 bool IsPlaying();
private:
 LPDIRECTSOUNDBUFFER DSB;
};
 
CDSoundBuffer::Load( TCHAR* strFileName )
{
//    et la, dès que je touche à DSB, le programme s'arrete ...
//    par exemple  :
    DSB=NULL;
//    et hop, ca s'arrete
}
 
voilà ...
merci d'avance  ;)  
@+

Reply

Marsh Posté le 03-02-2002 à 17:38:44   

Reply

Marsh Posté le 03-02-2002 à 18:00:30    

tagada tsointsoin !
 
quand tu dis ca s'arrete, j'imagine que ton prog fait plouf, autrement dit t'as la chtit machine "ce programme a effectué une operation non conforme" blablabla ?
 
Bon pis avec le code que tu nous a donner on peut pas faire grand chose, donne nous plutot le code ou tu appelle les fonction de ta CDSoundBuffer stp

Reply

Marsh Posté le 03-02-2002 à 18:02:46    

Je ne vois pas ce qui ne vas pas dans ton code et je dirais même que tout va bien. Sinon, tu ne devrais pas mettre de fonctions sans paramètres de retour. C'est un miracle que VC++ ne te guelle pas dessus pour ca :
 
Load( TCHAR* strFileName );
Close();
Play();
PlayAsMusic();
Stop();

Reply

Marsh Posté le 03-02-2002 à 18:19:57    

quand mon prog fait plouf, il revient sous windows (il était en FullScreen avec DDraw) et ne fait aucune erreur...
 
sinon, voila un endroit ou j'appelle la classe :
 
 
extern LPCSTR AppPath; // repertoire d'ou on lance le prog
 
#define DATAREP "Data\\"
#define SPLASHSND "Load.WAV"
 
CDSoundBuffer* DSBSplash;
 
CMenus::LoadSplash()
{
 char* SndName;
 SndName = new char[ strlen( AppPath ) + strlen( DATAREP ) + strlen( SPLASHSND ) ];
 wsprintf( SndName, "%s%s%s", AppPath, DATAREP, SPLASHSND );
 DSBSplash->Load( SndName );
 LocalFree( SndName );
}

Reply

Marsh Posté le 03-02-2002 à 18:27:37    

Bon alors, je sais pas si c'est ca le probleme, mais on ne sais jamais.
 
D'abord un peu de morale, évite à tout pris les fonction printf ( sauf printf elle meme ) qui écrivent dans un tampon. Utilise les nprintf à la place, celles qui vérifient qu'elles ont la place d'écrire.
 
Sinon, je pense qu'il y a une erreur dans ton code, quand tu réserve la place pour SndName, tu a oublié d'allouer un octet pour mettre le char \0 final =>  SndName = new char[ strlen( AppPath ) + strlen( DATAREP ) + strlen( SPLASHSND ) + 1 ];  
 
Sinon, une autre erreur peut-etre beaucoup plus probable :
 
CDSoundBuffer* DSBSplash;
 
Tu a penser à faire quelque part DBSplash = new CDSoundBuffer(); ou un truc comme ca ?

Reply

Marsh Posté le 03-02-2002 à 18:53:06    

Kristoph a écrit a écrit :

Je ne vois pas ce qui ne vas pas dans ton code et je dirais même que tout va bien. Sinon, tu ne devrais pas mettre de fonctions sans paramètres de retour. C'est un miracle que VC++ ne te guelle pas dessus pour ca :
 
Load( TCHAR* strFileName );
Close();
Play();
PlayAsMusic();
Stop();  




 
non c normal qu'il gueule pas, le C indique que pas de param de retour = retourne un int

Reply

Marsh Posté le 03-02-2002 à 20:16:22    

Chut, j'essaye de montrer la bonne facon de faire moi :)
 
Et puis ca devrai au moins déclencher un Warning parceque la norme Iso C++ interdit ca.

Reply

Marsh Posté le 03-02-2002 à 20:49:04    

Kristoph a écrit a écrit :

Chut, j'essaye de montrer la bonne facon de faire moi :)
 
Et puis ca devrai au moins déclencher un Warning parceque la norme Iso C++ interdit ca.  




clair que c trop crade de pas specifier le retour  :D

 

[edtdd]--Message édité par chrisbk--[/edtdd]

Reply

Marsh Posté le 03-02-2002 à 21:27:11    

bin ... euh ... oui, mais j'ai rien a retourner, je fais comment ??
 
void Close();
 
comme ca ?

Reply

Marsh Posté le 03-02-2002 à 21:31:50    

Ouaip !

Reply

Marsh Posté le 03-02-2002 à 21:31:50   

Reply

Marsh Posté le 03-02-2002 à 21:38:50    

apparement c'etait ca qui foirait : DBSplash = new CDSoundBuffer();
(que j'avais pas mis)
Merci beaucoup :)

Reply

Marsh Posté le 03-02-2002 à 21:40:46    

a la place de wsprintf j'ai trouvé cette fonction :
 
int wnsprintf(
    LPTSTR lpOut,
    int cchLimitIn
    LPCTSTR pszFmt,
    ...
);
 
mais elle fait appelle a des lib et des dll que j'avais jms vu :
 
Version 5.00 and later of Shlwapi.dll
 
  Windows NT/2000: Requires Windows 2000 (or Windows NT 4.0 with Internet Explorer 5.0 or later).  
  Windows 95/98: Requires Windows 98 (or Windows 95 with Internet Explorer 5.0 or later).  
  Header: Declared in shlwapi.h.  
  Import Library: shlwapi.lib.
 
qu'en pensez vous ?

Reply

Marsh Posté le 03-02-2002 à 21:47:38    

sinon, j'avais des problèmes avec les constructeurs d'une classe, je suppose que ce sera résolu avec la mm chose que la haut :)
Mais par contre pour détruire une classe (et en meme temps executer le destructeur) comment je dois faire ?

Reply

Marsh Posté le 03-02-2002 à 21:54:02    

pour detruire une classe alloué avec new tu fais delete  
 
ex :
 
CMaClasse *truc = new CMaClasse;
...
delete truc;
 
 
 
si jamais t'as alloué un tableau de classe la manip est !=  
 
CMaClasse *truc = new CMaClasse[12];
...
delete []truc;
 
 
si t'as fais ca de facon standart:
 
CMaClasse truc;
 
alors t'as pas a t'occuper de la destruction, le compilo s'en charge pour toi

Reply

Marsh Posté le 03-02-2002 à 22:13:19    

Pour wnsprintf, ca ressemble a ca. Mais si ca fais pas partie des lib standard sous VC++, je comprend qu'ils y aie tellement de failles de sécuritée chez Microsoft :/
 
Tu ne pourrais pas utiliser sprintf/snprintf à la place ? J'ai l'impression que wsprintf/wsnprintf sont des trucs proprio Microsoft.

Reply

Marsh Posté le 03-02-2002 à 22:52:20    

wsprintf c pas pour le support de unicode ?

 

[edtdd]--Message édité par chrisbk--[/edtdd]

Reply

Marsh Posté le 04-02-2002 à 02:53:02    

j'ai lu les MSDN sur sprintf/snprintf, et j'ai pas compris comment marchait le 2eme argument, la  "format-control string" :(  
si vous pouviez m'aider à comprendre  ...
 
sinon, les constructeurs/destructeurs marchent bien :)
 
mais la classe DSoundBuffer marche toujours pas ...
je vous mets le code de la classe en entier :
la fonction Load a l'air de marcher, mais PlayAsMusic et Stop ne fonctionnent pas (le prog sarrete sans rien)
les classes Log et GetError sont pour ecrire un log avec le n° des erreurs (pour le dégogage)
ExitApp( true ); quitte le prog en affichant un mess d'erreur
 
#include <Windows.h>
#include <dsound.h>
 
HRESULT CreateStaticBuffer( LPDIRECTSOUNDBUFFER DSBuffer );
bool LoadWaveFile( TCHAR* strFileName );
HRESULT RestoreBuffer(LPDIRECTSOUNDBUFFER DSBuffer);
 
extern CLog* Log;
extern CError* GetError;
void ExitApp( bool Err );
 
LONG SoundVol;
LONG MusicVol;
 
#define SafeRelease(p) { if(p) { (p)->Release(); (p)=NULL; } }
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
 
class CDSoundBuffer
{
public:
 void Load( TCHAR* strFileName );
 ~CDSoundBuffer();
 void Play();
 void PlayAsMusic();
 void Stop();
 bool IsPlaying();
private:
 IDirectSoundBuffer* DSB;
};
 
void CDSoundBuffer::Load( TCHAR* strFileName )
{
 HRESULT hRet;
 char* logBuf;
 
 logBuf = new char[ strlen( strFileName ) + 46 ];
 wsprintf( logBuf, "(DirectSound.cpp) Create a new SoundBuffer (%s)", strFileName );
 Log->NewAction( logBuf );
 
 if( !LoadWaveFile( strFileName ) )
 {
  Log->Failed();  
  ExitApp( true );
 }
 
 hRet=CreateStaticBuffer( DSB );
 if ( hRet!=DS_OK )
 {
  Log->Error( GetError->GetDXErr( hRet ) );
  ExitApp( true );
 }
 
 Log->Success();
 
}
 
CDSoundBuffer::~CDSoundBuffer()
{
 Log->NewAction( "(DirectSound.cpp) Close a SoundBuffer" );
 SafeRelease( DSB );
 Log->Success();
}
 
bool CDSoundBuffer::IsPlaying()
{
    if( DSB )
    {  
        DWORD dwStatus = 0;
        DSB->GetStatus( &dwStatus );
        return( ( dwStatus & DSBSTATUS_PLAYING ) != 0 );
    }
    else
    {
        return true;
    }
}
 
void CDSoundBuffer::Play()
{
 DSB->SetVolume( SoundVol );
 DSB->Play( 0, 0, 0 );
}
 
void CDSoundBuffer::PlayAsMusic()
{
 DSB->SetVolume( MusicVol );
 DSB->Play( 0, 0, DSBPLAY_LOOPING );
}
 
void CDSoundBuffer::Stop()
{
 DSB->Stop();
}
 
voila, c'est pas tres pratique de n'envoyer qu'un bout de prog pour que vous compreniez, dites moi si vous comprenez pas ...
 
en tout cas vraiment merci beaucoup de me répondre, j'etais bien embêté :)
@+ ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed