Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 8 sur 8
  1. #1
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 266
    Points : 3 215
    Points
    3 215

    Par défaut Comparaison de tableaux

    Bonjour !

    En travaillant sur le sujet du défi 2012, j'ai rencontré une erreur de compilation que je ne m'explique pas très bien.

    Voici un exemple :

    Code :
    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
    program Exemple;
     
    {$IfDef VirtualPascal}
    {&PmType Vio}
    {$Else}
    {$IfnDef Ver70}{$AppType Console}{$EndIf}
    {$EndIf}
     
    type
      t1 = array[0..1] of integer;
      t2 = array[0..2] of t1;
     
    const
      c1: t1 = (2,3);
      c2: t1 = (4,0);
     
    var
      v: t2;
     
    begin
      v[0] := c1;
     
      if v[0] = c1 then { erreur 41 } 
        WriteLn('RAS');
    end.
    Comment se fait-il qu'on puisse attribuer la valeur, mais pas la tester ?
    L'Art est long et le Temps est court.

  2. #2
    Responsable Pascal

    Avatar de Alcatîz
    Homme Profil pro Jean-Luc Gofflot
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 099
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Luc Gofflot
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 6 099
    Points : 37 777
    Points
    37 777

    Par défaut

    Bonjour,

    En Pascal, la comparaison de deux tableaux ne peut se faire avec l'opérateur "=".

    Il y a diverses manières de contourner le problème, la seule limite étant l'imagination.
    Par exemple :
    Code :
    1
    2
    3
    Uses {...}, Strings;
     
    if StrLComp(pChar(@v[0]),pChar(@c1),SizeOf(t1)) = 0 then
    (tordu mais performant)

    Règles du forum
    Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
    Mes tutoriels et sources Pascal
    FAQ Assembleur

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  3. #3
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 266
    Points : 3 215
    Points
    3 215

    Par défaut

    Très instructif. Merci Alcatîz !
    L'Art est long et le Temps est court.

  4. #4
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 492
    Points : 14 441
    Points
    14 441

    Par défaut

    CompareMem() me semble plus indiqué
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  5. #5
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 266
    Points : 3 215
    Points
    3 215

    Par défaut

    Merci Paul pour la réponse. Cela fait une corde de plus à mon arc.

    Code :
      if SysUtils.CompareMem(@v[0], @c1, SizeOf(t1)) then
    L'Art est long et le Temps est court.

  6. #6
    Responsable Pascal

    Avatar de Alcatîz
    Homme Profil pro Jean-Luc Gofflot
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 099
    Détails du profil
    Informations personnelles :
    Nom : Homme Jean-Luc Gofflot
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : mars 2003
    Messages : 6 099
    Points : 37 777
    Points
    37 777

    Par défaut

    Le code Assembleur généré par les deux fonctions est pratiquement identique.

    P.S. Je n'arrive pas à obtenir l'output Assembleur avec l'éditeur natif de Free Pascal, comment fait-on ?
    Règles du forum
    Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
    Mes tutoriels et sources Pascal
    FAQ Assembleur

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]

  7. #7
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro Paul TOTH
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 492
    Détails du profil
    Informations personnelles :
    Nom : Homme Paul TOTH
    Âge : 45
    Localisation : Réunion

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 492
    Points : 14 441
    Points
    14 441

    Par défaut

    Citation Envoyé par Alcatîz Voir le message
    Le code Assembleur généré par les deux fonctions est pratiquement identique.

    P.S. Je n'arrive pas à obtenir l'output Assembleur avec l'éditeur natif de Free Pascal, comment fait-on ?
    sous Delphi 6, StrLComp utilise SCASB alors que CompareMem commence par un "REPE CMPSD" 32bits, c'est supposé être plus rapide

    et avec Delphi >= 2009 il vaut mieux utiliser des pointeurs que des PChar à mon avis

    je viens de regarder sous XE2, StrLComp en version PChar utilise des PWideChar, ce qui double la paramètre MaxLen ! ... quand au code CompareMem il est très surprenant, je ne suis pas assez calé en Assembleur pour avoir une idée objective sur ce code mais il me semble anormalement complexe.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  8. #8
    Rédacteur/Modérateur
    Avatar de Roland Chastain
    Homme Profil pro Roland Chastain
    Inscrit en
    décembre 2011
    Messages
    1 266
    Détails du profil
    Informations personnelles :
    Nom : Homme Roland Chastain
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 266
    Points : 3 215
    Points
    3 215

    Par défaut

    Citation Envoyé par Alcatîz Voir le message
    P.S. Je n'arrive pas à obtenir l'output Assembleur avec l'éditeur natif de Free Pascal, comment fait-on ?
    Je viens de trouver une manière de le faire avec la ligne de commande. Voici mon fichier .bat :

    Code :
    1
    2
    3
    4
    5
    6
    @echo off
    rem Compilation FreePascal
    set c="C:\FPC\bin\i386-win32\ppc386.exe"
    set f="factorielle.pas"
    %c% -a %f%
    pause
    Soit dit en passant, j'ai aussi trouvé comment enlever le dessin du bureau : il suffit de supprimer le fichier fp.ans.
    L'Art est long et le Temps est court.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •