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 :

Boucle for dans un record


Sujet :

Langage Pascal

  1. #1
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut Boucle for dans un record
    Bonjour,
    je voulais savoir si il était possible de parcourir un record avec une boucle for. En gros, j'ai un type Tressources qui contient des pointeurs vers des images et pour savoir si elle sont bien toutes chargées, j'aimerais utiliser quelque chose dans ce style.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for i in Pimage do
    begin
      if (Pimage.i = nil) then
        {erreur}
    end;
    Ce serait beaucoup plus simple que de mettre une succession de if et de else.

    Merci.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Qia,

    Ce que tu veux faire est impossible, c'est sans doute le moment de penser à faire un tableau.
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par droggo Voir le message
    Qia,

    Ce que tu veux faire est impossible, c'est sans doute le moment de penser à faire un tableau.
    impossible n'est pas Pascal

    prenons un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type
      TMonRecord = record
        Image1: TImage;
        Image2: TImage;
        Image3: TImage;
      end;
    ce record est équivalent (en mémoire) a un array[0..2] of TImage qu'on peut donc parcourir sans problème...même sans transtyper

    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
     
    type
      PImage = ^TImage;
     
    function TestImages(Image: PImage; Count: Integer): Boolean;
    begin
      Result := True;
      while Count > 0 do
      begin
       if Image^ = nil then // l'image pointée est-elle vide ?
       begin
        Result := False;
        Exit;
       end;
       Dec(Count);   
       Inc(Image); // passer au pointeur suivant
     end;
    end;
     
    begin
      TestImages(@R1.Image1, 3);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 463
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 463
    Points : 4 305
    Points
    4 305
    Par défaut
    Même si ca marche (ce que je ne remets pas en question), ce n'est à mon avis pas la meilleure chose à faire et à montrer à des gens qui étudient le Pascal. Sans vouloir vexer personne, ce genre de code ressemble pour moi plus à du bricolage qu'à de la programmation. De plus ce genre de code généralement plus difficile à maintenir à la longue.

    Je pencherai aussi pour un pointeur sur un tableau.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    dans mon cas, j'ai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      Tsprite = record
        background : Psdl_surface;
        perso      : Psdl_surface;
        ...
      end;
    et si j'ai bien compris, ce serait plus simple de faire un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      Tsprite = array[1..x] of Psdl_surface
    et puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      sprite : Tsprite;
    begin
      for i := 1 to x do
      begin
        if sprite[i] = nil then
        begin
          result := false;
          exit;
        end;
      end;
      result := true; //tout c'est bien passé
    end;
    le seul truc qui me chiffon c'est de devoir utiliser un interger (ici i ) alors que j'aimerai bien utiliser des noms complets comme dans le record si dessus

    merci

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Bue,
    Citation Envoyé par wormful_sickfoot Voir le message
    Même si ca marche (ce que je ne remets pas en question), ce n'est à mon avis pas la meilleure chose à faire et à montrer à des gens qui étudient le Pascal. Sans vouloir vexer personne, ce genre de code ressemble pour moi plus à du bricolage qu'à de la programmation. De plus ce genre de code généralement plus difficile à maintenir à la longue.

    Je pencherai aussi pour un pointeur sur un tableau.
    +1

    C'est sûr qu'avec ce genre de code, on peut dire que "impossible n'est pas Pascal", mais j'exclus systématiquement ce type d'acrobaties, ne serait-ce qu'en pensant aux éventuels repreneurs du code.
    Si les cons volaient, il ferait nuit à midi.

  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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par titeeee Voir le message
    le seul truc qui me chiffon c'est de devoir utiliser un interger (ici i ) alors que j'aimerai bien utiliser des noms complets comme dans le record si dessus

    merci
    pour le meilleur des deux mondes
    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
     
    type
      TSpriteName = (background, perso);
      TSprite = array[TSpriteName] of Psdl_Surface;
     
    var
      sprite : Tsprite;
      i        : TSpriteName;
    begin
      for i := Low(TSpriteName) to High(TSpriteName) do
      begin
        if sprite[i] = nil then
        begin
          result := false;
          exit;
        end;
      end;
      result := true; //tout c'est bien passé
    end;
     
    begin
      Sprite[background] := ...
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par droggo Voir le message
    Bue,

    +1

    C'est sûr qu'avec ce genre de code, on peut dire que "impossible n'est pas Pascal", mais j'exclus systématiquement ce type d'acrobaties, ne serait-ce qu'en pensant aux éventuels repreneurs du code.
    je ne dis pas le contraire, mais on est parfois face à un code qu'on a pas le loisir de modifier, et il devient nécessaire d'avoir recours à des choses pas catholiques

    c'est le cas par exemple quand on veux invoquer une méthode héritée en sautant l'ancètre direct...comme avec l'objet TPath de Delphi XE2
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Zoi,

    Peut-être, mais ce n'est pas une raison pour pour coder le cas présent comme tu le proposes, des solutions propres gèrent parfaitement la situation, donc.

    Si un élève me rendait une telle solution, c'est le zéro assuré, agrémenté d'un commentaire genre "Je regrette de ne pouvoir mettre une note négative" [si, si, j'ai déjà fait ça ].

    Franchement, pour imaginer ce genre de code alors qu'on résout le problème "proprement", je n'aimerais pas devoir reprendre tes sources.
    Si les cons volaient, il ferait nuit à midi.

  10. #10
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par droggo Voir le message
    Zoi,

    Peut-être, mais ce n'est pas une raison pour pour coder le cas présent comme tu le proposes, des solutions propres gèrent parfaitement la situation, donc.

    Si un élève me rendait une telle solution, c'est le zéro assuré, agrémenté d'un commentaire genre "Je regrette de ne pouvoir mettre une note négative" [si, si, j'ai déjà fait ça ].

    Franchement, pour imaginer ce genre de code alors qu'on résout le problème "proprement", je n'aimerais pas devoir reprendre tes sources.
    ça me rappelle le baromètre de Bohr

    La question de titeee était de pouvoir "parcourir un record avec une boucle for", et non "comment déclarer ma structure pour pouvoir la parcourir dans une boucle". De plus, sans ta réponse initiale je lui aurais demandé qu'elle état son problème pour lui proposer une solution, ce que je fais un peu plus bas avec une solution qui répond à son problème : "j'aimerai bien utiliser des noms complets comme dans le record si dessus".

    En conclusion je dirais qu'il ne sert à rien d'avoir un code propre si on ne comprend pas ce que l'on fait.

    Pour la petite histoire, il y a 20 ans de cela alors que j'étais en cours de Pascal à l'université, le prof nous demandait un algo qui transformait la chaîne "1234" en "4321" (ou quelque chose du genre). Sa réponse passait par le traitement de chaîne de caractère. Moi j'ai de suite pensé à le faire en numérique en multipliant par 10 à chaque itération...ben ça ne l'a pas convaincu
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Dia,

    Ça ne l'a pas convaincu parce que ta solution n'était pas générale., ne prenant en compte que les entiers positifs.

    Mais bon, la question aurait dû être mieux posée.

    Et rappel, les idées des débutants pour leur programme ne doit pas fixer le fait de faire du source tarabiscoté, mais doit conduire à leur donner une meilleure solution, sinon ça va carrément à contre-courant d'un apprentissage correct.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    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 430
    Points
    28 430
    Par défaut
    Citation Envoyé par droggo Voir le message
    Dia,

    Ça ne l'a pas convaincu parce que ta solution n'était pas générale., ne prenant en compte que les entiers positifs.

    Mais bon, la question aurait dû être mieux posée.

    Et rappel, les idées des débutants pour leur programme ne doit pas fixer le fait de faire du source tarabiscoté, mais doit conduire à leur donner une meilleure solution, sinon ça va carrément à contre-courant d'un apprentissage correct.
    je pense que l'apprentissage correct se fait en comprenant ce que l'on fait, le choix de la meilleur solution s'impose alors de lui même.

    je vois très souvent des tutos sur telle ou telle technologie qui en énonce les principes sans jamais expliquer à quoi ça peu bien servir ! c'est pourtant ça qui est important.

    j'aime bien en fait ma réponse à titeee, elle est instructive, on y apprend (ou pas) qu'un record comprenant des images est en tout point identique à un tableau d'images. On y apprend comment manipuler un pointeur sur un tableau variable. Technique qu'on pourra réutiliser pour traiter une portion du tableau au besoin. C'est une réponse plus riche à mon sens qu'un "Ce que tu veux faire est impossible"

    c'est avec ces idées en tête que j'ai écris "Delphi 7 Studio" qui a été très bien accueilli au passage
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Kue,

    Bof ...

    Je n'y ai rien appris du tout (je parle de ta fameuse réponse), et je persiste à penser que ce n'est pas le genre de code à donner à un débutant.
    Ces "astuces" peuvent facilement être acquises et/ou inventées quand on commence à maîtriser, mais généralement perturbent beaucoup les débutants.

    Remets-toi dans ce cas : tu es débutant, et essaye d'imaginer comment tu aurais réagi devant un tel code.
    Je sais, tu vas dire "j'aurais appris ...", mais ça, c'est parce que tu ne vois que de ton point de vue actuel.

    Bien, je vais briser là, sinon on y sera encore après 2 ou 3 éternités.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    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 430
    Points
    28 430
    Par défaut
    je suppose que tu savais déjà ce qui est dit dans ma réponse mais justement un débutant ne le sait pas, il n'a pas d'à priori, il fait des choix parfois inadapté et c'est toujours parce qu'il ne sait pas ce qu'il fait.

    j'enrage à chaque fois que j'ai un problème sur Linux et que je ne trouve dans les HOWTO que des lignes de commande à passer, des paramètres à changer et à croiser les doigts pour que ça fonctionne sans aucune explication du pourquoi !

    en tant que débutant j'aurais pris ma seconde réponse qui correspond plus à mon attente et j'aurais mis de côté les pointeurs en me disant que c'est bien compliqué pour parcourir un bête record, pourquoi donc n'a-t-on pas un for i in Record comme on peut le faire en Javascript (ce qui est une bêtise puisque Javascript n'a pas de Record mais des objets).

    c'était d'ailleurs ma première réaction quand Turbo Pascal 5.5 a introduit l'objet dans le langage Pascal...j'ai voulu m'y mettre et j'ai trouvé cela compliqué et que ça n'apportait rien à mes programmes. Je me suis forcé à créer des objets qui se sont avérés être des singletons avec des méthodes statiques, rien de bien intéressant, une simple unité remplaçait cela très bien. Même le polymorphisme pouvait être obtenu par l'ordre des unités dans le USES...et un jour, j'ai regardé un problème sous un autre angle, j'ai découvert que l'objet était une réponse efficace à une problématique, j'ai compris à quoi ça servait. Ce n'est pas pour autant que je fais du 100% objet, bien au contraire, je continue à utiliser des unités en lieu et place de singleton quand je n'ai pas besoin de plus. Je crée des bibliothèques de fonctions qui ne sont pas des méthodes de classe utilitaires car ça ne sert à rien d'en faire un objet !

    Bref, pour moi la connaissance s'acquiert par la compréhension et non par le conformisme. Les explications sont donc indispensables. C'est quand on est débutant qu'il faut expérimenter des choses tordues, pour les comprendre et comprendre pourquoi ce n'est pas comme ça qu'on travaille le plus efficacement.

    Mais bon les enseignants n'aiment généralement pas les électrons libre ils sont là pour transmettre un savoir issu d'une longue expérience et non pour faire trébucher les débutants sur les pavés de la connaissance.

    Montaigne ne disait-il pas "enseigner, ce n'est pas remplir un vase, c'est allumer un feu" ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 939
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 939
    Points : 5 648
    Points
    5 648
    Par défaut
    Xoe,

    Oui, mais l'expérience m'a appris que la plupart des acrobaties dans le code sont dues à l'inadéquation de la structure des données.
    Donc, donner une piste qui conduit au changement de cette structure est une bonne réponse didactique, qui oriente vers une solution - changer la structure des données - qu'il faut toujours envisager quand on commence à patauger un peu avec le code, ça s'avère habituellement payant, même si ça oblige parfois - souvent ! - à reprendre une partie de code déjà écrite.
    Si les cons volaient, il ferait nuit à midi.

Discussions similaires

  1. boucle "for" dans "do while"
    Par oranoutan dans le forum C#
    Réponses: 13
    Dernier message: 05/06/2007, 22h13
  2. Une boucle for dans un switch case?
    Par Death83 dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 15h05
  3. Boucle For dans un TDBGrid
    Par Latipolia dans le forum C++Builder
    Réponses: 28
    Dernier message: 14/06/2005, 13h12
  4. boucle for dans un if...
    Par SylverFox dans le forum Débuter
    Réponses: 3
    Dernier message: 11/08/2004, 17h57
  5. Boucle for dans un script cmd
    Par nicolas.ganache dans le forum Développement
    Réponses: 4
    Dernier message: 19/07/2004, 17h07

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