une méthode de classe n'a pas d'adresse ????! [Delphi, Pascal] - Delphi/Pascal - Programmation
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...
Marsh Posté le 29-05-2002 à 17:49:39
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 :
|
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
Marsh Posté le 29-05-2002 à 18:31:05
et bien... ya un problème...
Code :
|
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 :
|
après l'avoir déclaré comme ça :
Code :
|
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 )
t'as une idée ??
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...
Marsh Posté le 29-05-2002 à 18:46:42
bin si, les paramètres sont les mêmes puisque :
Code :
|
non ?
sinon, je ne vois pas ce que tu veux dire, dsl
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
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
[jfdsdjhfuetppo]--Message édité par Zion le 29-05-2002 à 18:53:04--[/jfdsdjhfuetppo]
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 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 |
j'ai rien compris
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.
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 alors arretez de vous prendre la tête dessus les amis !
et merci
Marsh Posté le 29-05-2002 à 19:25:56
Moustaaki a écrit a écrit : bin si, les paramètres sont les mêmes puisque :
|
heu oui, je crois que je lis un peu trop vite les posts parfois sorry
Marsh Posté le 29-05-2002 à 17:40:00
resalu tout le monde ! me revoilà avec un nouveau pb ... 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 :
avec TPtrProcedure, un type déclaré de la façon suivante :
ensuite, j'ai une méthode membre d'une classe que je veux utiliser dans la première fonction :
mais lorsque je tape ça :
le compilo me répond inlassablement : Variable Requise...
(a oui, dataPack :
avec
alors, d'après la doc :
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 !
[jfdsdjhfuetppo]--Message édité par Moustaaki le 29-05-2002 à 17:44:16--[/jfdsdjhfuetppo]
---------------
Boolay for ever...