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 :

ShowMessage parfois non exécuté [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut ShowMessage parfois non exécuté
    Bonjour,

    J'utilise souvent ShowMessage pour vérifier vite fait un point de détail (comme beaucoup, je suppose).

    Et pour contrôler un passage de paramètres à une fonction,
    j'ai encore eu recours à ça, mais cette fois je tombe par terre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function une_fonction(var Buffer; Count: int64): int64;
    begin
      ShowMessage(IntToStr(Count));
      titi := @Buffer;
      toto := Count;
    Le ShowMessage ci-dessus n'est pas exécuté, ça se voit très bien en pas-à-pas et en exécution (pas de fenêtre affichée), or je sais que ma fonction est appelée, puisqu'elle plante un peu plus loin, et qu'en pas-à-pas ça commence à la ligne "titi"...

    Par ailleurs, l'appel à cette fonction est testé (dans une autre fonction) avec un... ShowMessage juste avant l'appel, et là c'est tout bon...

    Si quelqu'un pouvait me dire pourquoi et comment un truc aussi basique ne fonctionne pas ici, ça m'aiderait énormément (newbie sous Lazarus).

    Merci,

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Hello JP !

    Newbie aussi sous Lazarus ? Hi, Hi !

    Quelques surprises de temps à autres. Par exemple, dans l'EDI, je ne peux pas voir les variables "complexes" : pour aStream.Position, le debugger m'affiche 'error near Position' au lieu de la valeur quand je passe le curseur en exécution...

    Pour ton problème, pas d'idée, sinon en compliquant le code (au cas où) ; par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function une_fonction(var Buffer; Count: int64): int64;
    begin
      Inc(Count);
      ShowMessage(IntToStr(Count-1));
      Dec(Count);
      titi := @Buffer;
      toto := Count;
    Bonne continuation.
    Delphi 5 Pro - Delphi 11.3 Alexandria 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 émérite Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... or je sais que ma fonction est appelée, puisqu'elle plante un peu plus loin, et qu'en pas-à-pas ça commence à la ligne "titi"...
    Si elle plante un peu plus loin, et si elle ne commence pas au départ, je dirais que tu as un problème en amont et c'est pour cela que ton ShowMessage n'est pas affiché. Vérifie le code qui se situe avant l'appel à cette fonction.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonsoir, Patrick
    Citation Envoyé par DOLPat® Voir le message
    Si elle plante un peu plus loin, et si elle ne commence pas au départ, je dirais que tu as un problème en amont et c'est pour cela que ton ShowMessage n'est pas affiché. Vérifie le code qui se situe avant l'appel à cette fonction.
    Mmh mmh, on dirait que je me suis mal exprimé ; l'appel à cette fonction est ainsi fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    code...
    ShowMessage(IntToStr(le_param_suspect));
    une_var_type_int64 := une_fonction(un_param, le_param_suspect);
    code...
    Donc, avant le ShowMessage qui ne s'exécute pas, il y a juste un ShowMessage qui s'exécute.

    Salut, Yves,
    Citation Envoyé par tourlourou Voir le message
    Pour ton problème, pas d'idée, sinon en compliquant le code (au cas où)
    Ben tu sais quoi ? Je trouve que c'est une très bonne idée, à laquelle je n'avais pas du tout pensé !
    Je testerai demain au taf...

    Bon, pour aller plus loin, le pourquoi de ces ShowMessage :
    la fonction plante car j'ai bien l'impression que mon int64 avant l'appel de la fonction est transformé en longint à l'entrée de la fonction.
    Comment je le sais ?
    D'abord, "le_param_suspect" est bien déclaré en tant que int64, ensuite, la valeur affichée par le ShowMessage vaut 22xxyyyzzz,
    soit plus qu'un longint (max 2147_et_quelques), et à l'entrée de la fonction
    (curieux, le fonctionnement de l'EDI : en pas-à-pas détaillé, la première ligne de débogage est la ligne d'entrée
    function une_fonction(var Buffer; Count: int64): int64; [jamais vu ça sous Delphi...])
    je lis -20abcdefgh en mettant la souris sur "Count"
    Bizarre, non ?
    Au plaisir de vous lire,

  5. #5
    Membre émérite Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Par défaut
    Bonjour

    Comme il est difficile de se prononcer sans le code source, l'idéal serait que tu nous donne le code appelant la fonction ainsi que la fonction elle-même.

    Je persiste à penser que le problème est en amont, avant l'appel de la fonction. Il est possible qu'une variable soit écrasée. Le fait que ton Count ait une valeur farfelue semble aller dans ce sens. Apparemment, tu travailles avec des pointeurs, c'est peut-être de ce côté qu'il faut regarder. On a vite fait d'écrire à un mauvais endroit de la mémoire si l'on fait une erreur sur un pointeur. Si c'est un emplacement non assigné, on aura une erreur d'exception, mais dans certains cas, l'exécution se poursuit et alors bonjour les surprises...

    En dernière possibilité, cela peut aussi être un bug Lazarus et dans ce cas, il serait bon (une fois certain que s'en est un) d'ouvrir un rapport de bug sur le bugtracker... (quelle version utilises-tu ?

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonjour,

    Alors, Yves, ton idée était sympathique mais le mode pas-à-pas (depuis la fonction appelante) me surligne la ligne "function...", puis la ligne "begin", puis saute directement à "Dec(Count)" en zappant les deux lignes qui précèdent. Mystère complet...

    Patrick, j'utilise la 0.9.30 avec FPC 2.4.2, SVN 29749.
    Quand au code, il fonctionne très bien avec des fichiers inférieurs à 2,147 Go, et je fais joujou avec zlib et les choses qui tournent autour, en l'occurence un fichier SciZipFile.pas (merci google) qui contient (fonction appelante)
    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
    function TZipFile.GetUncompressed(i: integer): string;
    const
      LENBUFF = 512;
    var
      Decompressor: TDecompressionStream;
      UncompressedStream: TStringStream;
      FlatFileStream: TStringStream;
      Aheader: string;
      //ReadBytes: integer; // et pour les fichiers > 2 Go ???
      ReadBytes: int64; // et pour les fichiers > 2 Go ???
      LoadedCrc32: DWORD;
      tmp: Array[0..LENBUFF] of AnsiChar;
    begin
      if (i < 0) or (i > High(Files)) then
        raise Exception.Create('Index out of range in function TZipFile.GetUncompressed.');
     
      if Files[i].CommonFileHeader.CompressedSize <> Files[i].CommonFileHeader.UncompressedSize then
      begin
        Aheader := chr(120) + chr(156); //manufacture a 2 byte header for zlib; 4 byte footer is not required.
        UncompressedStream := TStringStream.Create(Aheader + Files[i].CompressedData);
        try
          Decompressor := TDecompressionStream.Create(UncompressedStream);
          try
            SetLength(Result, Files[i].CommonFileHeader.UncompressedSize);
    showmessage('compress : ' + IntToStr(Files[i].CommonFileHeader.CompressedSize)
      + ' -- uncompress : ' + IntTostr(Files[i].CommonFileHeader.unCompressedSize));// OK ici
            ReadBytes := Decompressor.Read(PChar(Result)^,
              Files[i].CommonFileHeader.UncompressedSize);   // crash si > 2.2 Go !
            //if ReadBytes <> integer(Files[i].CommonFileHeader.UncompressedSize) then
            if ReadBytes <> int64(Files[i].CommonFileHeader.UncompressedSize) then
              Result := '';
          finally
            Decompressor.Free;
          end;
        finally
          UncompressedStream.Free;
        end;
      end
      else
      ...
    et la fonction appelée se trouve dans dzlib.pas,
    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
    //function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
    function TDecompressionStream.Read(var Buffer; Count: int64): int64;
    begin
      Inc(Count);
      ShowMessage(IntToStr(Count-1));
      Dec(Count);
      FZRec.next_out := @Buffer;
      FZRec.avail_out := Count;
      if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
      while (FZRec.avail_out > 0) do
      begin
        if FZRec.avail_in = 0 then
        begin
          FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
          if FZRec.avail_in = 0 then
            begin
              Result := Count - FZRec.avail_out;
              Exit;
            end;
          FZRec.next_in := @FBuffer;
          FStrmPos := FStrm.Position;
          Progress(Self);  // plante ici
        end;
        CCheck(inflate(FZRec, 0));
      end;
      Result := Count;
    end;
    Bien sûr il m'a fallu modifier par ci par là des integer en int64, mais ça ne doit pas être ça le souci, je pense.
    Enfin, pour essayer d'y voir clair, j'ai tenté ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            tmp64 := Files[i].CommonFileHeader.UncompressedSize;
    showmessage(inttostr(tmp64));
            ReadBytes := Decompressor.Read(PChar(Result)^, tmp64);   // crash si > 2.2 Go !
    mais ça ne change rien...

    Merci de votre soutien,
    Images attachées Images attachées  

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. instruction non exécutée
    Par illegalsene dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/05/2006, 14h42
  2. Non exécution d'une méthode repaint()
    Par Flophx dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 05/05/2006, 18h04
  3. [MySQL] Requête non exécutée
    Par harlock59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 03/05/2006, 15h42
  4. On error goto Err : goto non exécutée au 2ème appel
    Par charliejo dans le forum Access
    Réponses: 1
    Dernier message: 11/04/2006, 15h00
  5. INCLUDE non exécuté
    Par Sadneth dans le forum ASP
    Réponses: 3
    Dernier message: 07/09/2003, 00h44

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