Problème de fichiers / tableaux [RESOLU]

Problème de fichiers / tableaux [RESOLU] - Delphi/Pascal - Programmation

Marsh Posté le 02-06-2004 à 13:46:54    

Bonjour à tous,  
 
j'ai un petit projet en informatique qui consiste à faire un SOKOBAN et j'ai quelques difficultés.  
Pour tout le code, j'ai mit,  

const l=7;
      m=6;
type grille = array[1..10,1..10] of char;


 
J'ai la "carte" dans un fichier que je  rentre dans un tableau via cette procedure:  
 

procedure lecture;
var f:text;
    c:char;
    t:grille;
    i,j:integer;
begin
     assign(f,'truc1.txt');
     reset(f);
     for i:=1 to 8 do
     begin
          for j:=1 to 6 do
          begin
               read(f,c);
               t[i,j]:=c;
          end;
     end;
     close(f);
     for i:=1 to 8 do
     begin
          for j:=1 to 6 do
          begin
               write(t[i,j])
          end;
     end;
     readln
end;


 
jusque là, pas de problème, le contenu du fichier est enregistré dans un tableau, tableau qui est lui même affiché à l'écran.  
 
je rentre ensuite une procedure par déplacement. Elles sont toutes sous cette forme:  
 

procedure haut;
var i,j:integer;
    t:grille;
begin
     for i:=1 to l do
     for j:= 1 to m do
     begin
          if t[i,j]='m' then
          begin
               if t[i-1,j] = ' ' then begin t[i,j]:=' '; t[i-1,j]:='m' end;
               if t[i-1,j]='+' then begin t[i,j]:=' '; t[i-1,j]:='M' end;
               if t[i-1,j]=' ' then begin t[i,j]:=' '; t[i-1,j]:='m' end;
               if (t[i-1,j]='O') and (t[i-2,j]=' ') then begin t[i-2,j]:='O'; t[i-1,j]:='m'; t[i,j]:=' ' end;
               if (t[i-1,j]='O') and (t[i-2,j]='+') then begin t[i-2,j]:='Q'; t[i-1,j]:='m'; t[i,j]:=' ' end;
               if (t[i-1,j]='Q') and (t[i-2,j]=' ') then begin t[i-2,j]:='O'; t[i-1,j]:='M'; t[i,j]:=' ' end;
               if (t[i-1,j]='Q') and (t[i-2,j]='+') then begin t[i-2,j]:='Q'; t[i-1,j]:='M'; t[i,j]:=' ' end;
          end;
     end;
     readln
end;


 
Et je cherche ensuite à afficher le nouveau tableau via cette procedure:  
 

procedure affichage;  // on peut afficher la grille à n'importe quel moment
var cpt:integer;
    i,j:integer;
    t:grille;
begin
     for i:=1 to l do
     begin
          for j:=1 to m do
          begin
               write(t[i,j]);
               write;
               read;
          end;
     end;
     cpt:=cpt+1;
     writeln
end;


 
Le programme principale énumère simplement les procedure décrites ci-dessus.  
Mon problème est divers. Soit j'affiche effectivement le premier tableau provenant du fichier, mais après rien ne se passe.  
Soit, le premier tableau s'affiche sans soucis, et lorsque je lance la procedure 'haut', j'ai ce genre de joyeusetés qui s'affichent:  
 
├#Ûw♥
D☻☺
 
@ ♥
☺   ê
☺   D
☺   ☺
 
alors que le fichier de départ contenait uniquement:  
 
####
# +#
#  ###
#Qm  #
#  O #
#  ###
####
 
J'ai également une autre question à vous poser. Je cherche à générer des fichiers de sauvegarde pour chaque coups, pour pouvoir revenir sur le précédent en appuyant sur une touche.  
 
Je défini donc des fichier sous cette forme:  
 

procedure sauv(var t:grille);
var f:text;
    cpt:integer;
    s,h:string;
begin
     cpt:=1;
     getdir(0,s);
     h:=(s,'temp',cpt,'.txt');
     assign(f,h);
     rewrite(f);
     for i:=1 to l do
     for j:=1 to m do begin write(f,t[i,j]); readln end;
     cpt:=cpt+1
end;


 
Mais le compilateur n'a pas l'air d'apprecier la définition de h.  
 
Merci d'avance  
 
Lowskill


Message édité par L0WsKiLL le 14-06-2004 à 17:11:33
Reply

Marsh Posté le 02-06-2004 à 13:46:54   

Reply

Marsh Posté le 03-06-2004 à 10:00:23    

 h:=(s,'temp',cpt,'.txt');  
-> c'est censé vouloir dire quoi ?
 
pour le problème du tableau corrompu, à mon avis c'est quand tu sors des limites. Par exemple accès à i-1 alors que i vaut 1


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 08-06-2004 à 10:16:23    

je suis désolé de te dire ça, mais :
1 : ta description de code semble correct
2 : ton code est mal écrit et je ne me suis pas fatigué à le lire
3 : j'ai juste regardé le début, et ça semble correct
4 : est-ce-que t'es sur que les valeurs du fichier sont correctements rentrées dans le tableau ?
5 : je n'ai vu nulle part l'initialisation du tableau qui allouerait l'espace mémoire nécessaire (il y a bien la déclaration, mais après tu l'utilises direct, n'oublies pas de l'initialiser par un New ou un SetLength, sinon, ton tableau ne pointes sur rien, ce qui pourrait les signes bizarres qui s'affichent)


Message édité par auredauv le 08-06-2004 à 10:19:50
Reply

Marsh Posté le 08-06-2004 à 10:25:14    

auredauv a écrit :

n'oublies pas de l'initialiser par un New ou un SetLength, sinon, ton tableau ne pointes sur rien, ce qui pourrait les signes bizarres qui s'affichent)


 
:heink: c'est un tableau statique (1..10)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-06-2004 à 17:11:05    

Bonjour,  
 
J'ai résolu mon problème.  
 
En fait, mon tableau était trop petit pour ce que je voulais lui faire afficher. j'avais oublié de prendre en compte le caractère de fin de ligne et de retour, ce qui faisait que je sortais du tableau, d'où les hiéroglyphes.  
 
Merci pour votre aide :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed