Proobleme ac Pascal !

Fermé
GKA Messages postés 341 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 3 août 2012 - 1 févr. 2009 à 10:35
GKA Messages postés 341 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 3 août 2012 - 3 févr. 2009 à 18:59
Bonjours les développeurs, j'ai un p'tit programme ecrit en Pascal (mon devoir de TP) qui se plante, alors y a t il qq un qui peut trouver la bogue ? Voici la source:

program tp2;
uses wincrt;
Type
hab = record
nom : string [15];
nbh : longint ;
end;

fhab = file of hab ;

Tab = Array [1..100] of String;

VAR
T:Tab;
e: hab;
f: text;
fh: fhab;
n:integer;


Procedure TransfertF_T (var F:text ; var T: Tab ; var n: integer );
var
i: integer;
ch: string;
Begin
Reset(F);
i:=1;
While not eof(F) Do
begin
Read (F,ch);
T[i] := ch;

i := i + 1;
end;
n := i;
End;
{______________________________________________}
Procedure TransfertT_F (T:Tab;n:integer;var Fh: Fhab);
Var
i: integer;
e: hab;
Begin
Reset(Fh);
For i:= 1 to n do
Begin
Read(Fh,e);
e.nom := T[i];
Seek(Fh,(Filepos(Fh)-1));
Write(Fh,e);
End;
End;
{______________________________________________}
Procedure Decalage (var T: tab ; i: integer ; var p:integer; pas: integer; save: string);

Begin
p:=i;
While (p > pas) and (T[p-pas] > save) Do
Begin
T[p-pas] := T[p];
p := p - pas;
End;
End;
{___________________________________________________}

Procedure Tri(Var T:Tab ; n: integer);
Var
pas,p,i : integer;
save: string;

Begin
pas := 0;
While ((3*pas + 1) < n) Do
pas := 3*pas + 1;

While pas <> 0 Do
For i:= 1 to (Pas - 1) Do
Begin
Save:= T[i];
Decalage (T,i,p,pas,save);
If p <> i Then
T[i]:= save;
End;
pas := pas DIV 3;
End;
{___________________________________________________}
Procedure Affichage (var Fh: Fhab);
Begin
Reset(Fh);
While not(eof(Fh)) Do
Begin
Read(Fh,e);
With e Do
Begin
Writeln('Le nom est: ',nom);
Writeln('Le n° d-habitants est: ',nbh);
End;
End;
End;
{programme principal}
Begin
Assign(F,'villes.txt');
Assign(Fh,'habitant.dat');
TransfertF_T(F,T,n);
Tri(T,n);
TransfertT_F(T,n,Fh);
Affichage(Fh);
End.
A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 019
3 févr. 2009 à 14:39
Il ne faut pas déclarer tes variables avant tes procédures, car tu utilises des paramètres de même noms, il y a donc ambiguïté, dans la mesure du possible ne déclare JAMAIS de variables globales... Déclares les au moment de ton programme principal ça suffira.

Dans la procecure Tri, il doit manquer des begin end pour encadrer les instructions du for et/ou des while

Dans les transferts de fichiers il vaut mieux passer en arguments des string contenant le chemin du fichier, et faire les assign reset/rewrite à l'intérieur de la fonction, ça évitera des erreurs et nottament d'oublier l'instruction close !

En ce qui concerne le contenu je n'ai pas trop regardé, je ne sais pas trop ce que tu cherches à faire, mais il ne me parait pas nécessaire d'utiliser un Tab intermédiaire pour passer d'un fichier Text à un fichier fHab, les fichier sont déjà assimilables à des tableaux...
0
GKA Messages postés 341 Date d'inscription vendredi 17 août 2007 Statut Membre Dernière intervention 3 août 2012 77
3 févr. 2009 à 18:59
Salut KX, à propos du tableau intermédiaire c'est évidement necessaire car il faut faire le tri (tri shell plus précisement) dans la RAM et non pas directement sur le fichier et ce sont les consignes des prof. En tt k merci bien
0