Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
638 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] problème avec des classes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] problème avec des classes

n°96274
madVinz
Posté le 03-02-2002 à 17:38:44  profilanswer
 

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  ;)  
@+

mood
Publicité
Posté le 03-02-2002 à 17:38:44  profilanswer
 

n°96277
chrisbk
-
Posté le 03-02-2002 à 18:00:30  profilanswer
 

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

n°96278
Kristoph
Posté le 03-02-2002 à 18:02:46  profilanswer
 

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();

n°96279
madVinz
Posté le 03-02-2002 à 18:19:57  profilanswer
 

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 );
}

n°96281
Kristoph
Posté le 03-02-2002 à 18:27:37  profilanswer
 

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 ?

n°96287
chrisbk
-
Posté le 03-02-2002 à 18:53:06  profilanswer
 

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

n°96312
Kristoph
Posté le 03-02-2002 à 20:16:22  profilanswer
 

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.

n°96320
chrisbk
-
Posté le 03-02-2002 à 20:49:04  profilanswer
 

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]

n°96330
madVinz
Posté le 03-02-2002 à 21:27:11  profilanswer
 

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

n°96331
chrisbk
-
Posté le 03-02-2002 à 21:31:50  profilanswer
 

Ouaip !

mood
Publicité
Posté le 03-02-2002 à 21:31:50  profilanswer
 

n°96332
madVinz
Posté le 03-02-2002 à 21:38:50  profilanswer
 

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

n°96333
madVinz
Posté le 03-02-2002 à 21:40:46  profilanswer
 

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 ?

n°96334
madVinz
Posté le 03-02-2002 à 21:47:38  profilanswer
 

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 ?

n°96336
chrisbk
-
Posté le 03-02-2002 à 21:54:02  profilanswer
 

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

n°96346
Kristoph
Posté le 03-02-2002 à 22:13:19  profilanswer
 

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.

n°96363
chrisbk
-
Posté le 03-02-2002 à 22:52:20  profilanswer
 

wsprintf c pas pour le support de unicode ?

 

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

n°96410
madVinz
Posté le 04-02-2002 à 02:53:02  profilanswer
 

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é :)
@+ ;)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] problème avec des classes

 

Sujets relatifs
probleme de compilation opengl sous linuxProbleme While, $i et variable
Probleme PHP : erreur ???Probleme de connxion sur base Mysql ché free !!! merde alors !
[PHP] probleme de varriable !help, problème de re-direction ?
[C++] Problème OpenGLProbleme avec PHP/SQL
PHP / mysql : problème tout con ...[C] Problème client FTP
Plus de sujets relatifs à : [C++] problème avec des classes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR