Violation d'accès en lecture ? pourquoi ? [MFC] - C++ - Programmation
Marsh Posté le 28-03-2005 à 17:39:30
dans la classe principale de ton appli, t'as lancé un AfxSocketInit() ?
Marsh Posté le 28-03-2005 à 17:53:53
Non pas du tout, je vais regarder de plus près cette fonction
Marsh Posté le 28-03-2005 à 18:06:56
J'ai placé AfxSocketInit() dans le constructeur de la classe TableauBlancView. Ca ne change rien, l'appel de
Code :
|
ne passe pas, avec la même erreur.
Hmm si j'avais oublié d'activer les Windows Socket à la création du projet... il se passerait quoi ?
Sinon, j'ai repris le code de ma prof, mais elle partait d'une classe héritant d'un CDialog. Elle n'avait pas besoin de dessiner quoi que ce soit.
Donc sa classe socket elle a un membre de type CDialog (enfin de la classe qui en hérite).
L'erreur porte sur cette fonction de winocc.cpp
Code :
|
Marsh Posté le 28-03-2005 à 18:16:36
Je rectifie ce que j'ai dit, j'ai bien un AfxSocketInit(), par défaut il est ainsi:
Code :
|
Marsh Posté le 29-03-2005 à 13:36:51
La violation d'accès n'est-elle pas liée au paramètre passé au constructeur ?
Sock = new CTableauBlancSocket(this);
this est un pointeur TableauBlancView
C'est la classe de base quand on crée un projet application MFC. (avec biduleDoc)
Marsh Posté le 29-03-2005 à 15:52:23
Je ne sais pas précisément pourquoi mais je ne peux pas utiliser une instance de la classe de type MonProjetView (MonProjet = nom du projet, ici TableauBlanc, autrement dit c'est la classe qui gère l'affichage et l'intéracion avec l'utilisateur) dans ma classe TableauBlancSocket. Par contre avec une instance de MonProjetDoc, aucun problème à l'initialisation du socket
Si quelqu'un voit ce que je veux dire, et pourrait m'expliquer pourquoi, je dis pas non.
Marsh Posté le 31-03-2005 à 17:49:12
Nouveau problème:
Violation d'accès en lecture à la ligne 10...
Code :
|
Déclaré ainsi:
Code :
|
Ca fait plus de 2 heures que je revois mon code, fais des tests, sans trop savoir où chercher. Impossible de sérialiser à partir de cette archive.
Pourtant je crois avoir réussi à sérialiser dans Pt_arOut (à partir d'une classe héritant de CScrollView).
Pourquoi là je ne peux pas sérialiser dans cette archive à partir de la classe même (CDocument) ou elle est déclarée ??
Encore une fois si je ne suis pas clair ou s'il vous manque des bouts de code, je suis là pour un moment
Merci de bien vouloir me donner des pistes de recherche
Marsh Posté le 31-03-2005 à 22:02:57
tu devrais peut-être essayer ça :
Code :
|
Marsh Posté le 01-04-2005 à 15:14:18
Je te remercie pour ton attention
Ben en fait ca change rien, j'ai toujours la même erreur.
En fait, je viens de remarquer que dans cette fonction il ne faut pas que j'évalue la moindre variable de la classe CTableauBlanc (CDocument) sinon... exception non gérée, violation d'accès en lecture blabla.
Pour info, ProcessPendingRead(void) est appelée dans ma classe socket de cette manière:
Code :
|
Marsh Posté le 01-04-2005 à 20:14:25
Pour la suggestion c'est souvent une base d'erreur donc c'était pour ça la petite suggestion ...
et comment est créé et initialisé Pt_arIn ?
Marsh Posté le 02-04-2005 à 15:08:16
Code :
|
Voila la série d'initialisations.
Ca marche assez bien puisque je peux me connecter et me déconnecter à volonté.
Le problème c'est que dans la fonction CTableauBlancDoc::ProcessPendingRead(void) je peux même pas faire de if sur ma variable BConnecte. Si je fais (seulement) un AfxMessageBox("bla" ); dans la foncion ca passe.
Un simple et unique AfxMessageBox(BConnecte) me sort l'erreur de violation d'acces.
Marsh Posté le 02-04-2005 à 15:21:39
Dans ta fonction :
Code :
|
ton if contient une erreur : m_View == NULL
Marsh Posté le 02-04-2005 à 15:36:24
Oh punaise la boulette
Une après midi de perdue et quelques heures
La fonction du dessous je ne fais pas l'erreur et suis même pas capable de penser à cette boulette ou faire la comparaison
Eh ben voila qui explique tout, ca m'a même pas traversé l'esprit tellement je pensais que je gérais mal mes sockets, sérialisations, etc.
Ben merci !
Bon binôme qui ne s'est jamais plongé dans le projet n'a rien vu non plus, pourtant ca aurait pu le marquer une telle bétise
Merci à vous deux !
Marsh Posté le 02-04-2005 à 15:43:39
Pour éviter ce genre d'erreur par la suite, tu peux mettre
if( NULL == m_View )
ton compilo te préviendra en cas d'erreur
Marsh Posté le 02-04-2005 à 15:45:32
hust a écrit : Pour éviter ce genre d'erreur par la suite, tu peux mettre |
Vraiment pas lisible en tout cas.
Marsh Posté le 02-04-2005 à 16:04:09
Oui surement une question d'habitude. Je fais jamais l'erreur de test avec =, suffit que je la fasse dans un projet pour qu'après ca ne me titille même pas l'esprit.
Une violation d'accès ca aurait du me faire tilt que j'avais moi-même mis le truc à null.
Marsh Posté le 28-03-2005 à 16:47:52
J'ai un petit soucis avec mes Sockets
J'ai un projet sous visual C++: un tableau blanc qui fonctionne en réseau (on dessine chacun de son côté et ca apparait de part et d'autre).
J'ai donc un projet avec une classe TableauBlancDoc et une classe TableauBlancView qui hérite de CScrollView.
J'ai une classe TableauBlancSocket qui hérite de CSocket et dans laquelle j'ai un membre de type
TableauBlancView* .
Le but de la classe TableauBlancSocket est de redéfinir OnClose() et OnReceive().
J'ai une fonction de connection dans mon TableauBlancView.cpp ainsi:
J'ai cette erreur quand il passe à la ligne: Sock = new CTableauBlancSocket(this);
Exception non gérée à 0x7c239eea (mfc71d.dll) dans Tableau Blanc.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000020.
Le déboggueur pointe cette ligne ASSERT(::IsWindow(m_hWnd) || (m_pCtrlSite != NULL)); de winocc.cpp. Je comprend pas bien pourquoi ca bloque ici.
Ma classe View héritant de CScrollView lui convient pas ?
Merci d'avance de votre aide
Si c'est pas clair, je suis évidemment là
Message édité par Pwill le 31-03-2005 à 19:30:28