begin process at 2012 02 14 13:13:44
  Trouver un code source :
 
dans
 
Accueil > Forum > 

VB.NET et VB 2005

 > 

Système

 > 

Mémoire

 > 

Probleme violation de la mémoire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme violation de la mémoire

jeudi 11 octobre 2007 à 21:11:46 | Probleme violation de la mémoire

BrokenArrow29

Bonjour,
j'obtiens cette erreur lorsque j'éxécute un petit programme :
"L'exception System.AccessViolationException n'a pas été gérée
Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée."
Détail: System.AccessViolationException
"
Le programme lit une base de donnée et cherche le correspondant dans une autre base de donnée. L'erreur n'arrive jamais au meme endroit ou au meme enregistrement. Parcontre elle arrive toujours lorsque par une fonction (contenu dans un dll qui est en référence) attribue une valeur a une variable. C'est un peu weird ...

Merci de votre aide

jeudi 11 octobre 2007 à 21:14:19 | Re : Probleme violation de la mémoire

GEDDi

Ya fort à parier que ça vienne de la DLL, genre mémoire mal allouée, libération de mémoire anticipée, tentative d'acces à une zone mémoire qui a déjà été effacée mais dont le pointeur n'a pas été mis à NULL, ce genre de choses codées par des gruic gruiiic :)


Gérôme GUILLEMIN
Auteur du langage FBSL
jeudi 11 octobre 2007 à 21:52:36 | Re : Probleme violation de la mémoire

casy

Membre Club
Moi je parirais plus pour un problème d'appel à la dll.

Je ne pense pas que ce soit la dll qui est en cause, mais plutot la façon dont tu t'en sert.



---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
jeudi 11 octobre 2007 à 22:48:12 | Re : Probleme violation de la mémoire

BrokenArrow29

c'est que l'appel de la fonction (qui est storé dans la dll ) est dans une boucle qui va tournée autant fois qu'il ya des donnée dans la bd (genre 5 000 fois). Mais elle va donnée l'erreur des fois Exemple au 3000ieme enregistement sur le champ B et d'autre fois au 2800ieme sur un autre champ. Les fois d'avant elle fonctionne bien... Il semble pas avoir de relation avec le champ ou la donnée lu. Sa me semble comme si y aurais pas de mémoire disponible additionnelle. Pourtant j'ai 2gig de mémoire.

jeudi 11 octobre 2007 à 22:53:35 | Re : Probleme violation de la mémoire

casy

Membre Club

Tu es en VB2005, comment déclare-tu les fonctions de ta dll ??? Il se peut que le type de variable que tu lui passe ne corresponde pas à ce qu'elle attent.

Autre point, est-ce que tes variables sont correctement instanciées avant de les passer à la dll. Ex, si tu lui passe une chaine de caractère qu'elle doit remplir, cette chaine doit au préalable etre correctement remplie avec suffisament de caractères pour qu'elle existe en mémoire.

Le mieux est que tu mette le bout de code qui pose problème.


---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
vendredi 12 octobre 2007 à 18:21:35 | Re : Probleme violation de la mémoire

BrokenArrow29

Voila ma déclaration de la fonction de la dll

PublicDeclareFunction TDBFieldGetValueAsString Lib"F:\filedll\tdbaccess.dll" (ByVal DBIndex AsInteger, ByVal TableName AsString, ByVal FieldName AsString, ByVal RecNo AsInteger, ByRef OutBuffer AsString) AsBoolean

Variable déclarer dans ma procedure

Dim

PLAYERFIRST As String = ""
Dim PLAYERCITY AsString = ""
Dim PLAYERLAST AsString = ""
Dim PLAYERindx AsInteger = 0

'PARTIE  DE CODE

'HandleEXH est mon fichier ouvert de base de donnée.
For I = 0 To (TABLEINFO.RecordCount - 1)

   TDBFieldGetValueAsString(HandleEXH,

"SPBT", "FNME", I, PLAYERFIRST)
    TDBFieldGetValueAsString(HandleEXH,
"SPBT", "LNME", I, PLAYERLAST)
   TDBFieldGetValueAsString(HandleEXH,
"SPBT", "CITY", I, PLAYERCITY)
   TDBFieldGetValueAsString(HandleEXH,
"SPBT", "INDX", I, PLAYERindx)
L'erreur peut arriver a n'importe quelle ligne des fonction TDBfield.. c'est aléatoire jusqu'a maintenant. Et sur n'importe quel enregistrement(la valeur de I est différence a chaque erreur.) La fonction TDBfield lit une valeur dans la table SPBT, sur le champ FNME etc. à l'enregistrement I et la place dans la variable au bout ex: PLAYERFIRST.

Voilà je ne sais pas si vous avez assez d'info pour m'aider
Merci!!!!!.
vendredi 12 octobre 2007 à 20:44:34 | Re : Probleme violation de la mémoire

casy

Membre Club
Réponse acceptée !
ALors déjà effectivement, comme je disais, tu n'instancie pas correctement tes string avant l'appel. Certes tu les instancies mais de longueur nulle. C'est à dire qu'aucune place n'est réservée en mémoire pour contenir la chaine de caractère. Hors il est probable que ta dll ne soit pas capable de créer une string en mémoire, elle doit juste se contenter (comme la quasi totalité des dlls api) de remplir une zone mémoire déjà occupée par la string à remplir. Dans ce cas là, avant de passer la string à la fonction, il faut veiller à ce que une zone mémoire suffisament grande est effectivement occupée par la dite string, c'est à dire que la string soit de longueur suffisament importante pour acceuillir sa nouvelle valeur.
Dans ton cas, si tant est que ce soit ça le problème, il faut que avant chaque appel, tu initialise chacune des strings avec suffisament de caractères pour que la zone réservée en mémoire soit suffisament grande. Ce qui donnerais le code suivant :


Dim PLAYERFIRST As String
Dim PLAYERCITY As String
Dim PLAYERLAST As String
Dim PLAYERindx As Integer 0

'PARTIE  DE CODE

'HandleEXH est mon fichier ouvert de base de donnée.
For I = To (TABLEINFO.RecordCount - 1)

        PLAYERFIRST = New String(vbNullChar, 100)
        PLAYERLAST = New String(vbNullChar, 100)
        PLAYERCITY = New String(vbNullChar, 100)
        PLAYERindx = New String(vbNullChar, 100)

        TDBFieldGetValueAsString(HandleEXH, "SPBT""FNME", I, PLAYERFIRST)
        TDBFieldGetValueAsString(HandleEXH, "SPBT""LNME", I, PLAYERLAST)
        TDBFieldGetValueAsString(HandleEXH, "SPBT""CITY", I, PLAYERCITY)
        TDBFieldGetValueAsString(HandleEXH, "SPBT""INDX", I, PLAYERindx)

Next




Autre problème possible :
Il te faut vérifier que la ligne de déclaration de ta dll correspond bien à une déclaration pour VB2005 et non pas VB6. En effet entre VB6 et VB2005, le type de variable a changé. Ainsi les integer (vb6) deviennent des short (ou Int16) en VB2005, les longs deviennent des integers.

Si donc ta déclaration avec des integers est prevu ppour VB6, pour l'utiliser avec VB2005, il te faut remplcer les integer par des shorts ou des Int16.

En espérant ne pas t'avoir trop embrouiller


---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
vendredi 12 octobre 2007 à 21:25:14 | Re : Probleme violation de la mémoire

BrokenArrow29

Merci, Merci 
ca fonctionne tres bien lorsque j'initialise la variable a chaque tour. C'est un détail que j'avais vue.

J'ai perdue une semaine à fouiller et changer mes procedures pour que tu me fasse découvrir qu'il fallait initialiser la variable a chaque tour de la routine pour la dll peuvent y inclure l'info.

Mais est ce type a visual studio 2005 ou si je l'avais fais en Vb6 ca aurait fonctionner sans l'initialiser a chaque tour ?

vendredi 12 octobre 2007 à 21:42:16 | Re : Probleme violation de la mémoire

casy

Membre Club

Ca aurait été exactement pareil en VB6, c'est d'ailleurs comme ça que l'on fait lorsque l'on utilise les fonctions de l'api Windows.

Ceci est dû à la spécificité des variables de type string. Pour la pluspart des variables simples, ta variable dans le code représente une zone mémoire ou est réellement stocké la valeur de ta variable. Dans le cas des strings, la variable dans le code représente en mémoire, non pas une zone ou est stocké la chaine de caractère, mais une zone ou est stocké l'adresse d'une autre zone mémoire qui elle contiendra réellement la chaine de caractère. Dû au fonctionnement du traitement des string, cette derbière zone change en permanence de place, il est donc plus facile de stocké dans une variable fixe l'adresse d'une zone mémoire plutot que de modifier en permanance la position de cette variable et ainsi planter le programme qui aurait du mal à retrouver cette variable.

Pour ce qui est des dll, comme je te disais, généralement elles ne sont pas capable de créer de zone mémoire ou stockées les chaines. Elles ne font que copier les caractères dans une zone qui leurs a été indiqué. Mais si cette zone n'existe pas (string de longueur nulle par exemple) ou qu'elle est trop courte, la dll n'est pas capable de le savoir et va allègrement déborder sur les données qui suivent en les détruisant. Ces données étant corrompues, cela provoque soit un plantage, soit des erreurs, soit des violation d'accès.

C'est pour cela que lorsque tu passe une chaine de caractère à une dll de ce type qui doit y écrire dedant, cette chaine doit avoir au préalable été remplie pour qu'elle ait une longueur au moins égale (mais de préférence plus) que le nombre de caractères que va écrire la dll.

---- Sevyc64  (alias Casy) ----
# LE PARTAGE EST NOTRE FORCE #    [ Lien ]
vendredi 12 octobre 2007 à 22:32:35 | Re : Probleme violation de la mémoire

BrokenArrow29

Merci très claire, très bien expliqué

1 2

Cette discussion est classée dans : programme, erreur, probleme, mémoire, violation


Répondre à ce message

Sujets en rapport avec ce message

un probleme d'installation en vb6 [ par boris ] bonjour,j'ai fait un petit programme en vb6 (je débute...) qui se sert de textbox(s) pour faire une page web avec des frames.Sur windows 98se pas de p Problème d'execution : Erreur [ par mafiacom ] Bonsoir la liste,Desole du derangement mais g un probleme et g cherche partout sans trouver d resultat :( si qq peut m'aider je lui serai hyyyyyyyper Mémoire insuffisante : Erreur N° 7 [ par VbKenza ] J'essaie de lancer un programme mais winXP me met une erreur "erreur d'exécution '7' : mémoire insuffisante". J'ai testé la mémoire (256 Mo quand même Probleme avec date dans MySQL [ par knabis2000 ] Bonjour à tous,Je suis devant une erreur bien mystérieuse , et j'aurai besoin de votre aide pour la résoudre. Explication : Dans un programme en VB6, probleme erreur connexion extraputty [ par fifati ] donner le solution de probleme connexion extraputty'tentative le lecture ou d'ecriture de mémoire protégée.cela indique souvent q'une autre mémoire es Probleme de droit d'administration dans mon programme [ par poolboy2 ] Bonjours à tous, Je vais essayer d'expliquer ici mon problème et j'espère que vous aurez une solution [^^langue3] Je développe un programme doté d'u Erreur à la sortie de ma fonction [ par narfight ] Bonjour tout le monde, J'ai un problème que je n'arrive pas à comprendre et encore moins à résoudre. dans mon programme, je fais une écoute de donné probleme de publier un projet avec clickonce [ par lassad_haddaji ] Bonjour, J'ai développé un projet et je souhaite utiliser clickOnce pour le déployer. J'utilise déjà cette méthode de déploiement avec des application


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,686 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales