Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Expert éminent sénior
    [Linux] Convertir un projet Delphi7 en Lazarus et des Single en Float (ou l'inverse)
    Bonjour,

    Dans un projet D7 je trouve, dans Unit1,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      Form1: TForm1;
      FFT : array[1..1024] of float; // Initial array that FFT Data will go into
      Scaled_FFT : array[0..15] of float; // The sorted and scaled data
      Bin_Dist : array[0..16] of integer; // My way of sorting data


    et plus loin
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for x := 0 to 15 do
    begin
      tot_sum := 0; 
      for y := Bin_Dist[x] to Bin_Dist[x+1] do tot_sum := tot_sum + (FFT[y]);
      Scaled_FFT[x] := tot_sum * 50; // Just get the numbers a little larger to work with
    end;

    donc ici on est en Float.

    Dans une unité complémentaire
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Procedure TSpectrum.Draw_Spec(HWND : THandle; FFTData : array of single);
    var
      i : Integer;
    begin
      Img_Hand := HWND;
      for i := 0 to No_Peaks - 1 do Spec_Data[i] := FFTData[i];
      Draw_It;
    end;

    Ici on est en Single et D7 ne dit rien à la compilation, et l'exécution est parfaite.

    Lazarus, lui, n'est pas content du tout lors de l'appel de cette procédure :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      GetData; // My proc to get and sort the data
      My_Spectrum.Draw_Spec(paintbox1.Canvas.Handle, Scaled_FFT);
    end;

    Avec le curseur au bout de Scaled_FFT je gagne
    Error: Incompatible type for arg no. 2: Got "Array[0..15] Of Extended", expected "Open Array Of Single"
    Si je remplace array of single par array of float dans les déclarations, ça compile, mais les données sont tellement en vrac que c'est inutilisable
    Et pareil si j'inverse :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    //  Scaled_FFT : array[0..15] of float;  // The sorted and scaled data
        Scaled_FFT : array[0..15] of single; // The sorted and scaled data


    J'ai remis en place {$MODE Delphi} mais ça ne change pas la donne.

    Comment faire ?
    Merci,

    Ah, pour les curieux, tout ça se trouve dans le projet audio BigJim_Spectrum (Dieu sait où je l'ai trouvé, et il y a looooooongtemps…)
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Modérateur

    Bonjour Jean-Pierre,

    Il n'y a pas que la taille du réel en cause, apparemment, mais aussi la compatibilité tableau dynamique/tableau aux dimensions fixes.

    Il faudrait regarder ce que donne la déclaration d'un type pour l'utiliser dans la déclaration des paramètres de la procédure TSpectrum.Draw_Spec :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TSeizeReels = array[0..15] of Float;
     
    Procedure TSpectrum.Draw_Spec(HWND : THandle; FFTData : TSeizeReels);

    Puis jouer sur les types Single et Float selon besoin !
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre éclairé
    Citation Envoyé par Jipété Voir le message
    ... [CODE]Procedure TSpectrum.Draw_Spec(HWND : THandle; FFTData : array of single); ...
    Et si ici tu changeais array of single par array[0...15] of Single ; Single ou Float, mais pas un array ouvert.

    Cordialement.

    Pierre.

  4. #4
    Membre expert
    Salut JP,

    sous D7 si je me souviens bien float est un Alias qui prend la type Double ou extended suivant un cas particulier.

    Vu que tu bosses avec un transformée de Fourrier je remplacerai plus par des double mais bon si ta fonction attend des single ben des single

    Mais ton problème ici c'est dans Procedure TSpectrum.Draw_Spec(HWND : THandle; FFTData : array of single); c'est un tableau dynamique et que Scaled_FFT : array[0..15] of single; est un tableau statique (ouep je sais ce truc est rageant avec Lazarus/FPC) je me suis déja pris la tête avec ça.

    La solution la plus simple à tester serait :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Var
      Scaled_FFT : Array of Single;
     
    procedure form1.FormCreate(sender : TObject);
    begin
      SetLength(Scale_FFT,16);
    end;
     
    procedure form1.FormDestroy(sender : TObject);
    begin
      SetLength(Scale_FFT,0);
      Scale_FFT := nil; // sinon reste des traces en mémoire
    end;


    A+

    Jérôme
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  5. #5
    Expert éminent sénior
    Bonsoir les copains, et merci de vos retours.

    Alors dans l'ordre de publication :
    1) Yves : pas mal l'idée, mais j'ai toujours des résultats inexploitables, même en mettant
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    type
      TSeizeReels = array[0..15] of Single;// Float;

    du style
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    0
    0
    -10
    3.54513656630137E-314
    10
    10
    -10
    10
    10
    10
    8.80963813057486E-415
    -10
    10
    10
    10
    2.30640489446536E-443
    -10
    10

    quand sous XP le même morceau de musique renvoie
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    0,000347559194779024
    0,000140536911203526
    0,00016242140554823
    3,12866905005649E-5
    4,30970430898014E-5
    9,53378475969657E-5
    9,10803937586024E-5
    0,000145086829434149
    1,84196560439887E-5
    0,000173073989572003
    9,32306720642373E-5
    0,000362227408913895
    0,000417395436670631
    0,000124832891742699
    0,000252640515100211


    2) Pierre : alors ça, je ne l'avais encore jamais vécu, dis donc !
    [CODE]Procedure Draw_Spec(HWND: THandle; FFTData: array[0..15] of single);// Fatal: Syntax error, "OF" expected but "[" found[/CODE]
    J'ai cherché cette erreur sur le web sans rien trouver en première page.

    3) Jérome : comme Yves.

    Si je mets le log plus loin (équivalent à ce qui sera passé à la proc d'affichage), sous Linux/Lazarus j'ai
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    0
    Nan
    Nan
    Nan
    Nan
    Nan
    Nan
    0
    0

    et sous XP/D7 :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    0
    2,454176902771
    1,75335144996643
    1,96362197399139
    3,54259562492371
    2,43138337135315
    3,16845107078552
    1,90426671504974
    2,55518412590027
    3,27383947372437
    8,01728248596191
    5,7591700553894


    Je suis désespéré…

    Bon, ok, sous XP/D7 c'est une vieille version de Bass alors que sous Linux c'est la toute dernière.
    Donc il va me falloir tester le code D7 avec la dernière dll, des fois qu'il y aurait une blague de ce côté-là.
    À suivre, je vous tiens au courant.

    EDIT : ça aura été vite, et c'est hallucinant : ça… fonctionne !
    J'ai un peu bataillé avec D7 et la dernière version (2.4.15), il m'a fallu passer les float (que D7 ne connaissait plus ) en single, et c'est devenu ok sous 2000 et XP.

    Alors j'ai tout passé en single (plus la manip d'Yves) dans Lazarus et… c'est tombé en marche,


    Merci à tous.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre expert
    Dis moi il vient d'ou, c'est quel exemple de Bass que je regarde de mon coté.
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert éminent sénior
    Citation Envoyé par BeanzMaster Voir le message
    Dis-moi il vient d'où, c'est quel exemple de Bass que je regarde de mon côté.
    J'ai cherché avant de poster mais je ne l'ai pas retrouvé.
    Le truc s'appelle BigJim Spectrum
    Je te propose le zip d'origine :
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Membre éclairé
    Citation Envoyé par Jipété Voir le message
    ... 2) Pierre : alors ça, je ne l'avais encore jamais vécu, dis donc !
    [CODE]Procedure Draw_Spec(HWND: THandle; FFTData: array[0..15] of single);// Fatal: Syntax error, "OF" expected but "[" found[/CODE] ...
    J'ai dit cela, mais un peu à la va vite, en fait, cela fonctionne, mais avec ce contour du problème :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
     
      TFFTData = array[0..15] of single;
    ...
     
    Procedure Draw_Spec(HWND: THandle; FFTData: TFFTData);


    Mais bon, si tu as résolu ton problème, c'est bien.

    Cordialement.

    Pierre.

  9. #9
    Expert éminent sénior
    Bonjour,

    si d'aucuns veulent jouer, dans le zip le .lpr et le .dpr, la dll et les fichiers qui vont bien avec les $IFDEF.

    Je vous laisse voir les commentaires, pour moi ça fonctionne dans les deux environnements mais ça aurait besoin d'encore un peu de travail.

    Enjoy,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Rédacteur/Modérateur

    Citation Envoyé par BeanzMaster Voir le message
    Mais ton problème ici c'est dans ... c'est un tableau dynamique
    array of est un tableau dynamique lors de la déclaration d'une variable mais un tableau ouvert s'il définit un argument.
    En d'autres termes, c'est un tableau dont on ne connait pas le nombre d'éléments et dont le premier a toujours l'indice 0 quelque soit la déclaration du tableau passé en paramètre.