Newsgroup: it.comp.lang.pascal
Titolo: errore

Vi sarei grato se qualcuno mi puņ aiutare!
Ho fatto un algoritmo per un esercizio che mi chiedeva di utilizzare la
ricorsione per una funzione booleana che ricerca in una matrice se nelle
righe pari sono presenti solo num pari ed in quelle dispari solo quelle
dispari.
In caso positivo tale function produrrą un true altrimenti un false.
fin qui nessun problema ma andando ad eseguire il programma mi viene
segnalato dopo la riga di specifiche della funzione ricorsiva il seguente
errore:
error 202 stack overflow error.
Vi invio anche il mio listato del programma
vi prego aiutatemi
GRazie
emiliano pezone
PROGRAM TrovaPariDisp (input,output);
uses crt;
CONST
n=2;
TYPE
TipoMatrice=Array [1..n,1..n] of integer;
VAR
matrice:TipoMatrice;
rigo,colonna:integer;
risultato,controllo:boolean;
FUNCTION PariDisp (matrice1:TipoMatrice;Rigo1:integer;VAR
controllo1:boolean):boolean;
VAR
colonna1:integer;
BEGIN
IF rigo1 <>0 then
colonna1:=1
else
paridisp:=controllo1;
while (Colonna1 <= N)  and not (Controllo1) do
BEGIN
IF rigo1 mod 2 =0 then
         BEGIN
         If Matrice1 [rigo1,colonna1] MOD 2 = 0 then
         controllo1:=true
         else
         controllo1:=false;
         END
else
BEGIN
if matrice1[rigo1,colonna1] Mod 2 <> 0 then
controllo1 := true
else
controllo1 := false;
END;
colonna1:=(colonna1)+1
END;
     IF controllo1 = true then
    PariDisp:=PariDisp(Matrice1,(rigo1)-1,controllo1)
    else
    paridisp:=Controllo1;
END;
PROCEDURE CreaMatrice(colonna1:integer;rigo1:integer;VAR
Matrice1:TipoMatrice);
BEGIN
for colonna1:= 1 to n do
    for rigo1:= 1 to n do
    BEGIN
    writeln (' rigo ', rigo1,' colonna ',colonna1,' ? ');
    readln(matrice[rigo1,colonna1]);
    END;
writeln;
writeln('Questa e'' la matrice assegnata');
   for colonna1:=1 to n do
       for rigo1:= 1 to n do
       BEGIN
       write (MATRICE[colonna1,rigo1]:2);
             if rigo1 = n then
             BEGIN
             writeln;
             END;
       END;
END;
PROCEDURE InizializzaVar(VAR rigo2:integer;VAR controllo2:boolean);
BEGIN
rigo2:=n;
controllo2:=true;
END;
(**MAIN**)
BEGIN
clrscr;
CreaMatrice(colonna,rigo,Matrice);
InizializzaVar(rigo,controllo);
risultato:=PariDisp (matrice,Rigo,controllo);
writeln;
writeln(risultato);
readln;
END.


Sicuro, ti darò un accenno...
-----------------------------------
Sia data una matrice x(m,n)   m = righe,   n = colonne.
Siano  Xpari e Ydisp due variabili booleane inizializzate a false.
Xpari = true;    Ydisp = true;
Per A che va da 1 a n fai
  Inizio
    Per B che va da 1 a m fai
     Inizio
       se (A mod 2) <> 0 Allora
          Ydisp = Ydisp AND x(m,n)
       altrimenti
          Xpari = Xpari AND x(m,n)
     Fine
  Fine;
In sostanza fai la scansione di tutte le colonne e per ogni colonna fai la
scansione di tutte le righe, a questo punto basta fare sie per le colonne
pari che dispari un AND multiplo fra elementro precedente e quello corrente.
Si sa, che se almeno uno dei valori passati su AND è false... la funzione
restituisce false.... quindi....
Alla fine.... se sono soddisfatte le condizioni:
a) colonne pari >> solo numeri pari (VERO)
b) colonne dispari >> solo numeri dispari (VERO)
Xpari e Ydispari restituiranno true.
E in generale se una delle due risponde alle specifiche quella che risponde
alle specifiche restituisce true.
PS: Ho usato un linguaggio astratto per semplificare il tutto, non ho fatto
uso di pascal in quanto in questa sede non conta la codifica quanto la
logica.
Per il passaggio da una funzione interattiva a una ricorsiva è molto più
immediato che scriverlo direttamente in forma ricorsiva.... senza passare
per quella interattiva...
E questo perchè il nodo modo di ragionare è più vicino all'interattività che
alla ricorsività.... :-)
Cordialmente, Cooper.

  Fine;
Per essere ancora più precisi, si può aggiungere al'algoritmo una ultima 
riga:
Risultato = Xpari AND Ydisp
Cordialmente,
Humberto Jemma (Brasile)
-------------------------------
Message Posted by  <dedGateway>
http://www.dedonline.com/forump

  Fine;
 Risultato = Xpari AND Ydisp  // risutato finale del'algoritmo.


error 202 stack overflow error.
È palese che ti da questo errore perchè la funzione si richiama troppe
volte e riempie la pila!
NM

 ha scritto nel messaggio
news:3cec3d49...@news.tiscalinet.it...
