Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Langage
Langage Vos questions sur langage Pascal en général, ses évolutions, les technologies, ...
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/01/2012, 18h48   #1
EpiTouille
Membre expérimenté
 
Avatar de EpiTouille
 
Homme Titouan Créac'h
Epitech
Inscription : mai 2009
Messages : 249
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Epitech

Informations forums :
Inscription : mai 2009
Messages : 249
Points : 527
Points : 527
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.
EpiTouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 20h27   #2
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 09h55   #3
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 10h34   #4
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h22   #5
EpiTouille
Membre expérimenté
 
Avatar de EpiTouille
 
Homme Titouan Créac'h
Epitech
Inscription : mai 2009
Messages : 249
Détails du profil
Informations personnelles :
Nom : Homme Titouan Créac'h
Âge : 19
Localisation : France

Informations professionnelles :
Activité : Epitech

Informations forums :
Inscription : mai 2009
Messages : 249
Points : 527
Points : 527
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
EpiTouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h01   #6
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 17h25   #7
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 17h30   #8
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 00h58   #9
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 06h05   #10
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 09h07   #11
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 14h50   #12
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 22h46   #13
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 05h48   #14
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 409
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 409
Points : 10 782
Points : 10 782
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%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/01/2012, 17h26   #15
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 414
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 414
Points : 3 769
Points : 3 769
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.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h03.


 
 
 
 
Partenaires

Hébergement Web