(en delphi)
Ce chapitre a pour but de vous aider à comprendre les
différentes erreurs de compilation que Delphi annonce lors de la
compilation qui ne sont pas décrites dans l'aide en ligne (ou
mal). Chaque titre de paragraphe (en bleu) correspond au texte de
l'erreur que Delphi indique en bas de la fenêtre du code source.
En rouge correspondent les lignes impliquées dans l'erreur.
Le type (TYPE) nécessite une
finalisation - non autorisé dans type fichier. (par
Romain)
Cette erreur n'est pas expliquée dans l'aide. Voici un exemple
de code où elle surviendrait:
type
TPersonne
= record
Nom
: string;
Prenom
: string;
Age
: integer;
end;
procedure
SauverUnePersonne
(
NomDuFichier
: string; var
PersonneASauver
:
TPersonne
);
var Fichier: file of TPersonne;
begin
AssignFile
(
Fichier
,
NomDuFichier
);
Rewrite
(
Fichier
);
Writeln
(
Fichier
,
PersonneASauver
);
CloseFile
(
Fichier
);
end;
Explication:
Les string de Delphi 32 sont de 2 types: les chaines
longues et les chaines... courtes. La taille des
chaines courtes est définie par l'utilisateur dans le source le
programme, mais si cette taille est indéfinie, le string devient
une chaine longue. Le fait de ne pas définir la taille de ce
string provoque une erreur lors de sa sauvegarde dans un fichier
de type "file of string" (ou, comme dans notre
exemple, "file of record" si le record en
question contient une chaine longue), car le programme ne sait
pas où se termine la chaine (et peut déborder sur la
mémoire). Pour l'ouverture d'un fichier, c'est encore pire: on
déborde du fichier (théoriquement; mais Delphi empêche ce
débordement). Delphi génère un message d'erreur à la
compilation pour empêcher ce genre de problème.
Le fait de définir la taille du string pour le transformer en chaine courte crée une finalisation au string (ou au record si le string est contenu dans un enregistrement), d'où le texte du message d'erreur, qui indique une absence de cette finalisation.
Afin de définir cette finalisation, il faut mettre la taille du string entre crochets juste après le mot string. Un nom et un prénom ne contiennent rarement plus de 20 lettres, on va donc définir une taille de 20 caractères pour chaque string de l'enregistrement (record). Voici le programme corrigé:
type
TPersonne
= record
Nom
: string
[20]
;
Prenom
: string
[20]
;
Age
: integer;
end;
procedure
SauverUnePersonne
(
NomDuFichier
: string; var
PersonneASauver
:
TPersonne
);
var
Fichier
: file of
TPersonne
;
begin
AssignFile
(
Fichier
,
NomDuFichier
);
Rewrite
(
Fichier
);
Writeln
(
Fichier
,
PersonneASauver
);
CloseFile
(
Fichier
);
end;
Et voilà, ça marche!
Type de fichier non autorisé
ici. (par Romain)
Cette erreur n'est pas non plus expliquée dans l'aide. Voici
un exemple de code où elle surviendrait:
interface
procedure
Enregistrer(fic: textfile);
implementation
procedure Enregistrer(fic:
textfile);
begin
end;
explication:
Vous avez oublié de mettre var devant la déclaration de variable. En effet, de toute façon vous ne pouvez pas utiliser une variable de type fichier dans une procedure sans le var. Voici la correction:
interface
procedure
Enregistrer(var fic: textfile);
implementation
procedure Enregistrer(var fic: textfile);
begin
end;
Merci à Romain pour la réalisation de cette page