IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Tentative de R/W de mémoire protégée


Sujet :

C++/CLI

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut Tentative de R/W de mémoire protégée
    [Visual C++ 2005 Express / Windows form / .Net]

    Bonjour à tous,
    Je suis en train d'écrire une petite classe simple qui me permet de gérer des matrices.
    J'ai donc comme membres les dimensions de ma matrice, et un tableau à deux dimensions de double contenant les valeurs de la matrice.
    J'utilise les constructeurs par defaut/valeurs/recopie, qui fonctionnent bien ..... jusqu'à un certain temps...

    Je m'explique, lorsque je créé plusieurs objet matrices, au bout d'un moment (à la création de la 9 ou 10ème matrice environ), j'obtiens le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Une exception non gérée du type 'System.AccessViolationException' s'est produite dans test_classes.exe
     
    Informations supplémentaires : Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.
    et le programme s'arrête dans un des 3 constructeurs (n'importe lequel).
    Voici le code du constructeur par valeurs :

    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
    matrice::matrice(int X, int Y, double valeur)
    {
    	//Créé une matrice par valeurs
    	int i,j;
     
    	this->dimX = X;
    	this->dimY = Y;
    	if (Y == 1) this->IsVector = true ;
     
    	this->valeurs = new double* [this->dimX] ;
    	for (i = 0 ; i < this->dimX ; i++)
    	{
    		valeurs[i] = new double[this->dimY] ;
    	}
     
    	for (i = 0 ; i < this->dimX ; i++)
    	{
    		for (j = 0 ; j < this->dimY ; j++)
    		{
    			this->valeurs[i][j] = valeur;
    		}
    	}
     
    }
    et voici comment je créé mes objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    matrice^ M1 = gcnew matrice(3,2,2);
    matrice^ M2;
    matrice^ M3 = gcnew matrice(3,3,3.2);
    matrice^ M4;
    matrice^ M5;
    matrice^ V1;
    matrice^ V2;
    matrice^ V3;
    matrice^ V4 = gcnew matrice(5,1,0);
    J'utilise également des fonctions qui renvoient une matrice. exemple :

    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
     
    //Transposée d'une matrice.
    matrice^ matrice::transp(void)
    {
    	int i,j;
    	matrice^ m_res = gcnew matrice(this->dimY,this->dimX,0);
     
    	for(i=0;i<this->dimX;i++)
    	{
    		for(j=0;j<this->dimY;j++)
    		{
    			m_res->valeurs[j][i] = this->valeurs[i][j];
    		}
    	}
    return(m_res);
    }
    dans ce cas, dans mon programme, je créé une matrice tel que j'ai créé M4 et je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M4 = M3->transp();
    voilà, je ne sais pas quoi rajouter pour expliquer la situation. Donc en général, tout fonctionne bien un moment, puis j'obtiens le message d'erreur au niveau de la ligne du constructeur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this->valeurs = new double* [this->dimX] ;
    Avez-vous une idée de la source du pb ???

    Merci !

    PS : Ah oui, pour ceux qui auraient remarqué ou qui se posent la question, c'est volontaire que mes membres soient public...

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    alors, se plonger dans ton code comme ca risque d'etre un peu laborieux.

    Mais j'ai une question qui me taraute ...

    Pourquoi te passer de la puissance du C++/CLI et de sa capacité à gérer la correctement mémoire à travers des tableaux managés ou des conteneurs de .Net ?

    Ainsi, avec un cli::array, tu n'aurais pas de problèmes de libération ou d'accès à la mémoire.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    79
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 79
    Points : 24
    Points
    24
    Par défaut
    parce que je connais pas !
    je connais le C++ "tout bête", càd que je sais faire des programmes console, etc., et là pour mon stage je me retrouve avec visual C++, windows form et compagnie, et y a des millions de choses à savoir ! Alors je fais ce que je peux
    Je sais qu'il existe l'iade msdn, mais c'est vraiment énorme, en plus, à priori plusieurs langages sont utilisables sous visual c++, ce qui fait que j'arrive rarement à obtenir l'information que je cherche.

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu peux commencer par mes tutos (en signature) ou par la faq c++/cli, notamment http://dotnet.developpez.com/faq/cpp...ntaxe#cliarray

    pour déclarer un tableau à deux dimensions, si tu as un soucis, je pourrais t'aider

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/05/2016, 12h48
  2. Tentative de lecture ou d'écriture de mémoire protégée
    Par neon90 dans le forum Visual Studio
    Réponses: 3
    Dernier message: 03/11/2012, 12h18
  3. Réponses: 2
    Dernier message: 09/07/2010, 13h31
  4. Réponses: 5
    Dernier message: 25/01/2010, 11h35
  5. Réponses: 3
    Dernier message: 30/06/2009, 15h45

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