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

Free Pascal Discussion :

Adaptation en Pascal du programme UCI Filter


Sujet :

Free Pascal

  1. #21
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    J'ai fait la correction partout mais le programme ne fonctionne toujours pas correctement. Merci quand même d'avoir attiré mon attention sur point.

    Par contre tout à l'heure je me suis trompé, quand j'ai parlé de la procédure qui ne se terminait pas. En fait elle se termine mais ça n'apparaissait pas dans le fichier.

    Donc les deux programmes semblent se comporter de la même façon... sauf que le deuxième n'affiche rien.

  2. #22
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Je sais pas si c'est bon mais

    voici le log que j'obtiens sous W10 avec ton code ucifilterpas-201810311241-dev

    31/10/2018 18:53:48 471 -> main()
    31/10/2018 18:53:48 095 -> HandleDurchPipeErsetzen()
    31/10/2018 18:53:48 120 <- HandleDurchPipeErsetzen()
    31/10/2018 18:53:48 095 -> HandleDurchPipeErsetzen()
    31/10/2018 18:53:48 120 <- HandleDurchPipeErsetzen()
    31/10/2018 18:53:48 134 -> EngineStarten()
    31/10/2018 18:53:48 151 argv[1]=uralochka\Uralochka11d.exe Kommandozeile=uralochka\Uralochka11d.exe DirDrive=uralochka\
    31/10/2018 18:53:48 168 <- EngineStarten()
    31/10/2018 18:53:48 457 -> EngineNachGuiThreadStarten()
    31/10/2018 18:53:48 462 <- EngineNachGuiThreadStarten()
    31/10/2018 18:53:48 263 -> GuiNachEngine()
    31/10/2018 18:53:48 387 -> EngineNachGui()
    31/10/2018 18:53:51 369 -> WriteOption()
    31/10/2018 18:53:51 374 <- WriteOption()
    31/10/2018 18:53:51 369 -> WriteOption()
    31/10/2018 18:53:51 374 <- WriteOption()
    31/10/2018 18:53:51 369 -> WriteOption()
    31/10/2018 18:53:51 374 <- WriteOption()
    31/10/2018 18:53:51 369 -> WriteOption()
    31/10/2018 18:53:51 374 <- WriteOption()
    31/10/2018 18:53:51 369 -> WriteOption()
    31/10/2018 18:53:51 374 <- WriteOption()
    31/10/2018 18:53:54 405 <- EngineNachGui()
    31/10/2018 18:53:54 355 <- GuiNachEngine()
    31/10/2018 18:53:54 492 <- main()
    • "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

  3. #23
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 477
    Par défaut
    salut


    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
        if (!WriteFile(pFilter->hNachEngine, str, len + 1, &AnzGeschrieben, NULL) || AnzGeschrieben != len + 1) FatalerFehler("Schreibfehler", pFilter->hEngine);
        FlushFileBuffers(pFilter->hNachEngine);
        if (strcmp(Kommando, "quit") == 0)
        {
          if (WaitForSingleObject(pFilter->hEngine, pFilter->ValueQuit) != WAIT_OBJECT_0)
          {
            TerminateProcess(pFilter->hEngine, 0);
          }
          WaitForSingleObject(pFilter->hThread, 300);
          
          sprintf(gBuffer, "%d %s", __LINE__, "<- GuiNachEngine()");
          ToLog(gBuffer);
          
          return;
        }
      }
        sprintf(gBuffer, "%d %s", __LINE__, "<- GuiNachEngine()");
      ToLog(gBuffer);
    ta traduction en pascal

    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
        if StrComp(Kommando, 'quit') = 0 then
        begin
          pFilter.bQuit := TRUE;
          newline := #10;
          WriteFile(pFilter.hEngineNachFilter, {#10}newline, 1, AnzGeschrieben, nil);
          FlushFileBuffers(pFilter.hEngineNachFilter);
        end;
     
        str_[len] := #10;
        if (not WriteFile(pFilter.hNachEngine, str_, len + 1, AnzGeschrieben, nil))
        or (AnzGeschrieben <> len + 1) then
          FatalerFehler('Schreibfehler', pFilter.hEngine );
     
        FlushFileBuffers( pFilter.hNachEngine );
     
        if StrComp(Kommando, 'quit') = 0 then
        begin
          if WaitForSingleObject(pFilter.hEngine, pFilter.ValueQuit) <> WAIT_OBJECT_0 then
            TerminateProcess(pFilter.hEngine, 0);
          WaitForSingleObject(pFilter.hThread, 300);
          exit;
        end;
      end;
     TLog.Append(Format('%0.3d %s', [StrToInt({$I %LINE%}), '<- GuiNachEngine()']));
    end;
    tu n'aurais pas oublié un Tlog ... en rouge dans la version C

  4. #24
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Merci pour votre contribution.

    J'ai l'impression que mes fichiers log ne sont pas fiables, qu'il y a des valeurs qui sont écrasées. C'est logique en même temps puisqu'il y a un seul fichier pour deux activités parallèles. Je crois que pour ne pas me casser la tête, je vais faire un fichier log pour chaque thread.

    @anapurna
    Merci pour la correction.

  5. #25
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Je suis sur la piste de l'erreur. Donc, il apparaît qu'à un moment donné, la fonction ReadFile ne renvoie pas le nombre attendus d'octets lus dans la variable AnzGelesen.

    Citation Envoyé par pascal.log
    02/11/2018 00:31:56 393 -> EngineNachGui()
    02/11/2018 00:31:56 169 -> StringLesen(10000, 0, 0)
    02/11/2018 00:32:18 231 AnzGelesen=1 FonctionAppelante=1
    C'est sûr qu'avec un caractère on va pas aller loin !

    La valeur correcte :

    Citation Envoyé par c.log
    02/11/2018 00:27:41 405 -> EngineNachGui()
    02/11/2018 00:27:41 182 -> StringLesen(10000, 0, 0)
    02/11/2018 00:27:45 239 AnzGelesen=25 FonctionAppelante=1
    Cela se passe dans le corps de la procédure StringLesen, lorsque l'appel de cette procédure provient de EngineNachGUI.

    Voilà, si vous avez des idées, je suis preneur. Le code source des deux programmes est .

    La procédure de test consiste, une fois que vous avez compilé l'un des deux programmes, à double-cliquer sur demo.cmd, qui va lancer le programme en lui passant le chemin d'un moteur de jeu d'échecs. Une fois la console ouverte, tapez "uci". Si vous avez compilé à partir du C, le moteur vous répond en donnant son nom et ses options. Si vous avez compilé à partir du Pascal, il ne se passe rien. Ensuite, tapez "quit".

    Je compile le C avec MinGW-GCC.

  6. #26
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 477
    Par défaut
    Salut

    L'écriture de cette ligne ne me paraît pas très classique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     if not ReadFile(pLP^.hDatei, (pLP^.pPuffer + pLP^.AnzInhalt)^, pLP^.Groesse - pLP^.AnzInhalt, AnzGelesen, nil) then
          FatalerFehler('Lesefehler', hEngine);
    Le principe est qu'à chaque boucle on incrémente le buffer de la taille pLP^.AnzInhalt en reduisant la taille totale à lire de la même valeur.
    Vive le C

    Je verrais plus un truc du genre :
    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
     
    var 
       Buffer:Pointer;
       Bufsize:integer;
       AnzGelesen: DWORD;
    begin
       ....
       Bufsize:=pLP^.Groesse - pLP^.AnzInhalt;
       GetMem(buffer,BufSize);
       try
         ReadFile(Src, Buffer^, Bufsize, AnzGelesen, nil);
         pLP^.pPuffer^ := pLP^.pPuffer^ +Buffer^;
         pLP^.Groesse := pLP^.Groesse - pLP^.AnzInhalt;
         ....
      ecxept
      end;
    Pas sûr que ce code fonctionne mais l'esprit est là.

  7. #27
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    @anapurna

    Merci pour ton aide. Je me suis fait la même remarque que toi, d'autant que j'ai lu ceci qui m'a intrigué :

    The ReadFile function reads data from a file, starting at the position indicated by the file pointer. After the read operation has been completed, the file pointer is adjusted by the number of bytes actually read, unless the file handle is created with the overlapped attribute. If the file handle is created for overlapped input and output (I/O), the application must adjust the position of the file pointer after the read operation.

  8. #28
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    J'ai essayé ça, mais ça n'a rien changé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      repeat
        SetFilePointer(pLP^.hDatei, 0, nil, FILE_BEGIN); // <---
     
        if not ReadFile(pLP^.hDatei, (pLP^.pPuffer + pLP^.AnzInhalt)^, pLP^.Groesse - pLP^.AnzInhalt, AnzGelesen, nil) then
          FatalerFehler('Lesefehler', hEngine);
    Soit dit en passant, quelle est la différence entre lecture synchrone et lecture asynchrone, dont il est question dans cet article ? Et le mode "overlapped", à quoi sert-il ?

  9. #29
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Une version corrigée de l'exemple proposé par bataff au début de la discussion. Ce qui manquait dans l'exemple, je crois, c'était l'allocation suffisante de mémoire.

    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
    { 0123456789 } // commentaire de 14 caractères
     
    uses
      Windows, SysUtils;
     
    var
      a: pansichar;
      h: THandle;
      n: DWORD;
      i: integer;
     
    begin
      a := StrAlloc(14 + 1);
      FillChar(a^, (14 + 1) * SizeOf(ansichar), #0);
     
      h := FileOpen({$I %FILE%}, fmOpenRead); // le fichier lu sera le fichier source du programme
     
      if h <> INVALID_HANDLE_VALUE then
      begin
        // lecture des 14 octets
        if ReadFile(h, a^, 14, n, nil) then 
          WriteLn('"', StrPas(a), '"');
     
        // effacement du tampon
        FillChar(a^, 14 * SizeOf(ansichar), '.');
        WriteLn('"', StrPas(a), '"');
     
        // lecture des 14 octets un par un
        SetFilePointer(h, 0, nil, FILE_BEGIN);
        Write('"');
        for i := 1 to 14 do
        begin
          if ReadFile(h, (a + Pred(i))^, 1, n, nil) then 
            Write((a + Pred(i))^);
        end;
        WriteLn('"');
      end;
    end.
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Atelier\C\chess\ucifilter\exemples>readfile2
    "{ 0123456789 }"
    ".............."
    "{ 0123456789 }"

    Si la syntaxe de la fonction ReadFile n'est pas en cause, je ne vois pas trop où chercher. Si vous avez des idées... Pourquoi la fonction lit-elle un seul octet au lieu d'en lire 25 ?

  10. #30
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 477
    Par défaut
    Salut

    Tu veux revenir à chaque fois au début du fichier ???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     SetFilePointer(pLP^.hDatei, 0, nil, FILE_BEGIN); // <---
    Je ne vois pas bien l’intérêt, avant la boucle repeat je comprends mais après c'est incompréhensible.

    Le readfile remplit un buffer d'une taille voulue et ensuite il te renvoie le nombre de bits lus.
    Je le répéte, en Pascal je ne suis vraiment pas certain de ce genre de construction.

    Je ne vois pas comment il peut affecter une composition du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReadFile(pLP^.hDatei, (pLP^.pPuffer + pLP^.AnzInhalt)^, pLP^.Groesse - pLP^.AnzInhalt, AnzGelesen, nil)
    Dans l'autre exemple c'est un coup de pot ^^ tu ne lis qu'un octet à la fois, essaie plutôt ceci et dis-moi ce que cela renvoie... J'y crois pas trop :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
       for i := 1 to 14 do
        begin
          if ReadFile(h, (a + Pred(i))^, 1, n, nil) then 
            WriteLn(a^);   
        end;
     
        WriteLn('"');

  11. #31
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    @anapurna

    Merci pour ton aide. Deux octets à la fois, ça marche aussi. Avec a^ non, avec StrPas(a) oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        for i := 1 to 7 do
        begin
          if ReadFile(h, (a + 2 * Pred(i))^, 2, n, nil) then 
            WriteLn(StrPas(a));
        end;
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    C:\Atelier\C\chess\ucifilter\exemples>readfile2
    { ............
    { 01..........
    { 0123........
    { 012345......
    { 01234567....
    { 0123456789..
    { 0123456789 }

    Pour SetFilePointer, tu as raison. C'était un truc vite fait pour essayer, parce que je ne sais plus quoi essayer.

  12. #32
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    J'ai dédoublé les fichiers log, pour que chaque thread ait le sien.

    On voit que dans le sens "GUI vers moteur" (thread principal), la procédure StringLesen fonctionne normalement.

    Citation Envoyé par ucifilter.log
    02/11/2018 21:33:50 285 -> GuiNachEngine()
    02/11/2018 21:33:50 171 -> StringLesen(10000, 0, 0)
    02/11/2018 21:33:58 244 AnzGelesen=5
    02/11/2018 21:33:58 273 <- StringLesen()
    02/11/2018 21:33:58 171 -> StringLesen(10000, 5, 5)
    02/11/2018 21:34:01 244 AnzGelesen=6
    02/11/2018 21:34:01 273 <- StringLesen()
    C'est dans l'autre sens que ça ne va pas.

    Citation Envoyé par ucifilter.extra.log
    02/11/2018 21:33:50 403 -> EngineNachGui()
    02/11/2018 21:33:50 171 -> StringLesen(10000, 0, 0)
    02/11/2018 21:34:01 244 AnzGelesen=1
    02/11/2018 21:34:01 273 <- StringLesen()
    02/11/2018 21:34:01 429 <- EngineNachGui()
    On peut en déduire que le problème n'est pas dans la fonction ReadFile.

    Je continue de chercher.

  13. #33
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 130
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 130
    Billets dans le blog
    9
    Par défaut
    Bonjour tout le monde !

    J'ai enfin (!) pu faire faire fonctionner mon programme. L'erreur était dans la façon d'appeler la fonction WriteFile. Le pire est que j'avais depuis le début un exemple d'Alcatîz qui montrait comment l'utiliser !

    D'autres petites erreurs ont été corrigées.

    Voici la version finale (?) du code. Voir le Makefile pour la façon d'essayer le programme.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [Python 2.X] Adapter ma GUI à mon programme
    Par Phoke dans le forum Tkinter
    Réponses: 4
    Dernier message: 24/07/2014, 12h44
  2. Créer de programme pour WIndows avec Turbo Pascal
    Par kaygee dans le forum Turbo Pascal
    Réponses: 16
    Dernier message: 20/08/2003, 23h22
  3. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22
  4. [LG]imprimante programme pascal
    Par jsaipas dans le forum Langage
    Réponses: 9
    Dernier message: 24/04/2003, 21h22

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