begin process at 2012 02 07 07:52:14
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Exécution

 > 

Passage de paramètres erroné


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Passage de paramètres erroné

lundi 4 août 2008 à 15:09:01 | Passage de paramètres erroné

mounjetado

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!


si Delphi m'était conté...
lundi 4 août 2008 à 15:11:45 | Re : Passage de paramètres erroné

f0xi

Membre Club Administrateur CodeS-SourceS

Sans code ... impossible de te dire ou est le probleme! nous ne sommes pas DEVIN!!!




lundi 4 août 2008 à 16:03:16 | Re : Passage de paramètres erroné

mounjetado


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


si Delphi m'était conté...
lundi 4 août 2008 à 16:27:56 | Re : Passage de paramètres erroné

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !


mmm ...

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



lundi 4 août 2008 à 16:52:00 | Re : Passage de paramètres erroné

mounjetado

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!


si Delphi m'était conté...
lundi 4 août 2008 à 16:58:42 | Re : Passage de paramètres erroné

florenth

Membre Club
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.net [ Lien ]


Cette discussion est classée dans : fonction, passage, dll, paramètres, erroné


Répondre à ce message

Sujets en rapport avec ce message

Type d'une fonction d'une DLL [ par sebastienbro ] Voilà, j'aimerais savoir s'il est possible de retourner une auytre valeur que ShortString (String par exemple)Et si oui, comment, parceque dès que je prb avec dll et tableau dynamique [ par bd ] actuellement je recois en parametre d'une fonction un tableau de longueur variable. ce tableau est rempli dans la fonction de la dll.au retour dans la Comment ajouter des param. à l'appel d'une DLL [ par Pierrotmad ] J'ai un prog qui appelle une dll que j'ai réalisé . Dans la dll, j'ai un champ texte, disons pour l'exemple EdtChemin.text . J'aimerai mettre en param Newby vs. dll [ par DeltaFX ] Salut a tous,Je suis un pur newby, et je me retrouve en train d'essayer de pondre une dll avec delphi 7. Jusque là ca va, j'ai suivi des tutos de ci, Problèmes de DLL [ par LeGuepard ] Bonjour à tous,J'ai quelques petits problèmes de DLL. En fait j'ai remarque que deux de mes dll avait un bug commun, à savoir qu'elles déforme des cha Evenements d'un TApplication non géré à cause d'un chargment de DLL... [ par OrsE ] Salut tout le monde, Ceci est la suite de ce post, http://www.delphifr.com/forum.v2.aspx?ID=480490 Je le refait car j'ai pu identifier le problème cet Passage de paramètres dans Quickreport [ par jlp_alexandre ] Merci pour ta réponse.Il y a un seul problème : il n'esiste pas de composant QrText dans QuickReport, où alors je suis un peu fatugué ce soir !Merci p [JOB][passage de paramètres] [ par PpPool ] Bonjour à tous, je me permets de vous demander conseil : j'ai une appli 32 bits assez simple développée avec Delphi 7 qui permet d'envoyer des emails Delphi et C++ passage de'instances [ par ptitmanu ] Bonjour,Je programme une appli en Delphi qui utilise une DLL ecrite en VC++. Je fais appel à des méthodes de ma DLL qui me retourne des objets. Que do Problème avec le passage de paramètres [ par pepitto ] J'ai problème avec le passage de paramètre : j'ai bien utilisé paramstr mais dès que je dépasse une certaine capacité de paramètre (liste de fichiers


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 6,739 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales