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

Delphi Discussion :

Utiliser in avec un tableau non ouvert


Sujet :

Delphi

  1. #1
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut Utiliser in avec un tableau non ouvert
    Bonjour tout le monde.
    Voici un exemple de code qui fonctionne avec un tableau ouvert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      i : Integer;
    begin
      i := 0;
      if i in [ 0, 1, 2, 3 ] then
        ShowMessage( 'Ca marche!' );
    end;
    Je voudrais arriver à faire de même avec un tableau dynamique comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      i : Integer;
      Tab : array of Integer;
    begin
      SetLength( Tab, 3 );
      for i := 0 to Length( Tab ) - 1 do
        Tab[ i ] := i;
     
      i := 0;
      if i in Tab then
        ShowMessage( 'Ca marche!' );
    end;
    Mais j'obtiens ce message d'erreur :
    Opérateur non applicable à ce type d'opérande
    Y-a-t-il un moyen de le faire marcher ?
    Ou s'il n'y a pas de moyen, peut-on le faire sans avoir à faire une boucle sur chaque élément du tableau ?

    Merci.

    PS : le code ci dessus n'est qu'un code exemple.

  2. #2
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Salut!

    Citation Envoyé par WebPac
    Voici un exemple de code qui fonctionne avec un tableau ouvert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      i : Integer;
    begin
      i := 0;
      if i in [ 0, 1, 2, 3 ] then
        ShowMessage( 'Ca marche!' );
    end;
    Je crois ici qu'il ne s'agit pas d'un tableau mais d'un ensemble. L'opérateur IN est utilisé pour les ensembles et non pour les tableaux.

  3. #3
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Oui tu as sûrement raison, j'ai confondu car dans l'aide de Dephi, ils parlent de tableaux ouverts en paramètre de fonctions qui sont de la forme [ 1, 'Toto', True ] mais le in ne doit pas fonctionner avec les tableaux ouverts.

    Tant pis, je vais faire une boucle sur les éléments du tableau, j'espérais qu'il existait une solution plus simple et plus rapide, mais bon, ce n'est pas bloquant non plus.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 256
    Points
    25 256
    Par défaut
    J'arrive un peu tard, mais ce bout de code pourrait en intéresse plus d'un ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function InArray(Row: Integer; const A: array of Integer): Boolean;
    var
       ia: Integer;
    begin
       result := False;
       for ia := Low(A) to High(A) do
       begin
          if Row = A[ia] then
          begin
             Result := True;
             Exit;
          end;
       end;
    end;
    je n'ai pas retrouvé, l'autre fonction que j'avais faite, mais avec le code ci-dessus, je l'ai repondu, erreur possible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function PosInArray(Row: Integer; const A: array of Integer): Integer;
    begin
       for Result := Low(A) to High(A) do
          if Row = A[Result] then
             Exit;
     
       Result := Low(A)-1;
    end;

  5. #5
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Le second risque de ne pas fonctionner, à cause des optimisations sur le for. Il vaut mieux utiliser une boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function PosInArray(Row: Integer; const A: array of Integer): Integer;
    begin
      Result := Low(A);
      while Result <= High(A) do
        if Row = A[Result] then exit else inc(Result);
      Result := Low(A)-1;
    end;

  6. #6
    Membre confirmé Avatar de WebPac
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 947
    Points : 512
    Points
    512
    Par défaut
    Citation Envoyé par sjrd
    Le second risque de ne pas fonctionner, à cause des optimisations sur le for. Il vaut mieux utiliser une boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function PosInArray(Row: Integer; const A: array of Integer): Integer;
    begin
      Result := Low(A);
      while Result <= High(A) do
        if Row = A[Result] then exit else inc(Result);
      Result := Low(A)-1;
    end;
    Salut, j'ai déjà vu des codes qui utilisaient while et non for (code source des composants VCL par exemple) mais je n'ai jamais trouvé d'explications du pourquoi. Quelle est l'optimisation du for ?

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 290
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 290
    Points : 1 941
    Points
    1 941
    Par défaut
    Il me semble aussi qu'il y a une différence de performance en faveur du while.

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par WebPac
    Quelle est l'optimisation du for ?
    De remplacer la variable de contrôle par des registres du CPU. Du coup, en sortie de boucle, cette variable peut ne pas être initialisée.
    Citation Envoyé par Linkin
    Il me semble aussi qu'il y a une différence de performance en faveur du while.
    Normalement ça devrait être le contraire Ou alors c'est que t'as codé comme un bourrin dans ton for

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 586
    Points : 25 256
    Points
    25 256
    Par défaut
    @sjrd :
    Regarde la Méthode IndexOf d'une TStrings, et tu verras la même syntaxe, quand Result est utilisé pour parcourir un tableau et que l'on fait un Exit dans la boucle, le for renvoie la bonne valeur, ... il faut biensur, aussi affecté une valeur à result si il n'y a pas eu d'Exit ...

    @Linkin
    Ensuite le For, est plus rapide, car le Inc est mieux géré et que la borne haute n'est pas réévaluée à chaque intération, ...

    Si l'on n'utilise pas la valeur du compteur dans un for, l'optimisation est par exemple un for écrit 1 to 100, il est compilé 99 downto 0, car le test à zéro est une instruction moins longue à écrire en ASM.

    Dans le cas d'un Tableau, vu que la borne inférieur et supérieur sont calculés qu'au RunTime, le for est exécuté dans l'ordre demandé donc de Low() à High() ... par contre, si l'on déclare un tableau constante avec un type énuméré par exemple, il sera parcouru de High(Enum) downto Low(Enum)

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

Discussions similaires

  1. Envoyé de mail avec fichier excel non ouvert
    Par Soifranc dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 03/11/2011, 09h24
  2. Réponses: 1
    Dernier message: 18/02/2008, 12h55
  3. utiliser UNION avec un nombre de colonnes non égal
    Par swissmade dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 20/08/2007, 11h03
  4. Réponses: 5
    Dernier message: 29/03/2007, 00h08
  5. Réponses: 3
    Dernier message: 03/12/2006, 13h08

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