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

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  [Delphi, Pascal] une méthode de classe n'a pas d'adresse ????!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Delphi, Pascal] une méthode de classe n'a pas d'adresse ????!

n°147215
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 17:40:00  profilanswer
 

resalu tout le monde ! me revoilà avec un nouveau pb :D ... j'pense que ça sera surement plus simple à résoudre puisqu'il s'agit maintenant de delphi/pascal objet...
 
alors, voilà, j'ai une fonction que j'importe d'une dll avec le prototype suivant :
 

Code :
  1. Function bStartFluxDoppler(pbDataRead:TPtrDataPack; Fonction: TPtrProcedure): BOOLEAN; cdecl; external 'DLLDiadop.DLL';


 
avec TPtrProcedure, un type déclaré de la façon suivante :

Code :
  1. TUneProcedure = Procedure of object;
  2. TPtrProcedure= ^TUneProcedure;


 
 
ensuite, j'ai une méthode membre d'une classe que je veux utiliser dans la première fonction :

Code :
  1. TUneClassePeuNimporte = class
  2. public
  3. procedure traitementAcquisition;
  4. end;


 
 
 
 
mais lorsque je tape ça :

Code :
  1. bStartFluxDoppler(@dataPack, @traitementAcquisition);


le compilo me répond inlassablement : Variable Requise...
 
 
(a oui, dataPack :  

Code :
  1. dataPack: TDataPack;


avec  

Code :
  1. TDataPack = array[0..255] of Byte;


 
alors, d'après la doc :

Citation :


Ce message d'erreur est produit lorsque vous essayez de prendre l'adresse d'une expression ou d'une constante.  
 
program Produce;
var
  I: Integer;
  PI: ^Integer;
begin
  PI := Addr(1);
end.
 
Une constante comme 1 n'a pas d'adresse mémoire, vous ne pouvez donc pas lui appliquer l'opérateur @ ou la fonction standard Addr.  
 
program Solve;
var
  I: Integer;
  PI: ^Integer;
begin
  PI := Addr(I);
end.
 
Vous devez vérifier que vous prenez l'adresse de la variable.
 


 
 
alors ma question :
je me suis planté dans mon code où est ce qu'on en peut pas récupérer l'adresse d'une méthode de classe ?
 
(ça marche très bien si je 'sors' ma fonction traitementTruc de ma classe 'unClassPeuNimporte' mais ça m'arrange po)
 
 
merci d'avance !
:jap:

 

[jfdsdjhfuetppo]--Message édité par Moustaaki le 29-05-2002 à 17:44:16--[/jfdsdjhfuetppo]


---------------
Boolay for ever...
mood
Publicité
Posté le 29-05-2002 à 17:40:00  profilanswer
 

n°147226
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 17:46:26  profilanswer
 

oui, j'oubliais :
j'ai essayer en lui passant directement le nom de la fonction sans mettre de @ devant et en changeant le prototype de la procedure importée. Cela se compile mais génére une erreur à l'execution...


---------------
Boolay for ever...
n°147234
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 17:49:39  profilanswer
 

:D
 
bon, c bon, j'ai trouvé en fait... je vous le mêt au cas où quelqu'un aurait le même problème :
 
il fallait mettre
 

Code :
  1. bstartFluxDoppler(@dataPack, @TUneClassePeuNimporte.traitementAcquisition);


---------------
Boolay for ever...
n°147235
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-05-2002 à 17:50:42  profilanswer
 

Tu as essayé ceci :
Function bStartFluxDoppler(pbDataRead:TPtrDataPack; Fonction: TUneProcedure)
?
Il me semble que c'est comme ça (et avec le @ quand on passe la fonction en param


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°147270
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 18:31:05  profilanswer
 

et bien... ya un problème...
 

Code :
  1. procedure TAcquisition.traitementAcquisition;
  2. var
  3.    truc: Byte;
  4. begin
  5.   truc := dataPack[0];
  6.    case truc of
  7. ...


 
dataPack et traitementAcquisition sont réspectivement attributs et méhotde de la classe TAcquisition.
 
j'appelle la fonction importée de cette façon :

Code :
  1. bStartFluxDoppler(@dataPack, @TAcquisition.traitementAcquisition);


 
après l'avoir déclaré comme ça :

Code :
  1. function bStartFluxDoppler(pbDataRead:TPtrDataPack; Fonction: TProcedure): BOOLEAN; cdecl; external 'DLLDiadop.DLL';


 
 
 
 
et donc, à l'éxécution, ça plante à la ligne en gras...  
erreur d'accès à la mémoire :
'access violation at 0x0041e0e3 read of adress 0x00000060'
 
 
 
 
 
or, si ma fonction de traitement est déclarée hors de la classe, ça ne plante plus... (ça fait pas ce que je veux mais ça, c'est un autre pb :D)
 
 
 
t'as une idée ??


---------------
Boolay for ever...
n°147274
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-05-2002 à 18:36:04  profilanswer
 

Heu traitementAcquisition n'est pas un TUneProcedure : les paramètres ne sont pas les mêmes...


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°147280
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 18:46:42  profilanswer
 

bin si, les paramètres sont les mêmes puisque :
 

Code :
  1. TUneProcedure = Procedure ;


 
non ?
 
sinon, je ne vois pas ce que tu veux dire, dsl


---------------
Boolay for ever...
n°147284
zion
Plop
Posté le 29-05-2002 à 18:52:14  profilanswer
 

TUneProcedure = Procedure of object;
TPtrProcedure= ^TUneProcedure;
 
 
Euh, faut pas utiliser de pointeur justement... ;-)
 
Sinon tu peux utiliser la méthode bourrin
 
TaClasse.GetAdressOfMethod('machin';) ou un truc du genre je sais plus
 
Puis, tu fais un coup de basm, avec l'adresse de la classe dans ebx... Non, c'est peut être un peu trop bourrin ca  :D  
 
Bon, et si ca marche toujours pas, file un peu plus de source ou refais une petite synthèse de la position du problème ;)  
 
TMachin = procedure (Foo: Integer) of object;
 
EDIT: Je sais plus pourquoi  :D

 

[jfdsdjhfuetppo]--Message édité par Zion le 29-05-2002 à 18:53:04--[/jfdsdjhfuetppo]


---------------
Informaticien.be - Lancez des défis à vos amis
n°147288
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 19:05:12  profilanswer
 

Zion a écrit a écrit :

TUneProcedure = Procedure of object;
TPtrProcedure= ^TUneProcedure;
 
 
Euh, faut pas utiliser de pointeur justement... ;-)
 
Sinon tu peux utiliser la méthode bourrin
 
TaClasse.GetAdressOfMethod('machin';) ou un truc du genre je sais plus
 
Puis, tu fais un coup de basm, avec l'adresse de la classe dans ebx... Non, c'est peut être un peu trop bourrin ca  :D  
 
Bon, et si ca marche toujours pas, file un peu plus de source ou refais une petite synthèse de la position du problème ;)  
 
TMachin = procedure (Foo: Integer) of object;
 
EDIT: Je sais plus pourquoi  :D  
 
 




 
:lol: j'ai rien compris :lol:
mais l'adresse, j'arrive à la récupérer maintenant...
le problème, c'est l'accès à un attribut de la classe par cette méthode lorsque celle-ci est appellée par la DLL : ça plante.


---------------
Boolay for ever...
n°147292
Moustaaki
.: ILITCH :. ésprit sibérie
Posté le 29-05-2002 à 19:10:12  profilanswer
 

bon, j'ai trouvé une autre solution :
j'ai déclaré ma procedure traitementAcquisition comme étant une procedure statique (elle n'est membre d'aucune classe).
et pour avoir accès à dataPack, je lui laisse l'accès à une instance de la classe TAcquisition.
ça me fait chier parceque j'aime pas du tout le procédural et que ça engendre plein d'interdépendance (traitementAcquisition doit connaitre TAcquisition et la classe instanciant TAcquisition...)... mais bon... j'vais p'têtre réussir à arranger tout ça :)
 
 
donc, là, ça marche :D alors arretez de vous prendre la tête dessus les amis ! :D
 
et merci :jap:


---------------
Boolay for ever...
mood
Publicité
Posté le 29-05-2002 à 19:10:12  profilanswer
 

n°147307
antp
Super Administrateur
Champion des excuses bidons
Posté le 29-05-2002 à 19:25:56  profilanswer
 

Moustaaki a écrit a écrit :

bin si, les paramètres sont les mêmes puisque :
 

Code :
  1. TUneProcedure = Procedure ;


 
non ?
 




 
heu oui, je crois que je lis un peu trop vite les posts parfois :D sorry


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire

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

  [Delphi, Pascal] une méthode de classe n'a pas d'adresse ????!

 

Sujets relatifs
Lien vers une adresse email en html[pascal] liste chainée (oui c ridicule)
[Urgent] [Delphi] Imbriquer des relations Maitre/Détail[Delphi 4 et InterBase 4.2] Utilisateurs connectés ?
[Delphi] Charger un TImage à partir d'une image d'un TimageList[delphi] Urgent : différences entre les Delphi 4, 5 et 6
insérer des gifs animés dans une fiche Delphi[DELPHI] Afficher une valeur par défaut dans une DBLookUpComboBox
[Delphi] Faire et défaire dynamiquement une relation Maître-Détail[Delphi] Text, filetext
Plus de sujets relatifs à : [Delphi, Pascal] une méthode de classe n'a pas d'adresse ????!


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