Incompatibilité de l'instruction FORWARD avec l'inclusion de procédures dans une unité
Bonjour,
Je suis actuellement bloqué dans l'écriture d'un programme Turbo-Pascal, comportant l'enchaînement suivant de procédures :
P1 ---> P2 ---> P3 ---> Retour; FORWARD;
Il m'est impossible de transférer dans une unité appropriée P1 et P2, pourtant très volumineuses. Comment procéder ?
L'appel de P3 correspond à un cas rare mais non exclu interdisant la poursuite des calculs, et permet de revenir au début du programme en évitant son plantage. Le contenu de P3 pourrait évidemment se terminer par l'instruction <Halt>, ce qui arrêterait tout.
J'aimerais connaître les solutions, s'il en existe. Merci de m'indiquer des pistes.
TP: Incompatibilité de l'instruction FORWARD avec l'inclusion de procédures dans une unité.
Je vous remercie des remarques que vous avez exprimées.
Le programme principal, après l'initialisation du mode graphique et de quelques variables, se réduit à l'appel de la procédure <Choix>:
Code:
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
| VAR Depart: BOOLEAN;
PROCEDURE Choix(VAR Depart: BOOLEAN);
VAR Touche: CHAR; CodeT: LONGINT;
BEGIN
REPEAT
IF Depart THEN BEGIN
Depart:= False; Touche:= '1';
Menu; Ag; P0
END
ELSE Touche:= ReadKey;
CASE Touche OF #08: Menu; '0': P0;
'1': Pa; '2': Pb END { présentation simplifiée }
UNTIL Touche=#27;
Ag
END;
PROCEDURE Retour;
BEGIN
Menu; Choix(Depart)
END;
BEGIN
AppelModGraph(MdGr, ModeTexte); InitCentreRayon(Xcen, Ycen, Rayon);
Depart:= True; Choix(Depart); CloseGraph
END. |
Je cherche à sortir de l'impasse dans laquelle me conduit l'obligation de la référence en amont: si je met <P1> dans l'unité <U>, le compilateur exige d'y trouver <P2>, puis <P3>, puis <Retour> ... et là bien sûr, rien ne va plus. Y a-t-il un moyen d'éviter l'arrêt du programme au niveau de <P3> ?
Il y a quatre boucles imbriquées, dont 3 dans <P1> et une dans <P2>; l'appel de P3 correspond à la nécessité d'arrêter les calculs dans un cas très particulier.
Cette partie du programme inventorie les faces et les arêtes d'un polyèdre dont les (n) sommets sont situés sur une sphère; elle fonctionne correctement pour n<=100, mais le texte est assez long, malgré l'utilisation d'une huitaine d'unités.
TP / Incompatibilité de l'instruction FORWARD avec l'inclusion de procédures dans une unité.
Un grand merci à wormful_sickfoot et mick605 pour les informations données; l'instruction <break> m'avait totalement échappé; je pense qu'elle me permettra d'éviter l'appel de <FORWARD>, et ainsi de transférer 3 pages d'écran dans une unité.
Je donne le même nom à la variable et à l'argument lorsqu'il n'intervient par la suite qu'une instruction d'affectation; l'ambiguïté de la notation peut effectivement jouer de mauvais tours, si l'on s'avise par la suite de modifier le programme, et c'est sans doute une pratique à éviter.
La remarque de droggo, lue à l'instant, m'intrigue un peu: il faut bien un minimum de variables glogales, quoiqu'elles soient encombrantes, pour piloter le programme et contenir les résultats des calculs ... s'il y a de ce côté-là des astuces, je veux bien les connaître.
Le programme concerné (et actuellement en chantier) utilise les variables globales suivantes: - depart (BOOLEAN);
- Ns, Nf, Na (WORD): nombres de sommets, de faces et d'arêtes
- LstP, LstN: listes de N et 2N vecteurs 3d pour les positions des sommets et les normales aux faces;
- LstF: liste de 2N "faces" énumérant les sommets du polygone (8 WORD disponibles)
- LsrA: liste de 3N "arêtes" de type RECORD comportant 4 word (indices des sommets et des normales aux faces adjacentes) et 2 réels (longueur de l'arête et angle des 2 normales).
Ces tableaux sont, en raison de leur taille, définis dans une unité séparée. N (ici égal à 100) représente le nombre maximal de sommets, puisque l'on a
Nf <= 2*Ns - 4 < 2*N et Na <= 3*Ns - 6 < 3*N.
Cordiales salutations à tous les trois.
[Turbo Pascal] Incompatibilité de l'instruction FORWARD avec l'inclusion de procédures dans une unité
A Paul TOTH.
Bonjour, je reviens au forum après une absence.
Merci pour les indications de code apportées.
Pour répondre précisément à ton intervention:
1) Je cherchais le moyen de rassembler des procédures dans une unité, alors que les appels successifs devaient conduire, dans un cas particulier, à un retour en début de programme (voir mes deux premiers messages). On m'a apporté des informations, et l'échange a dérivé sur l'emploi des variables.
2) Je suppose que le recours au singleton apppartient à Delphi, que je ne pratique pas.
Le second exemple m'intrigue
Code:
1 2 3 4 5 6 7 8 9 10
| unit Application;
interface
var Running: Boolean;
function ExeName: string;
implementation
... |
car il autorise l'emploi d'une écriture
Code:
Application.ExeName
habituellement résevée aux enregistrements et aux objets. Où pourrais-je trouver des indications sur ce sujet ? J'utilise sans problème les enregistrements et les unités, mais pas les objets.
Cordialement,
Wiwaxia.
L'étude de la structure d'un polyèdre a pour donnée centrale la liste des arêtes, qui établit le lien entre deux couples de vecteurs, les 2 sommets concernés et les normales aux 2 faces adjacentes. Le programme devient vraiment très lourd dès qu'il s'agit d'énumérer les cycles (listes ordonnées des sommets consécutifs reliés par une arête à un sommet donné, ou des faces consécutives adjacentes à une face donnée). Ces deux problèmes relèvent du même algorithme, et le recours aux pointeurs serait peut-être pertinent (mais je les maîtrise mal).
Incompatibilité de l'instruction FORWARD avec l'inclusion de procédures dans une unité
Salut,
J'ai pris bonne note des remarques concernant les unités et les objets, d'autant plus que le programme sur lequel je travaille (en reprenant une ancienne version) s'allonge rapidement, et se prête à de nombreuses variantes.