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

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

Marsh Posté le 29-05-2002 à 17:40:00    

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...
Reply

Marsh Posté le 29-05-2002 à 17:40:00   

Reply

Marsh Posté le 29-05-2002 à 17:46:26    

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...
Reply

Marsh Posté le 29-05-2002 à 17:49:39    

: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...
Reply

Marsh Posté le 29-05-2002 à 17:50:42    

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
Reply

Marsh Posté le 29-05-2002 à 18:31:05    

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...
Reply

Marsh Posté le 29-05-2002 à 18:36:04    

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
Reply

Marsh Posté le 29-05-2002 à 18:46:42    

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...
Reply

Marsh Posté le 29-05-2002 à 18:52:14    

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
Reply

Marsh Posté le 29-05-2002 à 19:05:12    

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...
Reply

Marsh Posté le 29-05-2002 à 19:10:12    

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...
Reply

Marsh Posté le 29-05-2002 à 19:10:12   

Reply

Marsh Posté le 29-05-2002 à 19:25:56    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed