TRUCS ET ASTUCES


erreurs de compilation


(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