Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++/CLI Discussion :

phénomène bizarre observé sur une machine


Sujet :

C++/CLI

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    686
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 686
    Points : 96
    Points
    96
    Par défaut phénomène bizarre observé sur une machine
    Bonjour j'observe sur une machine XP unique et ancienne (Service pack 3) un phénomène mystérieux sur un projet CLR/CLI (net framework 4.0),
    j'ai essayé sur une autre machine xp virtuel , pas de problème , ça passe nickel.
    Voila la fonction initwave crashe sur la ligne THSound ts={0};.
    Quand je remplace THSound ts={0}; par THSound ts; ça passe (pas de crash).
    Quand je remplace ceux-ci par memset(&ts,0,sizeof(THSound)); ça crashe.
    J'ai remplacé ceux-ci par un new THSound et un delete à la fin , ça passe (pas de crash).
    Pourquoi ????


    La fonction msg est ma fonction qui affiche un messagebox pour debugger ben oui.

    Je ne comprend pas ce phénomène bizarre.
    L'exception (crash) à lieu dans une zone non managée.

    Ça m'intrique ce genre de phénomène.
    Windows XP Service Pack 3.

    Voici un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    #pragma unmanaged
    typedef enum {
    	mono,
    	stereo
    }THSound_Channel;
    typedef bool (*E_HS)(void *HSound,void *param,short **u,int *sz);
    typedef bool (*E_ENDHS)(void *HSound,void *param,short *u,int sz);
    typedef struct {
    	int sizecb;
    	struct {
    	DWORD freq;
    	DWORD bufko;
    	THSound_Channel channel;
    	char bits;
     
    	HANDLE hLic; 
    	HANDLE hEvent;
     
    	void *param;
    	E_HS devent;
    	E_ENDHS endev;
     
    	char nbuf;
    	}in;
    }THSound,*PHSound;
     
     
    bool endev(void *HSound, void *param, short *u, int sz)
    {
    	delete u;
    	return true;
    }
     
    //la fonction devent est dans une zone managé
     
    void msg(char* s);
     
    #include "e:/communlib/types_wave.h"
     
    //fonctionne
    void* initwave(int sample, int bits, int channel,char *name,int &mcierror, void *paramclass)
    {
    	msg("InitWave1");
    	void *ret = nullptr;
    	if (_HSound_Load())
    	{
    		msg("InitWave2");
    		msg("InitWave2x0");
    		THSound ts;
    		msg("InitWave2x1");
    		ts.sizecb = sizeof(ts);
    		msg("InitWave2x2");
    		ts.in.bits = bits;
    		ts.in.channel = channel==1? THSound_Channel::mono:THSound_Channel::stereo;
    		ts.in.nbuf = 4;
    		msg("InitWave2x3");
    		ts.in.param = paramclass;
    		msg("InitWave2x4");
    		ts.in.devent = devent;
    		ts.in.endev = endev;
    		msg("InitWave2x5");
    		ts.in.bufko = 128 * 1024;
    		ts.in.freq = sample;
    		msg("InitWave2x6");
    		msg("InitWave3");
    		ret = _HSound_Init(&ts, &mcierror, name);
    		msg("InitWave4");
    		if (ret != nullptr)
    		{
    			msg("InitWave5");
    			_HSound_SetAcquireBuffer(ret, true, false);
    			msg("InitWave6");
    			_HSound_Padding(ret);
    			msg("InitWave7");
    		}
    		msg("InitWave8");
    	}
    }
     
     
    //crash
    void* initwave(int sample, int bits, int channel,char *name,int &mcierror, void *paramclass)
    {
    	msg("InitWave1");
    	void *ret = nullptr;
    	if (_HSound_Load())
    	{
    		msg("InitWave2");
    		msg("InitWave2x0");
    		THSound ts={0};
    		msg("InitWave2x1");
    		ts.sizecb = sizeof(ts);
    		msg("InitWave2x2");
    		ts.in.bits = bits;
    		ts.in.channel = channel==1? THSound_Channel::mono:THSound_Channel::stereo;
    		ts.in.nbuf = 4;
    		msg("InitWave2x3");
    		ts.in.param = paramclass;
    		msg("InitWave2x4");
    		ts.in.devent = devent;
    		ts.in.endev = endev;
    		msg("InitWave2x5");
    		ts.in.bufko = 128 * 1024;
    		ts.in.freq = sample;
    		msg("InitWave2x6");
    		msg("InitWave3");
    		ret = _HSound_Init(&ts, &mcierror, name);
    		msg("InitWave4");
    		if (ret != nullptr)
    		{
    			msg("InitWave5");
    			_HSound_SetAcquireBuffer(ret, true, false);
    			msg("InitWave6");
    			_HSound_Padding(ret);
    			msg("InitWave7");
    		}
    		msg("InitWave8");
    	}
    }
    Bizarre.

    Merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    février 2005
    Messages
    4 735
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : février 2005
    Messages : 4 735
    Points : 11 253
    Points
    11 253
    Par défaut
    Il dit quoi le débogueur ?
    En particulier, d'où vient le pointeur foireux.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 083
    Points : 40 408
    Points
    40 408
    Par défaut
    En effet, ça devrait passer aussi avec le memset ou ={0} vu que ta structure semble être POD.

    Comme dit bacelar, essaie d'avoir plus d'infos sur l'erreur d'accès mémoire: L'adresse fautive, si c'est en lecture ou en écriture...
    Mais ça va nécessiter soir le debugger, soit du Structured Exception Handling dans ton code non-managé, parce que AccessViolationException ne contient pas ces informations.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    mai 2011
    Messages
    686
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : mai 2011
    Messages : 686
    Points : 96
    Points
    96
    Par défaut
    J'ai remplacé par des pointers 'new' et 'delete' et je n'ai plus ce probléme.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    septembre 2005
    Messages
    27 083
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2005
    Messages : 27 083
    Points : 40 408
    Points
    40 408
    Par défaut
    Si c'est "tombé en marche", alors le comportement indéfini est toujours là quelque part, comme un incendie qui couve.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [reseaux] Lister les processus sur une machine donnée
    Par BEAUJAULT dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 29/07/2004, 16h55
  2. Réponses: 8
    Dernier message: 13/07/2004, 10h00
  3. Savoir quel OS est installer sur une machine
    Par batmat86 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/06/2004, 17h16
  4. Comment récupérer la liste des logiciels installés sur une machine ?
    Par david_chardonnet dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 19/09/2003, 18h41
  5. [Débutant] Connexion sur une machine distante protégée
    Par arthix dans le forum Développement
    Réponses: 3
    Dernier message: 28/08/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo