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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 émérite Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    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 éclairé 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
    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
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 089
    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;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Expert confirmé

    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 : 35
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    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;
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  6. #6
    Membre éclairé 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
    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 ?

+ 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