p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 700
    Points
    5 700
    Billets dans le blog
    1

    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 : 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
    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, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2003
    Messages : 6 503
    Points : 43 117
    Points
    43 117
    Billets dans le blog
    2

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 700
    Points
    5 700
    Billets dans le blog
    1

    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
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 086
    Points : 17 861
    Points
    17 861

    Par défaut

    CompareMem() me semble plus indiqué
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 700
    Points
    5 700
    Billets dans le blog
    1

    Par défaut

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if SysUtils.CompareMem(@v[0], @c1, SizeOf(t1)) then
    L'Art est long et le Temps est court.

  6. #6
    Responsable Pascal, Delphi et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    mars 2003
    Messages
    6 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

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

    Informations forums :
    Inscription : mars 2003
    Messages : 6 503
    Points : 43 117
    Points
    43 117
    Billets dans le blog
    2

    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
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 086
    Points : 17 861
    Points
    17 861

    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

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Inscrit en
    décembre 2011
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : décembre 2011
    Messages : 1 986
    Points : 5 700
    Points
    5 700
    Billets dans le blog
    1

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

Discussions similaires

  1. Comparaison de tableaux (PERL + MYSQL + CISCO)
    Par pat94 dans le forum Langage
    Réponses: 5
    Dernier message: 05/10/2007, 15h06
  2. comparaison deux tableaux
    Par bezoindaidde dans le forum Langage
    Réponses: 13
    Dernier message: 06/07/2007, 15h51
  3. Comparaisons de tableaux sur des feuilles différentes
    Par Olanor dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/07/2007, 07h32
  4. Comparaison de Tableaux
    Par Currahee dans le forum Général Algorithmique
    Réponses: 11
    Dernier message: 23/02/2007, 11h14
  5. [langage] Comparaison de tableaux
    Par WetzlarMan dans le forum Langage
    Réponses: 2
    Dernier message: 22/04/2004, 14h08

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