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

Langage Pascal Discussion :

Comparaison de tableaux


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    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 ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    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
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    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]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  3. #3
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Très instructif. Merci Alcatîz !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    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
    CompareMem() me semble plus indiqué
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    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
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 938
    Points : 59 417
    Points
    59 417
    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
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    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]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  7. #7
    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
    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
    Le Store Excute Store

  8. #8
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    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.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

+ 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 Algorithmes et structures de données
    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