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

Qualcuno può spiegarmi per quale cazzo di motivo l'output di questo prog è
10_9_10_10_10_9_9_7_9_9_10_9
Se potete aiutarmi anche con del materiale al riguardo ve ne sarò grato.
Grazie, rispondetemi  sul NG.
program d;
const n=10;
var x,y:integer;
procedure g(var y:integer);
begin
y:=x-2; x:=y+2; writeln(x);writeln(y);
end;
 procedure f(var x:integer);
 var y:integer;
        procedure g(y:integer);
        begin
        y:=x-2; x:=y+2; writeln(x);writeln(y);
        end;
begin
y:=x; g(y); writeln(x);writeln(y);
end;
begin
x:=n; y:=n-1; writeln(x);writeln(y);
g(x); writeln(x,y);
f(y); writeln(x,y);
end.

Grazie, rispondetemi  sul NG.
Premesso che non lo ho provato, ma...
secondo me, hai sbagliato ad usare uguali nomi per variabili
interne ed esterne alle procedure, finisci per confondere,
quello che e' x diventa y insomma si scambiano.
Devi definirle con maggior precisione e criterio.
Poi puoi tracciare e con il watch vedi cosa accade.
extrabug @ 
iname.com

 ha scritto nel messaggio
news:sfwl6.5775$Mx3....@twister2.tin.it...


 wrote in message
sfwl6.5775$Mx3....@twister2.tin.it...


 ha scritto nel messaggio
news:iBLl6.7167$q97.1...@twister1.tin.it...


 end.
Quindi eccoti il tuo output! (magari averlo capito prima...)
Main 10 9
precedure g 10 10 10 9
procedure g dentro la f 9 7
precedure f 9 9
ultimo write10 9
Ci stai lunedě mattina?
Ciao.
Daniele.

 In bocca al lupo!!
Lieto di esserti stato d'aiuto!
CREPIIIIIIIIIIIII!!!
Daniele.

quello che e' x diventa y insomma si scambiano.
Mi spiegheresti meglio questo concetto ?
Mi sfugge che cosa tu intenda realmente.
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

10_9_10_10_10_9_9_7_9_9_10_9
Premetto che e' un programma scritto da un malato di mente,
probabilmente.  Tali contorsioni mentali sono tipiche dei professori
universitari.  E dire che nelle universita' americane si progettano i
sistemi operativi per gli esami !.
// nel programma principale
x := 10 ;
y := 10 - 1 := 9 ; 
writeln(x) -> 10
writeln(y) -> 9
// output : 10 9
// si passa alla funzione y, uguale a x
// x viene passato per riferimento
g(x) -> x := x - 2 := 8 ;
        x := x + 2 := 10 ;
writeln(x) -> 10
writeln(y) = writeln(x) -> 10
// output : 10 9 10 10
// si torna nel programma principale
writeln(x) -> 10 ; 
writeln(y) -> 9
// output : 10 9 10 10 10 9
// si passa nella seconda funzione :
// y viene passato per riferimento
// ed acceduto tramite "x" (!!!)
// viene dichiarata y con scope locale
f(x) -> y := x := 9 ;
     // viene chiamata g(y) 
     g(y) -> y := x - 2 := 10 - 2 = 7 ;
             x := y + 2 := 9 ;
     writeln( x ) -> 9 
     writeln( y ) -> 7
// output : 10 9 10 10 10 9 9 7 
// si torna dentro f() in cui ora 
// y := x := 9 (anche se x e' stato modificato
// dalla g locale e vale ancora 9) quindi :
writeln(x) -> 9
writeln(y) -> 9
// output : 10 9 10 10 10 9 9 7 9 9 
// si torna nel programma principale in cui x vale
// ancora 10 e y vale ancora 9 quindi :
writeln(x) -> 10 
writeln(y) -> 9
// output finale : 10 9 10 10 10 9 9 7 9 9 10 9
Ribadisco : un programma del genere e' da malati di mente.           


Mi sfugge che cosa tu intenda realmente.
Quel prog e' fatto apposta per confondere le idee,
io, se non capisco, cerco di semplificare, tagliando e tracciando
solo quello che non comprendo, usando nomi piu' facili quando possibile.
Pero' in questo caso mi sarei accorto che lo scopo e' proprio di mostrare
le differenze tra modi di passaggio, per valore, per riferimento.
O forse lo scopo era di non farlo capire... boh.
extrabug @ 
iname.com