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 :

Remplacer un Int dans un For par un array of int : Possible ?


Sujet :

Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut Remplacer un Int dans un For par un array of int : Possible ?
    Bonjour

    Je me trouve à devoir imbriquer 12 boucles For et au final effectuer des opérations sur les items de 12 Tstringlist dont l index est la valeur de chacune de ces boucles...

    Exemple limité à 3...
    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
    for c1 := 0 to List[1].Count - 1 do
      begin
        for c2 := 0 to List[2].Count - 1 do
        begin
          for c3 := 0 to List[3].Count - 1 do
          begin
            inc(itemp);
     
            Grid.Cells[1, itemp] := List_Ligne[1][c1];
            procedure( List[1][c1]);
            Grid.Cells[2, itemp] := List_Ligne[2][c2];
            procedure(List[2][c2]);
            Grid.Cells[3, itemp] := List_Ligne[3][c3];
            procedure( List[3][c3]);
          end;
        end;
      end;
    mon idee etait donc de modifier cela avec une boucle comme suit :
    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
     
    var c:array [1..12] of integer;
    ...
    for c[1] := 0 to List[1].Count - 1 do
      begin
        for c[2] := 0 to List[2].Count - 1 do
        begin
          for c[3] := 0 to List[3].Count - 1 do
          begin
            for i:=1 to 3 do
            begin        
            Grid.Cells[i, itemp] := List_Ligne[i]c[i];
            procedure( List[i][c1]);
            end;
          end;
        end;
      end;
    mais j ai un beau message d erreur m indiquant que c est un integer et non un array of integer que je dois utiliser dans les boucles...

    donc ma question : y a t il un moyen de contourner cela ?

    merci de vos conseils

    stephane

  2. #2
    Membre éclairé Avatar de peter27x
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 029
    Par défaut
    ton code est faux d'entrée de jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for c[1] := 0 to List[1].Count - 1 do

    Une boucle for est censée utiliser une variable pour parcourir des valeurs (celles d'un array par exemple), par exemple si la variable s'appelle i on écrira :

    Effectivement i doit être de type integer;

    Mais là tu utilises un tableau (des indices d'un tablaux pour être précis) contenant des valeurs en guise de variable censée parcourir des valeurs.

    Je pense que tu dois revoir l'utilisation de la commende de boucle "FOR".

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par peter27x Voir le message
    ton code est faux d'entrée de jeu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for c[1] := 0 to List[1].Count - 1 do

    Une boucle for est censée utiliser une variable pour parcourir des valeurs (celles d'un array par exemple), par exemple si la variable s'appelle i on écrira :

    Effectivement i doit être de type integer;

    Mais là tu utilises un tableau (des indices d'un tablaux pour être précis) contenant des valeurs en guise de variable censée parcourir des valeurs.

    Je pense que tu dois revoir l'utilisation de la commende de boucle "FOR".
    le compilateur ne l'accepte pas, mais c[1] est bien un Integer

    il reste la possibilité d'utiliser des WHILE
    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
     
    var
      c: array[0..2] of Integer;
    begin
      FillChar(c, SizeOf(c), 0);
      while c[1] < 3 do
      begin
        while c[2] < 10 do
        begin
          ShowMessage(IntToStr(c[1] * 10 + c[2]));
          Inc(c[2]);
        end;
        Inc(c[1]);
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 160
    Billets dans le blog
    9
    Par défaut
    Bien vu, Paul ! Simple, efficace, comme d'habitude (si je puis me permettre).

    L'exemple pour la procédure FillChar() est également utile en lui-même, mais ici ça ne convient pas, parce qu'il faut remettre les compteurs à zéro en cours de route.

    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
    26
    27
    28
    29
    program While1;
    {$APPTYPE CONSOLE}
     
    var
      c: array[0..2] of Integer;
     
    begin
      //FillChar(c, SizeOf(c), 0);
     
      c[0] := 0;
      while c[0] <= 1 do
      begin
        c[1] := 0;
        while c[1] <= 2 do
        begin
          c[2] := 0;
          while c[2] <= 3 do
          begin
            WriteLn(c[0], ' - ', c[1], ' - ', c[2]);
            Inc(c[2]);
          end;
          Inc(c[1]);
        end;
        Inc(c[0]);
      end;
     
      Write('Appuyez sur la touche Entr'#130'e...');
      ReadLn;
    end.
    Mais enfin, on avait compris l'idée.

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 929
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 929
    Par défaut
    Ça va si le nombre de listes est figé sinon avec une procédure récursive. Ici avec remplissage de la grille :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    procedure TForm1.Check;
    var
      Row     :TStringList;
      Current :integer;
     
      //---------------------------------------------
      procedure DoCheck(aCol :integer);
      var
        i :integer;
     
      begin
        if List[aCol].Count > 0 then
          for i := 0 to List[aCol].Count -1 do
          begin
            Row[aCol] := List[aCol][i];
     
            if aCol = High(List) then
            begin
              Grid.Rows[Current].Assign(Row);
              inc(Current);
            end
            else DoCheck(aCol +1);
          end
     
        else DoCheck(aCol +1);
      end;
      //---------------------------------------------
     
    begin
      Row := TStringList.Create;
     
      try
        Row.Text := StringOfChar(#13, Length(List));
        Current  := 0;
     
        DoCheck(0);
      finally
        Row.Free;
      end;
    end;

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 549
    Par défaut
    merci pour ces reponses

    Je ne pense pas à utiliser While, à tort !

    Je vais m y mettre...

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

Discussions similaires

  1. [XL-2010] [VBA] Remplacer un caractére dans une formule par une variable (boucle for)
    Par surikhat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/06/2015, 19h12
  2. remplacer les symbole dans des urls par leur code
    Par GoldenEyes dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 15/06/2009, 17h16
  3. Réponses: 3
    Dernier message: 16/01/2008, 16h32
  4. remplacer a item dans un select par a autre
    Par koukoya dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/09/2006, 11h15
  5. remplacer des espaces dans un champ par des zero
    Par yeep dans le forum Access
    Réponses: 4
    Dernier message: 08/10/2004, 09h41

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