IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Lazarus Pascal Discussion :

[Linux] Problème de pointeur qui plante tout le Bureau [Lazarus]


Sujet :

Lazarus Pascal

  1. #41
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par anapurna Voir le message
    essaie de compiler avec les vérifications de limites et vérification de débordement dans les options de projet, de mémoire c'est {$R+} ou /et {$S+}
    l'erreur n’était peut-être pas là où tu le crois
    Ben, ces options je les avais activées à la demande de Jérôme, je les ai désactivées depuis. Pour bien faire, il faudrait tout reprendre à zéro, et en même temps que je l'écris, je me dis que ça va prendre 30 secondes alors je le fais : j'extrais de l'archive le dossier concerné, à un autre endroit que celui où j'ai eu le problème.
    Puis ce nouveau projet Delphi une fois converti en Lazarus, je modifie un handle en nil sinon ça compile pas, je remplace stdcall; par {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};, j'adapte un chemin pour que le compilo trouve la librairie, je compile, j'exécute, et… rien à signaler, ça fonctionne.

    Alors peut-être que je me suis fait un nœud quelque part il y a 8 jours environ, mais je n'arrive pas à reproduire le plantage.

    Désolé, encore un mystère insoluble.
    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. #42
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bonjour,

    je reviens là-dessus car le hasard faisant bien les choses, je tombe sur ça dans un code Bass et, mais lisez plutôt les lignes de code après la citation
    Citation Envoyé par tourlourou Voir le message
    absolute indique qu'une variable pointe sur le même espace mémoire qu'une autre, un peu comme la partie variable d'un record qui peut être vue de plusieurs manières, ce qui revient à un transtypage permanent et réciproque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    type
    //  TSpectrumBuf   = array[0..0] of Byte; // original
      TSpectrumBuf   = array of Byte;
    var
      SBuf       : ^TSpectrumBuf absolute SpectrumBuf; 
    begin                                              
      SetLength(SBuf^, WIDTH * HEIGHT);            // compile
      SetLength(SpectrumBuf^, WIDTH * HEIGHT);     // error: type mismatch
    Si quelqu'un peut faire compiler la ligne en erreur pour que je puisse définir la taille de l'array, ça serait cool.
    Parce que si je commente cette ligne, c'est SIGSEGV garanti à l'utilisation de SpectrumBuf…

    Ah, au cas où ça aurait une importance, le .pas est en {$mode delphi} sinon pas moyen de faire compiler avec les procédures de callback (ça aussi c'est quelque chose !)
    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

  3. #43
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TSpectrumBuf  = array[0..0] of Byte; // original
    var
      SBuf : ^TSpectrumBuf absolute SpectrumBuf;
    Déjà là ça ne peut pas jouer. SBuf est un pointeur mais SpectrumBuf est un tableau d'octets. Il n'y a pas de pointeur stocké à cette adresse.

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TSpectrumBuf  = array of Byte;
    var
      SBuf : ^TSpectrumBuf absolute SpectrumBuf;
    Cette fois SpectrumBuf est bien un pointeur mais SBuf devient un pointeur sur un pointeur. SetLength(SBuf^, WIDTH * HEIGHT); va compiler (puisque la procédure attend un pointeur) mais échouer à l'exécution.

    Si SetLength(SBuf^) est appeler avant de fixer la longueur de SpectrumBuf, c'est une VA puisqu'un tableau vide est un pointeur nil (et SBuf est l'adresse contenue à l'adresse nil ).

    Si après, ben SetLength(SBuf^) va stocker un pointeur dans les N premiers enregistrements de SpectrumBuf corrompant le tableau (avec éventuellement une VA si le tableau d'octets n'est pas au minimum de SizeOf(pointer) éléments). Et bien sûr, tu auras deux tableaux indépendants.


    Citation Envoyé par Jipété Voir le message
    Si quelqu'un peut faire compiler la ligne en erreur pour que je puisse définir la taille de l'array, ça serait cool.
    Et bien ce sera simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    type
      TSpectrumBuf = array of Byte;
    var
      SBuf : TSpectrumBuf absolute SpectrumBuf; 
    begin                                              
      SetLength(SBuf, WIDTH * HEIGHT);
      // SetLength(SpectrumBuf, WIDTH * HEIGHT);     // ligne inutile
    Mais déclarer SBuf ne simplifie rien ici et n'a aucun intérêt

  4. #44
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Et bien ce sera simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin                                              
      SetLength(SBuf, WIDTH * HEIGHT);
      // SetLength(SpectrumBuf, WIDTH * HEIGHT);     // ligne inutile
    Mais déclarer SBuf ne simplifie rien ici et n'a aucun intérêt
    Je ne comprends pas ta remarque car, en mettant juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    begin                                              
      SetLength(SBuf, WIDTH * HEIGHT);
    je ne plante plus sur le FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0); // sigsegv qui se trouve plus bas.

    Bon, j'ai un autre plantage plus loin, mais je n'ai pas le temps, là maintenant.
    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

  5. #45
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Ce que je voulais dire est que tu peux te passer de SBuf et travailler uniquement avec SpectrumBuf.

  6. #46
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut il nous manque un bout de code là.

    Je suppose que tu as un truc dans le genre, non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure DrawSpectrum(var SpectrumBuf : Pointer);
    var
      SBuf : ^TSpectrumBuf absolute SpectrumBuf;
    begin
      SetLength(SBuf, SPECWIDTH * SPECHEIGHTt);
      //..
      Fillchar(sbuf, SPECWIDTH * SPECHEIGHT, 0);
    • "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. #47
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ce que je voulais dire est que tu peux te passer de SBuf et travailler uniquement avec SpectrumBuf.
    Tu verras dans le snippet ci-après (lignes 31 et 38 ici) que les deux sont utilisés (peut-être que ce code est mal écrit ?)

    Citation Envoyé par BeanzMaster Voir le message
    Salut il nous manque un bout de code là.
    Voilà voilà,
    Pour ne pas trop alourdir, j'ai viré les case 1 et 2, ainsi que la procédure d'affichage tout à la fin (qu'il faut encore que je porte de Windows [bas niveau] à Linux) :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    procedure UpdateSpectrum(uTimerID, uMsg, dwUser, dw1, dw2 : Integer); {$IFDEF MSWINDOWS}stdcall{$ELSE}cdecl{$ENDIF};
    type
    //  TSpectrumBuf   = array[0..0] of Byte;
      TSpectrumBuf   = array of Byte;
      TBuf       = array of SmallInt;
    var
      DC         : HDC;
      X, Y, Y1,
      V, B0, B1,
      SC         : Integer;
      Sum        : Single;
      aRect      : TRect;
      fft        : array[0..1023] of Single;
      Buf        : TBuf;
      SBuf       : TSpectrumBuf absolute SpectrumBuf;      // ^TSpectrumBuf
    begin                                                   // 1 @ et 5 ^ rajoutés
      SetLength(SBuf, SPECWIDTH * SPECHEIGHT); // ajouté
      if SpectrumMode = 3 then  // waveform
      begin
        FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0);
        SetLength(Buf, SPECWIDTH);
        BASS_ChannelGetData(Channel, @Buf, SizeOf(SmallInt) * SPECWIDTH); // get the sample data  //@
     
        Y := 0;
        for X := 0 to SPECWIDTH - 1 do
        begin
          V := (32767 - Buf[X]) * SPECHEIGHT div 65536; // invert and scale to fit display
          if X = 0 then Y := V;
          repeat	// draw line from previous sample...
    	if Y < V then inc(Y) else if Y > V then dec(Y);
    	SBuf[Y * SPECWIDTH + X] := abs(Y - SPECHEIGHT div 2) * 2 + 1;
          until Y = V;
        end;
      end
      else
      begin
        BASS_ChannelGetData(Channel, @fft, BASS_DATA_FFT2048); // get the FFT data
        case SpectrumMode of
          0 :  // "normal" FFT
          begin
    	FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0); 
     
    	Y1 := 0;
    	for X := 0 to (SPECWIDTH div 2) - 1 do
    	begin
    {$IFDEF ScaleSqrt}
    	  Y := Trunc(sqrt(fft[X + 1]) * 3 * SPECHEIGHT - 4); // scale it (sqrt to make low values more visible)
    {$ELSE}
    	  Y := Trunc(fft[x + 1] * 10 * SPECHEIGHT); // scale it (linearly)
    {$ENDIF}
    	  if Y > SPECHEIGHT then Y := SPECHEIGHT; // cap it
     
    	  Y1 := (Y + Y1) div 2;
    	  if (X > 0) and (Y1 > 0) then // interpolate from previous to make the display smoother
    	    while (Y1 >= 0) do
    	    begin
    	      SBuf[Y1 * SPECWIDTH + X * 2 - 1] := Y1 + 1;    
    	      dec(Y1);
    	    end;
     
    	  Y1 := Y;
    	  while (Y >= 0) do
    	  begin
    	    SBuf[Y * SPECWIDTH + X * 2] := Y + 1; // draw level
    	    dec(Y);
    	  end;
    	end;
          end;
        end;
      end;
      // update the display
      ...
    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. #48
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Où et comment est défini SpectrumBuf ?

    Citation Envoyé par Jipété Voir le message
    Tu verras dans le snippet ci-après (lignes 31 et 38 ici) que les deux sont utilisés (peut-être que ce code est mal écrit ?)
    Ces lignes FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0) pourraient clairement être remplacées par FillChar(SBuf[0], SPECWIDTH * SPECHEIGHT, 0).


    EDIT:
    Voir update the display aurait tout de même été intéressant pour comprendre l'utilité de SpectrumBuf.
    Ça donne cependant l'impression que c'est un accès direct aux informations d'un bitmap (créé par CreateDIBSection).

  9. #49
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Où et comment est défini SpectrumBuf ?
    dans la section
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      SBuf       : TSpectrumBuf absolute SpectrumBuf;  // ^TSpectrumBuf à l'origine
    de la procedure UpdateSpectrum, après un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
    //  TSpectrumBuf   = array[0..0] of Byte; // à l'origine
      TSpectrumBuf   = array of Byte;
    EDIT : mais aussi globalement, plus haut dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      SpectrumBuf	: Pointer;
    Mais pourquoi les choses sont-elles aussi compliquées ?
    /EDIT

    Citation Envoyé par Andnotor Voir le message
    Ces lignes FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0) pourraient clairement être remplacées par FillChar(SBuf[0], SPECWIDTH * SPECHEIGHT, 0).
    Dont acte. Du coup,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var
      SBuf       : TSpectrumBuf;// absolute SpectrumBuf;  // ^TSpectrumBuf à l'origine
    ça compile, et ça s'exécute jusqu'au display : la ligne bitblt plante avec une exception forcée, un gag spécial Lazarus, mais pourquoi ? :
    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
    {------------------------------------------------------------------------------
      procedure RaiseGDBException(const Msg: string);
     
      Raises an exception.
      Normally gdb does not catch fpc Exception objects, therefore this procedure
      raises a standard "division by zero" exception which is catched by gdb.
      This allows one to stop a program, without extra gdb configuration.
     ------------------------------------------------------------------------------}
    procedure RaiseGDBException(const Msg: string);
    begin
      debugln(rsERRORInLCL, Msg);
      // creates an exception, that gdb catches:
      debugln(rsCreatingGdbCatchableError);
      DumpStack;
      if (length(Msg) div (length(Msg) div 10000))=0 then ;
    end;
    Résultat, on ne sait pas ce qui lui déplaît dans cette ligne (lire + bas)…

    Citation Envoyé par Andnotor Voir le message
    EDIT:
    Voir update the display aurait tout de même été intéressant pour comprendre l'utilité de SpectrumBuf.
    Yakà demander,
    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
    19
    20
      // update the display
      DC := GetDC(WndGlobal);
      try 
        BitBlt(DC, 0, 0, SPECWIDTH, SPECHEIGHT, SpectrumDC, 0, 0, SRCCOPY); // SIGFPE
        if LOWORD(BASS_ChannelGetLevel(Channel)) < 500 then
        begin // check if it's quiet
          inc(QuietCount);
          if (QuietCount > 40) and (QuietCount and 16 > 0) then
          begin // it's been quiet for over a second
            SetRect(aRect, 0, 0, SPECWIDTH, SPECHEIGHT);
            SetTextColor(DC, $ffffff);
            SetBkMode(DC, TRANSPARENT);
            DrawText(DC, 'make some noise!', -1, aRect, DT_CENTER or DT_VCENTER or DT_SINGLELINE);
          end;
        end
        else
          QuietCount := 0; // not quiet
      finally
        ReleaseDC(Window, DC);
      end;
    Citation Envoyé par Andnotor Voir le message
    Ça donne cependant l'impression que c'est un accès direct aux informations d'un bitmap (créé par CreateDIBSection).
    C'est exactement ça, dans une proc bien nommée "InitApp" :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
      // create bitmap to draw spectrum in - 8 bit for easy updating :)
      GetMem(BI, SizeOf(TBitmapInfo) + 256 * SizeOf(TRGBQuad));
      try
        with BI^.bmiHeader do		// fill structure with parameter bitmap
        begin
          biSize         := SizeOf(BI^.bmiHeader);  //^
          biWidth        := SPECWIDTH;
          biHeight       := SPECHEIGHT;	// upside down (line 0=bottom)
          biPlanes       := 1;
          biBitCount     := 8;
          biClrImportant := 256;
          biClrUsed	     := 256;
        end;
     
        // setup palette
        for I := 1 to 127 do
        begin
          pal[I].rgbGreen := 256 - 2 * I;
          pal[I].rgbRed   := 2 * I;
        end;
     
        for I := 0 to 31 do
        begin
          pal[128 + I].rgbBlue       := 8 * I;
          pal[128 + 32 + I].rgbBlue  := 255;
          pal[128 + 32 + I].rgbRed   := 8 * I;
          pal[128 + 64 + I].rgbRed   := 255;
          pal[128 + 64 + I].rgbBlue  := 8 * (31 - I);
          pal[128 + 64 + I].rgbGreen := 8 * I;
          pal[128 + 96 + I].rgbRed   := 255;
          pal[128 + 96 + I].rgbGreen := 255;
          pal[128 + 96 + I].rgbBlue  := 8 * I;
        end;
     
        // Move palette in BI
        Move(Pal, BI^.bmiColors, 256 * SizeOf(TRGBQuad));
     
        // create the bitmap
        SpectrumBmp := CreateDIBSection(0, BI^, DIB_RGB_COLORS, SpectrumBuf, 0, 0);
        SpectrumDC  := CreateCompatibleDC(0);
        SelectObject(SpectrumDC, SpectrumBmp);
      finally
        FreeMem(BI);
      end;
    Merci de te (vous !) préoccuper de la santé fragile de mes pauvres neurones un peu dépassés, là.
    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. #50
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Yop j'ai regardé l'exemple de Bass 2.4 et j'ai ça comme code :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
     
    var
      SpecBuf	: Pointer;
     
    procedure UpdateSpectrum(uTimerID, uMsg, dwUser, dw1, dw2 : LongWord); stdcall;
    type
      TSingleArray	= array of Single;
    var
      DC		: HDC;
      X, Y, Z,
      I, J, sc	: Integer;
      Sum		: Single;
      fft		: array[0..1023] of Single; // get the FFT data
      ci		: BASS_CHANNELINFO;
      Buf		: TSingleArray;
    begin
      if SpecMode = 3 then  // waveform
      begin
        FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
        BASS_ChannelGetInfo(chan, ci); // get number of channels
        SetLength(Buf, ci.chans * SPECWIDTH);
        Y := 0;
        BASS_ChannelGetData(chan, @buf, (ci.chans * SPECWIDTH * SizeOf(Single)) or BASS_DATA_FLOAT); // get the sample data (floating-point to avoid 8 & 16 bit processing)
        for I := 0 to ci.chans - 1 do
        begin
          for X := 0 to SPECWIDTH - 1 do
          begin
    	Z := Trunc((1 - Buf[X * Integer(ci.chans) + I]) * SPECHEIGHT / 2); // invert and scale to fit display
    	if Z < 0 then
    	  Z := 0
    	else if Z >= SPECHEIGHT then
    	  Z := SPECHEIGHT - 1;
    	if X = 0 then
    	  Y := Z;
    	repeat  // draw line from previous sample...
    	  if Y < Z then
    	    inc(Y)
    	  else if Y > Z then
    	    dec(Y);
    	  if (I and 1) = 1 then
    	    Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X)^) := 127
    	  else
    	    Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X)^) := 1;
    	until Y = Z;
          end;
        end;
      end
      else
      begin
        BASS_ChannelGetData(chan, @fft, BASS_DATA_FFT2048);
        case SpecMode of
          0 :  // "normal" FFT
          begin
    	FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
    	Z := 0;
    	for X := 0 to pred(SPECWIDTH) div 2 do
    	begin
    	  Y := Trunc(sqrt(fft[X + 1]) * 3 * SPECHEIGHT - 4); // scale it (sqrt to make low values more visible)
    //	Y := Trunc(fft[X + 1] * 10 * SPECHEIGHT); // scale it (linearly)
    	  if Y > SPECHEIGHT then
    	    Y := SPECHEIGHT; // cap it
     
    	  if (X > 0) and (Z = (Y + Z) div 2) then // interpolate from previous to make the display smoother
    	    while (Z >= 0) do
    	    begin
    	      Byte(Pointer(Longint(SpecBuf) + Z * SPECWIDTH + X * 2 - 1)^) := Z + 1;
    	      dec(Z);
    	    end;
     
    	  Z := Y;
    	  while (Y >= 0) do
    	  begin
    	    Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X * 2)^) := Y + 1; // draw level
    	    dec(Y);
    	  end;  
            end;
          end;  
          1 :   // logarithmic, acumulate & average bins
          begin
            I := 0;
            FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
    	for X := 0 to BANDS - 1 do
    	begin
    	  Sum := 0;
    	  J  := Trunc(Power(2, X * 10.0 / (BANDS - 1)));
    	  if J > 1023 then
    	    J := 1023;
    	  if J <= I then
    	    J := I + 1; // make sure it uses at least 1 FFT bin
    	  sc := 10 + J - I;
     
    	  while I < J do
    	  begin
    	    Sum := Sum + fft[1 + I];
    	    inc(I);
    	  end;
     
    	  Y := Trunc((sqrt(Sum / log10(sc)) * 1.7 * SPECHEIGHT) - 4); // scale it
    	  if Y > SPECHEIGHT then
    	    Y := SPECHEIGHT; // cap it
    	  while (Y >= 0) do
    	  begin
    	    FillChar(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X * (SPECWIDTH div BANDS))^, SPECWIDTH div BANDS - 2, Y + 1); // draw bar
    	    dec(Y);
    	  end;
    	end;
          end;
          2 :  // "3D"
          begin
    	for X := 0 to SPECHEIGHT - 1 do
    	begin
    	  Y := Trunc(sqrt(fft[x + 1]) * 3 * 127); // scale it (sqrt to make low values more visible)
    	  if Y > 127 then
    	    Y := 127; // cap it
    	  Byte(Pointer(Longint(SpecBuf) + X * SPECWIDTH + SpecPos)^) := 128 + Y; // plot it
    	end;
    	// move marker onto next position
    	SpecPos := (SpecPos + 1) mod SPECWIDTH;
    	for X := 0 to SPECHEIGHT do
    	  Byte(Pointer(Longint(SpecBuf) + X * SPECWIDTH + SpecPos)^) := 255;
          end;
        end;
      end;
      // update the display
      DC := GetDC(Window);
      try
        BitBlt(DC, 0, 0, SPECWIDTH, SPECHEIGHT, SpecDC, 0, 0, SRCCOPY);
      finally
        ReleaseDC(Window, DC);
      end;
    end;
    J'ai réussi à le convertir pour Lazarus (avec son lot de galères) ça fonctionne mais au 3eme clique de souris de gros SIGSEV à divers endroits de cette procedure. Le code n'est pas vraiment sûre. Par contre ce genre d'acces aux valeurs des pointeurs Byte(Pointer(Longint(SpecBuf) + ....

    je ne suis vraiment pas fan surtout que cela pose des problèmes entre 32 et 64 bits et entre OS.
    • "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

  11. #51
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Yop j'ai regardé l'exemple de Bass 2.4 et j'ai ça comme code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var
      SpecBuf	: Pointer;
    ...
    Ah ! Moi je n'ai pas ce Pointer. C'est un ajout de ta part ? Ou tu n'as pas la 2.4.15 ?

    Citation Envoyé par BeanzMaster Voir le message
    J'ai réussi à le convertir pour Lazarus (avec son lot de galères) ça fonctionne mais au 3eme clique de souris de gros SIGSEV à divers endroits de cette procedure.
    Alors c'est là-dedans que ça se passe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    begin
      if SpecMode = 3 then  // waveform
      begin
        FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
        ...
    Si le prog fonctionne comme celui en C, il se lance en mode 0 et chaque clic incrémente le mode (puis retour à 0).
    EDIT : quand tu dis que ça fonctionne, tu obtiens des choses comme ça ? (image du prog en C) :
    Nom : program.png
Affichages : 245
Taille : 8,7 Ko
    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

  12. #52
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Ces lignes FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0) pourraient clairement être remplacées par FillChar(SBuf[0], SPECWIDTH * SPECHEIGHT, 0).
    Et au bout du compte, comme écrit un peu plus tôt, je pourrais carrément me passer de SpectrumBuf sauf que...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormClick(Sender: TObject);
    begin
      SpectrumMode := (SpectrumMode + 1) mod 4; // swap spectrum mode
      if SpectrumMode = 2 then SpectrumPos := 0;
      FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0);	// clear display
    end;
    Jérôme, ce specbuf me gonflait au plus haut point (je pensais sans arrêt à spécification, qu'on abrège en spec), du coup je l'ai renommé en spectrumbuf, oui je sais, ça complique, d'autant plus que j'applique cette règle à specmode, specpos, etc. -- Bah, quand j'ai renommé je ne pensais pas que ça se retrouverait sous vos yeux émerveillés,
    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

  13. #53
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah ! Moi je n'ai pas ce Pointer. C'est un ajout de ta part ? Ou tu n'as pas la 2.4.15 ?
    Non rien ajouté le code vient directement du zip téléchargé sur le site de bass qui est bien la 2.4.15

    Citation Envoyé par Jipété Voir le message
    Si le prog fonctionne comme celui en C, il se lance en mode 0 et chaque clic incrémente le mode (puis retour à 0).
    EDIT : quand tu dis que ça fonctionne, tu obtiens des choses comme ça ? (image du prog en C) :
    Nom : program.png
Affichages : 245
Taille : 8,7 Ko
    Oui, sauf que quand retour à zero ça plante a cause du BitmapDIB je pense

    Citation Envoyé par Jipété Voir le message
    Et au bout du compte, comme écrit un peu plus tôt, je pourrais carrément me passer de SpectrumBuf sauf que...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormClick(Sender: TObject);
    begin
      SpectrumMode := (SpectrumMode + 1) mod 4; // swap spectrum mode
      if SpectrumMode = 2 then SpectrumPos := 0;
      FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0);	// clear display
    end;
    Oui comme je le disais je n'aime pas cette façon de jouer avec les pointeur. L'effacement du buffer tu peux le faire dans la fonction avec une variable globale qui garderait le numero du mode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Var
      OldMode : Byte;
     
    begin
      if SpectrumMode <> OldMode then FillChar(SpectrumBuf^, SPECWIDTH * SPECHEIGHT, 0);
    EDIT : A la limite ce n'est pas vraiment grave, car quoi qu'il arrive le buffer est effacé dans les 3 modes dans la procédure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if SpecMode = 3 then  // waveform
      begin
        FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
    //...
    case SpecMode of
          0 :  // "normal" FFT
          begin
    	FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
    //...
    1 :   // logarithmic, acumulate & average bins
          begin
            I := 0;
            FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
    Du coup je viens de me rendre compte que ça plante sur le n°3 et non sur le retour à 0

    Citation Envoyé par Jipété Voir le message
    Jérôme, ce specbuf me gonflait au plus haut point (je pensais sans arrêt à spécification, qu'on abrège en spec), du coup je l'ai renommé en spectrumbuf, oui je sais, ça complique, d'autant plus que j'applique cette règle à specmode, specpos, etc. -- Bah, quand j'ai renommé je ne pensais pas que ça se retrouverait sous vos yeux émerveillés,
    Tu m'étonnes, le code pique un peu les yeux . Je suis de ton avis c'est plus parlant "SpectrumXXXX"
    • "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

  14. #54
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    J'ai réussis a faire fonctionner le mode 3. Mais à mon avis faudrait se pencher un peu plus sur le code et uniformiser tout ça.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    var
    //...
      Buf		: PSingle;//TSingleArray;
    begin
      if SpecMode = 3 then  // waveform
      begin
        FillChar(SpecBuf^, SPECWIDTH * SPECHEIGHT, 0);
        BASS_ChannelGetInfo(chan, ci); // get number of channels
        //SetLength(Buf, ci.chans * SPECWIDTH);
        GetMem(Buf, ci.chans * SPECWIDTH * 4);
        Y := 0;
        BASS_ChannelGetData(chan, buf, (ci.chans * SPECWIDTH * SizeOf(Single)) or BASS_DATA_FLOAT); // get the sample data (floating-point to avoid 8 & 16 bit
        for I := 0 to ci.chans - 1 do
        begin
          for X := 0 to SPECWIDTH - 1 do
          begin
    	      Z := Trunc(((1.0- Buf[X * integer(ci.chans) + I])) * (SPECHEIGHT*0.5) ); // invert and scale to fit display
    	      if Z < 0 then Z := 0
    	      else if Z >= SPECHEIGHT then Z := SPECHEIGHT - 1;
    	      if X = 0 then Y := Z;
    	      repeat  // draw line from previous sample...
    	        if Y < Z then
    	          inc(Y)
    	        else if Y > Z then
    	          dec(Y);
                   if I>0 then
                   begin
                     If (I and 1) = 1 then   // UNIQUEMENT POUR DES FICHIERS EN STEREO
    	            Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X)^) := 127
                     else
    	            Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X)^) := 1;
                  end
                  else
                    Byte(Pointer(Longint(SpecBuf) + Y * SPECWIDTH + X)^) := 127;  
    	    until Y = Z;
          end;
        end;
        FreeMem(buf);
      end
    Je n'ai pas regardé les exemples de code dans les autres langages, mais en Delphi/Pascal la qualité des codes est bien en dessous de la qualité de la bibliothèque en elle mê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

  15. #55
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bonjour,

    Je crois que je vais tout reprendre à zéro, j'ai l'impression que je me suis fait un nœud entre les projets livespec et spectrum, car si l'un a tout dans le .dpr, l'autre utilise Unit1.pas, et ils ont hélas le même nom de procédure centrale UpdateSpectrum où il y a des différences entre les implémentations...

    C'est immonde à essayer de dépatouiller, et bien sûr en repartant des sources d'origine c'est SIGSEGV sur SIGSEGV, je commente je modifie un truc et après plusieurs fois comme ça je sais plus où j'en suis,
    Il me faudrait 6 écrans, comme les traders,
    Ne perdez pas votre temps avec ça.

    Ah, quand tu disais que chez toi ça fonctionnait, tu étais sous W10 (ou 8 ou 7), on est d'accord ?
    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

  16. #56
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonjour,

    Je crois que je vais tout reprendre à zéro, j'ai l'impression que je me suis fait un nœud entre les projets livespec et spectrum, car si l'un a tout dans le .dpr, l'autre utilise Unit1.pas, et ils ont hélas le même nom de procédure centrale UpdateSpectrum où il y a des différences entre les implémentations...

    C'est immonde à essayer de dépatouiller, et bien sûr en repartant des sources d'origine c'est SIGSEGV sur SIGSEGV, je commente je modifie un truc et après plusieurs fois comme ça je sais plus où j'en suis,
    Il me faudrait 6 écrans, comme les traders,
    Ne perdez pas votre temps avec ça.

    Ah, quand tu disais que chez toi ça fonctionnait, tu étais sous W10 (ou 8 ou 7), on est d'accord ?
    Oui j'ai compilé en 32 bits sous W10 (je ne sais plus ou j'ai mis la version 64bits de la DLL Bass (une chose est sure les entête des méthodes sont différentes au niveau des type utilisés entre 32 et 64 bits)



    Que la force soit avec toi

    Pour l'instant je peaufine, les commentaires et la doc de ma bibliothèque (je suis presque au bout ) Je ferai plus de recherche et de test sur Bass par la suite (je comptais l'implémenter de toute façon)
    • "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

  17. #57
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Oui j'ai compilé en 32 bits sous W10
    Linux, le vilain petit canard...

    Plus les gags Lazarus, je t'explique pas le temps perdu, un exemple de cette fin de matinée : un point d'arrêt oublié dans une procédure en commentaire, hé bien au F9 je passe en mode pas-à-pas à la première ligne du FormCreate. Le temps qu'il m'a fallu pour trouver ça...

    Citation Envoyé par BeanzMaster Voir le message
    Que la force soit avec toi
    Je vais en avoir besoin : j'envisage de supprimer ces cochonneries de pointeurs absolus qui me mettent une pagaille infernale pour travailler avec un bon vieux TBitmap, faudra juste adapter les calculs de tailles des bargraphs (si je puis dire).

    Mais pas ce week-end !
    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

  18. #58
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bonjour,
    Citation Envoyé par Jipété Voir le message
    Je vais en avoir besoin : j'envisage de supprimer ces cochonneries de pointeurs absolus qui me mettent une pagaille infernale pour travailler avec un bon vieux TBitmap, faudra juste adapter les calculs de tailles des bargraphs (si je puis dire).

    Mais pas ce week-end !
    Des nouvelles (non, je ne suis pas tombé dans une faille de l'espace-temps, et je ne suis pas non plus en quarantaine).

    J'arrive à faire fonctionner la proc UpdateSpectrum sans toucher aux pointeurs et sans SIGSEGV, c'est déjà pas mal.
    EDIT : les SIGSEGV sont revenus, ouf !, j'ai eu peur.
    En prime, là, j'ai droit aux meilleurs, les aléatoires : un coup F9 tient quelques secondes, un coup ça plante à l'entrée de la proc, sans que je sache pourquoi ça tient ou pas…
    /EDIT
    Ça aura été ardu, surtout quand on se prend des messages d'erreur totalement abscons et juste indéboggables, genre :

    Nom : sigsegv_lockenter.png
Affichages : 200
Taille : 23,9 Ko
    je ne l'avais jamais eu, celui-ci.

    Bref, en rajoutant des GetMem/FreeMem (merci Jérôme) judicieusement placés, j'entrevois le bout du tunnel.

    EDIT
    La seule chose qu'il me reste à meuler, c'est l'affichage des graphiques et là, je ne suis pas rendu, car le son n'est pas détecté, mais c'est une autre histoire…
    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

  19. #59
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Bon, j'espère que quelqu'un aura une idée pour me sortir de ce pétrin mais là, je crois que je touche le fond…

    Soit une procédure toute bête qui fait des calculs, avec une structure genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure UpdateSpectrum;
    begin
      case SpectrumMode of
      0: begin end;
      1: begin end;
      2: begin end;
      3: begin end;
    end;
    Entre begin et end vous vous doutez qu'il y a des calculs.

    Si j'appelle cette procédure en mode pas-à-pas elle s'exécute bien et je peux même changer de mode en cliquant sur la fiche, ça incrémente SpectrumMode et ça rappelle la proc.

    Et en mode prod, la proc est appelée par un timer et c'est SIGSEGV dans presque tous les cas de figure et ça, ça me laisse sans voix puisque, je le redis, "je ne change pas une virgule à la proc", c'est juste la manière de l'appeler qui change, soit à la vitesse de mon clic, soit sur l'intervalle du timer, réglé à 25.
    Le problème c'est que même en le descendant à 1, c'est SIGSEGV.

    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
    19
    {$DEFINE PROD}
     
    procedure TForm1.TimerTimer(Sender: TObject);
    begin
      timer.Enabled:=False;
      UpdateSpectrum(0,0,0,0,0);
      {$IFDEF PROD}
        timer.Enabled:=True;
      {$ENDIF}
    end;
     
    procedure TForm1.FormClick(Sender: TObject);
    begin
      SpectrumMode := (SpectrumMode + 1) mod 4; // swap spectrum mode
      if SpectrumMode = 2 then SpectrumPos := 0;
      {$IFNDEF PROD}
        UpdateSpectrum(0,0,0,0,0);  // one shot
      {$ENDIF}
    end;
    Que faire face à ce sale coup du sort ?
    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

  20. #60
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut bon de 1 je ne vois pas l’intérêt d'utiliser le timer pour passer de l'un à l'autre, mais bon.

    Entre ton mode PROD et DEBUG tes options de compilations sont-elles les mêmes ?
    Dans les options personnalisées du projet, vu que tu es sous Linux, as tu rajouté "-dUseCThreads" ? sinon fais-le. Ton salut viendra peut-être de là, au vu de ton SIGSEGV sur Lock.Enter qui d'instinct signifie que c'est un appel à une section critique, donc un thread. Pour ma part je ne me casse plus la tête, j'ajoute systématiquement cette option dans mes projets lorsque je les compile sous Linux, utilisation ou pas de thread.

    Ensuite ta procédure est appelée par BASS donc avec ton timer, du fait que celle-ci attend un buffer en retour, il y a de forte possibilité que cela plante à un moment donné.

    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Problème de fonction qui plante
    Par Airox- dans le forum C
    Réponses: 3
    Dernier message: 18/12/2016, 12h21
  2. Réponses: 2
    Dernier message: 01/06/2016, 14h07
  3. Flash qui plante tout le temps !
    Par ossmoz dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 05/04/2013, 19h42
  4. [Problème] Requête ping qui plante !
    Par magicbisous-nours dans le forum VB.NET
    Réponses: 1
    Dernier message: 14/12/2007, 17h04
  5. [Novice] Problème avec Eclipse 3.0.x qui plante
    Par esolarc dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 27/05/2005, 13h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo