Passage de paramètres erroné

Résolu
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008 - 4 août 2008 à 15:09
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 4 août 2008 à 16:58
bonjour,
il y avait longtemps que je ne vous avais embêtés avec mes questions!
j'ai écrit une fonction dans une dll de mon crû, que j'utilise dans la fiche principale de mon application.
l'appel se fait correctement, sauf que sur les 6 paramètres passés, seuls les 3 derniers (1 double et 2 types perso) sont corrects dans l'exécution de la fonction (mode pas-à-pas), les 3 premiers (des entiers! y a pas plus con!) affiche des valeurs erronées.
j'ai modifié l'ordre de passage des paramètres, mais rien n'y fait!
est-ce un problème à la compilation de mon application ainsi que de la dll?
est-ce un désordre dans la liste de paramètres de ma fonction?
merci pour vos suggestions!

<hr />si Delphi m'était conté...

5 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 août 2008 à 16:27
mmm ...

essaye de changer la convention d'appel en Register ou StdCall plutot qu'en Pascal.

<hr size="2" width="100%" />
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
4 août 2008 à 15:11
Sans code ... impossible de te dire ou est le probleme! nous ne sommes pas DEVIN!!!

<hr size="2" width="100%" />
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
4 août 2008 à 16:03
oui certes...
donc:

les types déclarés dans une unité commune



type
      TFilter     = (fiBessel=0, fiButterworth=1, fiChebyshev=2, fiCriticalAbsorption=3);

      TFilterOperation    = (foSmoothDown=0, foFilter=1);

      MatrixD   = Array[1..255,0..17] of Double;





      std_re    = Record                      {variables d'exploitation des données significatives}
                     etal_std : Array[0..17] of Double;       {valeurs d'étalonnage significatives uniformisées}
                     mes_std  : MatrixD;                      {valeurs de mesures significatives uniformisées}


                     end;



        TSglValSerie  = Array[0..gen] of Single;




        PDblValSerie = ^TDblValSerie;
        TDblValSerie  = Array[0..gen] of Double;



la fct dans la dll:




{---------------------------------------------------------------------------}
{                         Filtre de 10ème ordre :                           }
{                 les coefficients sont fixés pour -3dB;                    }
{                co_fcut permet de renforcer le filtrage.                   }
{---------------------------------------------------------------------------}
function Filtre_10( const debut, fin : Integer;
                    const PosCapt    : Integer;
                    const Select     : TFilter;
                    const co_Fcut    : Double;
                    const but_op     : TFilterOperation;
                    var Sujet        : MatrixD
                     ) : MatrixD; pascal;




var Miroir    : TDblValSerie; //TSglValSerie; //^TSglValSerie;
    Coeff     : Array[1..2,1..5] of Double;
    Vec       : Array[1..3] of Double;
    n,p       : Integer;
    d,f       : Integer;
    dPh,Iter  : Integer;
    Ecart     : Double;
    Minima    : Double;
    Sujet2    : MatrixD;
    EnSo      : TDblValSerie; //TDblValSerie; //TSglValSerie;


begin
  d := 0; f := 0;
    {-------  Tableau: Tietze/Schenk,pages 391-393  -------}
  case Ord(Select) of
      0 : begin
            Coeff[1,1] := 1.0215; Coeff[2,1] := 0.2650;
            Coeff[1,2] := 0.9393; Coeff[2,2] := 0.2549;
            Coeff[1,3] := 0.7815; Coeff[2,3] := 0.2351;
            Coeff[1,4] := 0.5604; Coeff[2,4] := 0.2059;
            Coeff[1,5] := 0.2883; Coeff[2,5] := 0.1665;
          end;
      1 : begin
            Coeff[1,1] := 1.9754; Coeff[2,1] := 1.0;
            Coeff[1,2] := 1.7820; Coeff[2,2] := 1.0;
            Coeff[1,3] := 1.4142; Coeff[2,3] := 1.0;
            Coeff[1,4] := 0.9080; Coeff[2,4] := 1.0;
            Coeff[1,5] := 0.3129; Coeff[2,5] := 1.0;
          end;
      2 : for n := 1 to 5 do
            begin
              Coeff[1,n] := 0.5358;
              Coeff[2,n] := 0.0718;
            end;
      end;
  d := debut;
  f := fin;


  for p := 0 to PosCapt do         {filtrage des 18 séries de mesures}
      begin
        Minima := 0.0;
//        New(Miroir);
//        for n := 1 to gen do
//            Miroir^[n] := 0.0;
//        for n := 1 to fin do
//            Miroir^[n] := Sujet[n,p];
        for n := 1 to f do
            Miroir[n] := Sujet[n,p];
//            EnSo[n+10] := Miroir^[n];
        for n:=1 to f-10 do
            EnSo[n+10] := Miroir[n];
        for n := 10 downto 1 do EnSo[n] := EnSo[n+1] - (EnSo[n+2] - EnSo[n+1]);
        for n := (f+11) to (f+30) do  {prolongation artificielle pour tenir compte de dPh}
          EnSo[n] := EnSo[n-1] + (EnSo[n-1] - EnSo[n-2]);
        for n := f+31 to gen do EnSo[n] := 0.0;
        for Iter := 1 to 5 do
          begin
            Coeff[1,Iter] := co_fcut * Coeff[1,Iter];            {fcut --> fcut(-3dB)/co_fcut}
            Coeff[2,Iter] := co_fcut * co_fcut * Coeff[2,Iter];  {voir:Tietze/Schenk,page 385}
            vec[1] := 1 + coeff[1,Iter] + Coeff[2,Iter];
            vec[2] := (Coeff[1,Iter] + 2*Coeff[2,Iter]) / vec[1];
            vec[3] := -Coeff[2,Iter] / vec[1];
            for n := (d+2) to (f+20) do
                EnSo[n] := EnSo[n]/vec[1] + EnSo[n-1]*vec[2] + EnSo[n-2]*vec[3];
          end;
        Iter := 0;
        repeat
          Ecart := 0.0;
          for n := d to f do
//            Ecart := Ecart + Abs(EnSo[n+Iter] - Miroir^[n]);
            Ecart := Ecart + Abs(EnSo[n+Iter] - Miroir[n]);
          case Iter of
              0     : begin
                        Minima := Ecart;
                        Inc(Iter);
                      end;
              1..20 : begin
                        if Ecart < iMin then Minima := Ecart;
                        Inc(Iter);
                      end;
              end;
        until ((Iter = 20) or (Ecart > Minima));
        Dec(Iter);
        f := f - 10;
        if but_op = foSmoothDown then dPh:=Iter
                                 else dPh:=0;
        for n := d to f do Sujet2[n,p]:=EnSo[n+dPh];
           {    else if poscapt>32 then Sujet[inst,n-32]:=round(EnSo[n+dPh]);}
      end;
  Result := Sujet2;
//  Dispose(Miroir);
end;

le code appelant:
const
    nb_capt = 17;
var // globale d'unité
    real_data : std_re;
    ext_data : std_re;

var // locale de méthode ButtonClick
    cutfrqcoeff : Double;
    d,f : Integer;
(...)
 cutfrqcoeff := 1;
  with std_data
    do begin         d :Integer(Low(mes_std)); // d'où d 1         f :Integer(High(mes_std)); // d'où d 255

         for j:=d to f
           do for i:=Low(mes_std[j]) to High(mes_std[j])
                do real_data.mes_std[j,i] := mes_std[j,i] - etal_std[i];
       end;


 ext_data.mes_std := Filtre_10(d,f,nb_capt,fiBessel,cutfrqcoeff,foSmoothDown,real_data.mes_std);      {filtrage des données brutes à 25 Hz au 10ème ordre}





ce que j'ai mis en commentaire, c'est le code originel et les différents essais en changeant les types ou en se passant de pointeurs.







tout est fait pour Win32.







j'appelle le fonction avec les paramètres suivants:







 

debut 1; fin 255; nb_capt = 17 ;  Select = fiBessel; cutfrqcoeff = 1; but_op = foSmoothDown; Sujet = real_data




en mode pas à pas, une fois rentré dedans, je lis les paramètres de la fonction:




debut 1242648; fin 4215628; PosCapt = 1243472; Select = fiBessel; co_Fcut = 1; but_op = foSmoothDown; Sujet = real_data







merci pour votre aide


<hr />










si Delphi m'était conté...
0
cs_mounjetado Messages postés 66 Date d'inscription lundi 13 mars 2006 Statut Membre Dernière intervention 4 août 2008
4 août 2008 à 16:52
stdcall, c'est pire, mais register convient tout à fait!
faut dire que la méthode provient des Numerical Recipies in Pascal... ça date!
utilisé sur Delphi2 sous Win95, puis sur Delphi6 sous WinXP, ça allait...
mais avec Delphi2005, toujours sous WinXP et dans un projet pour Win32 (je suis autodidacte alors faut pas trop m'en demander...), ça foire, et d'ailleurs je crois que j'avais déjà eu ce problème avec d'autres méthodes dans cette librairie, mais dans des applications console qui font partie de mon projet. je regarderai si ça ne conviendrait pas également!
merci pour tout,f0xi, tu es un chef!

<hr />si Delphi m'était conté...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
4 août 2008 à 16:58
J'arrive après la bataille mais j'en profite pour rajouter que la convention on s'en fout du moment qu'elle est précisée deux fois:
- Dans la déclaration de la fonction dans la DLL.
- Dans la déclaration de la fonction dans le programme qui appelle la DLL.

Après, peu importe ce qu'on met, du moment que c'est bien la même chose. Par défaut, Delphi utilise "register" mais il vaut mieux le repréciser au cas où.
De plus, si tu veux assurer une compatibilité avec d'éventuelles futures applications en C/C++, je conseille la convention "stdcall" qui comme son nom l'indique est la convention d'appel standard par défaut de Windows.

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
Rejoignez-nous