Newsgroup: it.comp.lang.pascal
Titolo: non funziona il programma compilato

ragà, io c'ho provato pure da Dos, ma si blocca il programma. Devo aver
commesso qualche grave errore. Vi sarei grato se mi segnalaste cosa ho
sbagliato, perchè devo portarlo come progetto d'esame.
Grazie di cuore
Vi scrivo il codice più il contenuto del file grid.txt che è usato dal
programma.
program copia (output, infile, outfile);
type pcella = ^cella;
     cella = record
  val : char;
  flag : 0..1;
  u,d,l,r : pcella;
                end;
     matrice = array [1..20] of array [1..20] of pcella;
var infile, outfile: text; ch: char; counter,i,j,row,col: 1..20;
    Grid: matrice; s: string;
procedure inizia(s: string);
begin
     writeln('sto eseguendo: ',s)
end;
procedure finisci(s: string);
begin
     writeln('Ho terminato: ',s)
end;
procedure set_p_To_nil(var griglia: matrice);
begin
        inizia('set_To_nil');
 griglia[j][i]^.u:=nil;
 griglia[j][i]^.d:=nil;
 griglia[j][i]^.l:=nil;
 griglia[j][i]^.r:=nil;
        finisci('set_To_nil');
end;
procedure activateP(var griglia: matrice);
begin
     inizia('activateP');
 if ((j-1)>0) then griglia[j-1][i]^.r :=  @griglia[j][i];
 if ((i-1)>0) then griglia[j][i-1]^.d :=  @griglia[j][i];
        if ((j+1)<21) then griglia[j+1][i]^.l := @griglia[j][i];
 if ((i+1)<21) then griglia[j][i+1]^.u := @griglia[j][i];
     finisci('activateP')
end;
procedure set_f_To_0(var griglia: matrice);
begin
        inizia('set_f_To_0');
 griglia[j][i]^.flag := 0;
        finisci('set_f_To_0')
end;
procedure ScanDown(var q: pcella); forward;
procedure ScanLeft(var q: pcella); forward;
procedure ScanRight(var q: pcella); forward;
procedure ScanUp(var q: pcella);
begin
     inizia('scanUp');
 if q^.flag=0 then
 begin
  counter:=counter+1;
  q^.flag:=1;
  while (q^.u <> nil) AND (q^.u^.flag = 0) do
   scanUp(q^.u);
  if (q^.r <> nil) then scanRight(q^.r);
  if (q^.l <> nil) then scanLeft(q^.l);
  if (q^.d <> nil) then scanDown(q^.d)
 end;
     finisci('scanUp')
end;
{ ScanUp esegue anche scanDown perchS l'ordine di ricerca inizia sempre
verso l'alto,
 quindi deve per forza controllare anche la cella sottostante.}
procedure ScanDown;
begin
     inizia('scanDown');
 if q^.flag=0 then
 begin
  counter:=counter+1;
  q^.flag:=1;
  while (q^.d <> nil) AND (q^.d^.flag = 0) do
   scanDown(q^.d);
  if (q^.r <> nil) then scanRight(q^.r);
  if (q^.l <> nil) then scanLeft(q^.l)
 end;
     finisci('scanDown')
end;
procedure ScanLeft;
begin
     inizia('scanLeft');
 if q^.flag=0 then
 begin
  counter:=counter+1;
  q^.flag:=1;
  while (q^.l <> nil) AND (q^.l^.flag = 0) do
   scanLeft(q^.l);
  if (q^.u <> nil) then scanUp(q);
  if (q^.d <> nil) then scanDown(q)
 end;
     finisci('scanLeft')
end;
procedure ScanRight;
begin
     inizia('scanRight');
 if q^.flag=0 then
 begin
  counter:=counter+1;
  q^.flag:=1;
  while (q^.r <> nil) AND (q^.r^.flag = 0) do
   scanRight(q^.r);
  if (q^.u <> nil) then scanUp(q);
  if (q^.d <> nil) then scanDown(q)
 end;
     finisci('scanRight')
end;
begin
        writeln('Comincio');
 assign(infile, 'grid.txt');
        writeln('1');
 assign(outfile, 'output.txt');
        writeln('2');
 reset(infile); rewrite(outfile);
        writeln('3');
        writeln('Ho letto e resettato i files');
 readln(infile, row);
 readln(infile, col);
 readln;
        writeln('Ho letto le colonne e le righe');
 for j:=1 to row do
        begin
  for i:=1 to col do
  begin
   read(infile, ch);
   grid[j][i]^.val:=ch;
   set_p_To_nil(grid);
   set_f_To_0(grid)
  end
        end;
        writeln('Ho finito di memorizzare i dati nell''array');
 for j:=1 to row do
 begin
  for i:=1 to col do
   if grid[j][i]^.val='n' then activateP(grid)
 end;
 for j:=1 to row do
 begin
  for i:=1 to col do
  begin
   if grid[j][i]^.val='n' then scanUp(grid[j][i]^.u);
   writeln(outfile,'Trovato un blob di ',counter:2,' celle.');
  end
 end;
close(outfile);
end.
grid.txt
20
20
nnbbbbbbbbbbbbbbbbbb
nnbbbbbbbbbbbbbbbbbb
bbbbbnnnbbbbbbbbbbbb
bbbbbbbnbnnnnnbbbbbb
bbbbbbbnnnbbbnbbbbbb
bbbbbbbbbbbbbnbbbbbb
bbbbbbbbbbbbbnbbbbbb
bbbbbbbbbbbbbnbbbbbb
bbbbbbbbbbbnnnbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbb
Il file output.txt penso debba essere creato prima...
--
San Vegeta from Hell
http://www.geocities.com/Area51/Dungeon/8436
(da visualizzare col browser della Netscape)

end;
Non ci siamo proprio.
matrice e' un "array[1..20,1..20] of pcella" (e' cosi' che andrebbe
dichiarato) ;
Questo significa che ogni elemento dell'array e' gia' un puntatore e
compiendo quel tipo di assegnazione non stai prelevando il valore
contenuto nel puntatore, ma l'indirizzo del puntatore stesso !!!
(e per di piu' contenuto nello stack ! )
L'assegnazione giusta e' 
if ((j-1)>0) then griglia[j-1][i]^.r := griglia[j][i];

 wrote in message
371ddd80...@diesel.cu.mi.it...
