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 :

Un paramètre constant qui varie ? [Lazarus]


Sujet :

Lazarus Pascal

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut Un paramètre constant qui varie ?
    Bonjour,
    Un petit problème amusant dans une fonction : un paramètre entier change de valeur dans le code suivant...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function lyRead(id: PSQLite3_File; Data: PByteArray; Size: integer; Offset: int64): integer; cdecl;
    var
      SizeRead: integer;
    begin
      ShowMessage('Enter Read');
      Seek(id^.F_File, Offset);
      BlockRead(id^.F_File, Data, Size, SizeRead); // Size à lire = 100
      if SizeRead<>Size // SizeRead vaut 100, mais Size ne vaut plus 100 !!!  
      then raise Exception.Create('Size Read Error') // => le test me jette
      else Result:=SQLITE_OK;
    end;
    mais ceci se passe fort bien !?!?!?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function lyRead(id: PSQLite3_File; Data: PByteArray; Size: integer; Offset: int64): integer; cdecl;
    var
      SizeRead: integer;
      temp: integer;
    begin
      ShowMessage('Enter Read');
      Seek(id^.F_File, Offset);
      temp:=Size; // voici une variable
      BlockRead(id^.F_File, Data, Size, SizeRead);
      if SizeRead<>temp // bien constante !!!
      then raise Exception.Create('Size Read Error')
      else Result:=SQLITE_OK; // tout arrive...
    end;
    tout en notant que l'examen de la valeur de Size après le BlockRead vaut dans les 2 cas 1713399156, et que la définition de la fonction est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Procedure BlockRead(var f:File;var Buf;count:Longint;var Result:Longint);
    où le paramètre Count est passé par valeur...
    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 !

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Dans la mesure où le code ci-dessous fonctionne également, mais où le paramètre Size vaut lui aussi la valeur mystère après exécution (!) :
    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
    function lyRead(id: PSQLite3_File; Data: PByteArray; Size: integer; Offset: int64): integer; cdecl;
    var
      ReadSize, SizeRead, i: integer;
      P: PByte;
    begin
      ShowMessage('Enter Read');
      ReadSize:=Size;
      Seek(id^.F_File, Offset);
      BlockRead(id^.F_File, Data, ReadSize, SizeRead);
      if SizeRead=ReadSize
      then Result:=SQLITE_OK
      else begin
        if SizeRead>ReadSize
        then raise Exception.Create('Oversize Read Error')
        else begin
          Result:=SQLITE_IOERR_SHORT_READ;
          P:=@Data^[SizeRead];
          for i:=1 to ReadSize-SizeRead
          do begin
            P^:=0;
            Inc(P);
          end;
        end;
      end;
    end;
    Je suis allé revoir le prototype en C que j'ai traduit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int (*xRead)(sqlite3_file*, void*, int iAmt, sqlite3_int64 iOfst);
    et je ne vois pas d'erreur...
    le fait d'ajouter const devant Size ne change rien (ça m'aurait étonné).

    [EDIT] L'ordre des paramètres n'est pas en cause : ils arrivent bien dans l'ordre attendu...
    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
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    et ça fait quoi si tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ...
    {$IFDEF WIN32}
      AllocConsole;
    {$ENDIF}
      WriteLn('ReadSize = ', ReadSize);
      BlockRead(id^.F_File, Data, ReadSize, SizeRead);
      WriteLn('ReadSize = ', ReadSize);
    ...
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      ReadSize:=Size;
      AllocConsole;
      WriteLn('ReadSize = ', IntToStr(ReadSize)); // 100
      WriteLn('Size = ', IntToStr(Size)); // 100
      Seek(id^.F_File, Offset);
      BlockRead(id^.F_File, Data, ReadSize, SizeRead); 
      WriteLn('ReadSize = ', IntToStr(ReadSize)); // 100 
      WriteLn('Size = ', IntToStr(Size)); // 1713399156 !!!
    C'est choquant !
    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 !

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ce doit être un bug d'optimisation je suppose, essai de la désactiver {$O-}

    NB: WriteLn sait écrire des entiers, le IntToStr n'est pas nécessaire.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Effectivement, le comportement redevient plus sain en désoptimisant !
    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 !

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

Discussions similaires

  1. transtypage dans un type qui varie
    Par Braillane dans le forum C#
    Réponses: 5
    Dernier message: 26/09/2007, 17h08
  2. [Div] Hauteur qui varie avec firefox
    Par manaboko dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 19/02/2007, 09h10
  3. Taille d'une cellule qui varie selon la taille d'un mot
    Par shadeoner dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 10/08/2006, 21h42
  4. [Dates] Problème avec date (heure qui varie)
    Par Death83 dans le forum Langage
    Réponses: 10
    Dernier message: 05/08/2006, 02h19
  5. graphique qui varie en fonction d'une combo box
    Par decour dans le forum Access
    Réponses: 2
    Dernier message: 13/10/2005, 13h52

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