| Problème avec ADR() et procédures | |
|
|
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Problème avec ADR() et procédures Ven 28 Sep 2012 - 10:47 | |
| J'essaie d'utiliser ADR() dans une procédure, avec des paramètres formels et des variables locales, en chaîne de caractères. Cela ne semble pas marcher. Seules les variables globales donnent une chaîne correcte, lorsqu'on passe leur adresse à une DLL.. J'ai fait une mini-DLL pour tester cela. Elle contient une seule fonction avec un seul paramètre qui est censé être adr(chaine$). Et dans la DLL, je récupère la chaîne dans une variable string et je l'affiche. J'ai fait un petit programme Panoramic avec une procédure qui appelle cette fonction DLL 3 fois: 1 - avec une chaîne passée en paramètre 2 - avec une chaîne dans une variable locale 3 - avec une chaîne dans une variable globale. Seule cette dernière donne le bon résultat. Jack, pourrais-tu m'indiquer où je commets une erreur logique ? Ou y a-t-il une différence fondamentale dans le traitement à ce niveau ? Voici la DLL: - Code:
-
library test1;
{ {$R *.res}
uses Dialogs;
type PString = ^String;
function test_ADR(s: pstring): integer; stdcall; export; var x: string; begin x := s^; showmessage('test_adr: ['+x+']'); result := 0; end;
exports test_ADR;
begin end.
Et voici le programme Panoramic: - Code:
-
' test_ADR() avec DIM_LOCAL
dim s_global$
dll_on "test1.dll" test_adr("Paramètre constant")
end
sub test_adr(x$) dim_local i%, s_local$
i% = dll_call1("test_ADR",adr(x$))
s_local$ = "Variable locale" i% = dll_call1("test_ADR",adr(s_local$))
s_global$ = "Variable globale" i% = dll_call1("test_ADR",adr(s_global$)) end_sub
Merci à toi, Jack (et à tous ceux qui ont Delphi6), de bien vouloir jeter un oeil sur ce problème ! | |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 28 Sep 2012 - 12:25 | |
|
Dernière édition par ygeronimi le Ven 28 Sep 2012 - 12:38, édité 1 fois | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 12:37 | |
| C'est aussi mon impression, mais moi aussi, je deviens TRES prudent avec le mot magique... | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 13:06 | |
| Bah faut pas être parano non plus, JACK nous a fournit une version de test, s'il y a des bugs, c'est normal, il n'a pas pu tester tous les cas de figure et penser à tout. C'est bien pour cela que l'on fait des tests. Tant que l'on emploi pas ce mot à la légère et que l'on essaye de vérifier un peu avant, je ne pense pas que ce soit le style de Jack de vous fouetter à sang par ce que vous employez ce mot | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 13:14 | |
| Ce qui fait du mal au forum, c'est la liste défilante à gauche... Peut être qu'en rajoutant un filtre sur les rubriques qui doivent être affichées dans cette liste, cela arrangerai bien des choses... | |
|
| |
Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 13:16 | |
| Bon, ben alors je vais le sortir le mot magique: il y a effectivement un bug dans la fonction ADR quand la variable est locale. Du moins, c'est ce que je crois en examinant le source de Panoramic. Je testerai pour confirmer, mais je suis à peu près sûr, puis je le corrigerai pour la prochaine version instantanée, lorsque je le pourrai, d'ici quelques jours.
| |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 14:02 | |
| Klaus J’ai compilé ta DLL et je l’ai testé avec le programme donné en exemple. Je confirme ce que tu as constaté. Pour pouvoir utiliser la DLL avec une chaine passée en paramètre, je déclare dans la SUB une variable globale param$ à laquelle j’affecte le paramètre d’appel Puis je libère cette variable par free à la fin de la SUB. Ce n’est pas idéal mais ça peut marcher - Code:
-
' test_ADR() avec DIM_LOCAL
dim s_global$
dll_on "D:\Panoramic\Mes programmes\Mes Essais\test1.dll" test_adr("Paramètre constant")
end
sub test_adr(x$) dim_local i%, s_local$ dim param$ : param$ = x$
i% = dll_call1("test_ADR",adr(param$))
s_local$ = "Variable locale" i% = dll_call1("test_ADR",adr(s_local$))
s_global$ = "Variable globale" i% = dll_call1("test_ADR",adr(s_global$)) free param$ end_sub
| |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Ven 28 Sep 2012 - 14:04 | |
| Au risque de faire du hors sujet, Ce qui serait préjudiciable à PANORAMIC n'est ni le mot magique, ni la liste défilante. Ce serait que le "mot magique" perdure sur un même problème pendant des semaines comme dans certains langages abandonnés par leurs auteurs. Ici lorsque l'on sort le "mot magique" on peut voir un multitude de réactions, de solutions dérivantes être mises au point par tous et une réaction instantanée de l'auteur qui corrige. Et çà, c'est la meilleur des PUB. | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec ADR() et procédures Ven 28 Sep 2012 - 14:56 | |
| @Jack: Merci de ton attention. As-tu vu que le même problème existe si l'on veut utiliser ADR() avec le paramètre formel d'une procédure ? Dans mon programme exemple, c'est le premier appel à test_ADR().
@Papydall: C'est comme ça que je m'en sors pour le moment. | |
|
| |
Jack Admin
Nombre de messages : 2395 Date d'inscription : 28/05/2007
| Sujet: Re: Problème avec ADR() et procédures Sam 29 Sep 2012 - 12:56 | |
| Le bug qui empêchait ADR() de retourner l'adresse d'une variable locale ou d'une variable formelle a été corrigé. La correction sera effective pour la prochaine version. Je m'attaque aux autres bugs : tableaux locaux et autres.
| |
|
| |
Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Sam 29 Sep 2012 - 13:42 | |
| pour tout Jacks | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Problème avec ADR() et procédures Sam 29 Sep 2012 - 14:47 | |
| Merci beaucoup, Jack ! C'est vraiment très encourageant, pour nous, la façon dont tu gères les bugs avérés. | |
|
| |
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Problème avec ADR() et procédures Sam 29 Sep 2012 - 16:02 | |
| Comme toujours la résolution des bugs est prioritaires Bonne continuation Jack | |
|
| |
Contenu sponsorisé
| Sujet: Re: Problème avec ADR() et procédures | |
| |
|
| |
| Problème avec ADR() et procédures | |
|