Newsgroup: it.comp.lang.pascal
Titolo: Funzioni e record

Salve a tutti,
sono un ragazzo che ha bisogno di aiuto e spero che qualcuno sia così
gentile da rispondermi.
Mi trovo di fronte a questo problema:
come mai le funzioni possono ricevere come argomento un record ma non
possono restituirlo ?
Ho chiesto su IRC e mi hanno detto che è impossibile, le funzioni
restituiscono solo reali, interi e stringhe: è vero ?
Qualcuno mi ha anche detto che si possono restituire puntatori: è vero ?
Se si, come posso utilizzarli affinché invece di ottenere dalla funzione un
record, ottengo un puntatore a quel tipo di record ?
Per fare un esempio circa il mio problema:
program impossibile_da_compilare;
type
  uomo = record
    altezza : real;
    peso : real;
  end;
var
  io : uomo;
  tu : uomo;
function inverti(var u : uomo) : uomo;
var
  tempo : uomo;
begin
  tempo.altezza := u.peso;
  tempo.peso := u.altezza;
  inteverti := tempo;
end;
begin
  io.altezza := 1.76;
  io.peso := 61;
  tu := inverti(io);
end.
Vi ringrazio per aver prestato la vostra attenzione.
Spero in una vostra risposta.
Buon lavoro a tutti,
Mkè

program possibile_da_compilare;
type
  uomo = record
  altezza : real;
  peso    : real;
end;
  PuntUomo = ^uomo;
var
 io : uomo;
 tu : puntuomo;
function inverti(var u : uomo) : puntuomo;
var
  tempo : puntuomo;
begin
  tempo^.altezza := u.peso;
  tempo^.peso    := u.altezza;
  inverti        := tempo;
end;
begin
  io.altezza := 1.76;
  io.peso := 61;
  tu := inverti(io);
end.
Spero di esserti stato d'aiuto
Ciao

Ciao Furia,
ti ringrazio per avermi risposto !
Ad una prima occhiata il codice sembra giusto. Lo proverň questa sera.
Grazie ancora,
Mkč

mmmh allora... e' impossibile usare tipi record come tipo di ritorno
di una funzione, questo per questioni di gestione memoria: i param
e le variabili della funzione sono gestite nello stack, che grosso
non e', e se tu restituisci un record bello grosso non ci sta'.
Lo puoi passare come parametro perche' non viene passato come
valore (cioe' ricopiato nello spazio di indir. della funzione) bensi'
come rifermento [ +/- puntatore, ma tu non te ne accorgi :-) ]
Se devi modificare un record in una funzione beh... fai una procedura
:-)
Lo passi come var e lo modifichi, oppure se non vuoi rovinarlo ne
passi due, uno in "sola lettura" e l'altro in cui viene scritto il
risultato
della `funzione`.
La versione di FuriaCeca ad occhio non dovrebbe funzionare perche'
nella funzione tempo e' un puntatore che non punta a niente... dovresti
allocare una variabile in modo dinamico ( con New o GetMem ) che
poi andrebbe deallocato e quindi sbattimento = `Male`
ma penso che questo vada oltre la tua domanda :-)
-- 
Dreadnaut
(Life would be easier if I had the source code)

   tempo^.altezza := u.peso;
purtroppo tempo non punta a nulla :-(
tu crei un puntatore ma ad esso non e' associato nessuno spazio
in memoria e quindi non puoi scriverci... puoi allocare lo spazio
per un nuovo "uomo" a cui far puntare tempo con
  GetMem ( tempo, sizeOf(uomo) );
oppure
  New ( tempo );
ma poi devi ricordarti di loro:  piu' tardi nel programma `dovresti`
deallocarli ( rispettivamente con FreeMem e Dispose ) e liberare
la memoria che hai utilizzato ! :-)


Hai ragione, in effetti non allocando memoria x un puntatore si rischia di
fare un gran casino...
Sono un po' arruginito sui puntatori, ci ridarò un'occhiata!
