Problème de fichiers / tableaux [RESOLU] - Delphi/Pascal - Programmation
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
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)
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) |
c'est un tableau statique (1..10)
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
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