+ Répondre à la discussion
Affichage des résultats 1 à 15 sur 15
  1. #1
    Membre chevronné
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2009
    Messages : 332
    Points : 721
    Points
    721

    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 :
    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é Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    Par défaut

    Qia,

    Ce que tu veux faire est impossible, c'est sans doute le moment de penser à faire un tableau.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  3. #3
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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 :
    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 :
    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

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

    Informations forums :
    Inscription : avril 2002
    Messages : 2 349
    Points : 3 868
    Points
    3 868

    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 chevronné
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2009
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2009
    Messages : 332
    Points : 721
    Points
    721

    Par défaut

    dans mon cas, j'ai :


    Code :
    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 :
    1
    2
    type
      Tsprite = array[1..x] of Psdl_surface
    et puis
    Code :
    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é Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    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.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  7. #7
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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 :
    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  8. #8
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  9. #9
    Expert Confirmé Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    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.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  10. #10
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  11. #11
    Expert Confirmé Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    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.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  12. #12
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  13. #13
    Expert Confirmé Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    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.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

  14. #14
    Expert Confirmé Sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    5 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : novembre 2002
    Messages : 5 639
    Points : 16 170
    Points
    16 170

    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
    Produits : UPnP, RemoteOffice, FlashPascal
    Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%

  15. #15
    Expert Confirmé Sénior

    Inscrit en
    août 2006
    Messages
    3 580
    Détails du profil
    Informations forums :
    Inscription : août 2006
    Messages : 3 580
    Points : 4 626
    Points
    4 626

    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.
    Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •