|
| Kan man sende en TList med som var-paramet~ Fra : Carsten Madsen |
Dato : 05-12-00 20:03 |
|
Subj.
Haster, tak for alle svar
MVH
Carsten
| |
Harald Kroning (05-12-2000)
| Kommentar Fra : Harald Kroning |
Dato : 05-12-00 20:29 |
|
"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
news:YUaX5.991$7E2.82444@news101.telia.com...
> Subj.
>
> Haster, tak for alle svar
Øhhh... Ja, men hvorfor skulle man gøre det? (det er der sikkert nogle der
kan komme med eks. på :)
MVH HK
| |
David A. D. Konrad (06-12-2000)
| Kommentar Fra : David A. D. Konrad |
Dato : 06-12-00 09:14 |
|
Harald Kroning wrote in message <90jfmg$dsr$1@news.inet.tele.dk>...
>"Carsten Madsen" <carstensm@hotmail.com> skrev i en meddelelse
>news:YUaX5.991$7E2.82444@news101.telia.com...
>> Subj.
>>
>> Haster, tak for alle svar
>
>Øhhh... Ja, men hvorfor skulle man gøre det? (det er der sikkert nogle der
>kan komme med eks. på :)
For at bearbejde listen, måske? En anden grund til at man skulle gøre det,
dog ikke i forbindelse med objekter, men med ting som arrays er, at man på
den måde kun overfører adressen, og ikke hele variablen.
hilsen,
| |
Niels (niLLer) (05-12-2000)
| Kommentar Fra : Niels (niLLer) |
Dato : 05-12-00 20:49 |
|
Just as I expected, "Carsten Madsen" <carstensm@hotmail.com> came up
with this:
>Kan man sende en TList med som var-parameter til en procedure?
Sagtens, men det given ingen mening for de fleste. Hvis du skriver:
procedure MinProc(var Liste: TList);
og så kalder proceduren med en initialiseret (created) TList, så vil
det eneste proceduren får være en pointer til en TList. Du kan så
ændre værdien af den pointer for at få Liste til at pege på en anden
liste, men:
procedure MinProc(Liste: TList); // uden "var"!!
begin
Liste.Add(@MinProc); // sikkert helt ubrugeligt, meen...
end;
vil sagtens kompilere og køre, fordi du kalder en metode i objektet.
Hvis nu TList havde en feltvariabel under Public eller Published ville
du også sagtens kunne ændre den, fordi det ikke er værdien af Liste du
ændrer på, men indholdet af det Liste peger på!
Håber det var forståeligt.
Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!
| |
Stig Johansen (05-12-2000)
| Kommentar Fra : Stig Johansen |
Dato : 05-12-00 21:27 |
|
Hej.
Niels (niLLer) <nmartin@ispam.com> wrote in message
news:3a2d45ad.27572235@news.12move.dk...
> Just as I expected, "Carsten Madsen" <carstensm@hotmail.com> came up
> with this:
>
> >Kan man sende en TList med som var-parameter til en procedure?
>
> Sagtens, men det given ingen mening for de fleste. Hvis du skriver:
>
Joh, det giver da mening for nogle af os.
I proceduren kan han da:
*Tilføje elementer.
*Fjerne elementer
*Finde elementer og operere på de objects, der er i listen.
*Free'e den og sætte den til NIL.
og sikkert meget mere, jeg ikke lige er kommet i tanke om.
Husk også, at en TList er en glimrende 'placeholder' for eksempelvis
integers.
[klip]
--
Med venlig hilsen/Best Regards
Stig Johansen - stig@w3data.dk
W3 Data - mailto@w3data.dk
| |
Niels (niLLer) (05-12-2000)
| Kommentar Fra : Niels (niLLer) |
Dato : 05-12-00 21:35 |
|
Just as I expected, "Stig Johansen" <stig@w3data.dk> came up with
this:
>> >Kan man sende en TList med som var-parameter til en procedure?
>>
>> Sagtens, men det given ingen mening for de fleste. Hvis du skriver:
>>
>
>Joh, det giver da mening for nogle af os.
>I proceduren kan han da:
>*Tilføje elementer.
>*Fjerne elementer
>*Finde elementer og operere på de objects, der er i listen.
>*Free'e den og sætte den til NIL.
>
>og sikkert meget mere, jeg ikke lige er kommet i tanke om.
Den eneste af de ting du har skrevet der man kun kan hvis man bruger
"var" vil være at sætte variablen til "nil". Resten operer kun på det
pointeren peger på!
Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!
| |
David A. D. Konrad (06-12-2000)
| Kommentar Fra : David A. D. Konrad |
Dato : 06-12-00 09:19 |
|
Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
>"var" vil være at sætte variablen til "nil". Resten operer kun på det
>pointeren peger på!
Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
nøjagtigt som man lyster. Prøv følgende :
function F1(var T:TStringList);
begin
T.add('abc');
end;
procedure P1;
var T:TStringList;
begin
T:=TStringList.create;
F1(T);
//T[0] er nu lig med abc
end;
hilsen,
| |
Jesper Krog Andersen (06-12-2000)
| Kommentar Fra : Jesper Krog Andersen |
Dato : 06-12-00 10:05 |
|
konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
@twister.sunsite.auc.dk>:
>Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
>
>>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
>>"var" vil være at sætte variablen til "nil". Resten operer kun på det
>>pointeren peger på!
>
>Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
>nøjagtigt som man lyster. Prøv følgende :
>
//Kode klippet
Prøv det samme, uden var. Det giver samme resultat.
/Data
| |
Jan (06-12-2000)
| Kommentar Fra : Jan |
Dato : 06-12-00 11:24 |
|
Hi.
"Jesper Krog Andersen" <data@krikkit.removethis.dk> skrev i en meddelelse
news:9002634FEdatakrikkitdk@194.182.148.146...
> konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
> @twister.sunsite.auc.dk>:
>
> >Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
> >
> >>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
> >>"var" vil være at sætte variablen til "nil". Resten operer kun på det
> >>pointeren peger på!
> >
> >Helt forkert. Netop ved at bruge en var-variabel kan man behandle listen
> >nøjagtigt som man lyster. Prøv følgende :
> >
>
> //Kode klippet
>
> Prøv det samme, uden var. Det giver samme resultat.
>
> /Data
A constant (const) parameter is like a local constant or read-only variable.
Constant parameters are similar to value parameters, except that you can't
assign a value to a constant parameter within the body of a procedure or
function, nor can you pass one as a var
parameter to another routine. (But when you pass an object reference as a
constant parameter, you can still modify the object's properties.)
Using const allows the compiler to optimize code for structured- and
string-type parameters. It also provides a safeguard against unintentionally
passing a parameter by reference to another routine.
Here, for example, is the header for the CompareStr function in the SysUtils
unit:
function CompareStr(const S1, S2: string): Integer;
Because S1 and S2 are not modified in the body of CompareStr, they can be
declared as constant parameters.
-Jan
| |
Thomas Due (07-12-2000)
| Kommentar Fra : Thomas Due |
Dato : 07-12-00 08:30 |
|
For lige at slå en ting fast. Når man snakker Var parametre i procedure
hoveder, er
der stor forskel på om det er f.eks. en streng, eller et objekt man sender
afsted.
Hvis man _ikke_ anvender objekter (f.eks. TList) men faste typer, String,
Integer,
ShortString, Double osv. osv. vil en var parameter overfører en _pointer_
til variablen.
F.eks. :
(Se venligst bort fra evt. grammatiske fejl, samt manglende fejl check)
Program TestVar;
Procedure SkiftFoerste(var s : String);
Var tmp : Char;
Begin
tmp := s[1];
s[1] := s[2];
s[2] := tmp;
end;
Var str : String;
Begin
str := 'abc';
SkiftFoerste(str);
println(str); // indeholder nu 'bac'
end;
Hvis man derimod ikke havde medtaget var i SkiftFoerste så ville værdien af
str efter
kaldet til SkiftFoerste stadigvæk være 'abc'.
Så langt så godt.
Hvis man anvender objekter, f.eks. TList så er Var _overflødigt_ idet list :
TList i forevejen er
en pointer til objektet. Det er en af forskellene på at anvende statiske
typer (hedder det vistnok)
og objekter.
Så med andre ord, du kan godt have et procedure hoved som f.eks. hedder :
procedure IndsaetVaerdi(Var liste : TList);
Men det vil have fuldstændig den samme virkning hvis du skriver
procedure IndsaetVaerdi(liste : TList);
Fordi liste _er_ allerede en pointer.
Mvh
Thomas Due
"Jan" <jan@somewhere.sw> wrote in message
news:zsoX5.3229$_z1.153459@news000.worldonline.dk...
> Hi.
>
> "Jesper Krog Andersen" <data@krikkit.removethis.dk> skrev i en meddelelse
> news:9002634FEdatakrikkitdk@194.182.148.146...
> > konrad@dadk.dk (David A. D. Konrad) wrote in <sDmX5.1322$72.18461
> > @twister.sunsite.auc.dk>:
> >
> > >Niels (niLLer) wrote in message <3a2d5117.30494761@news.12move.dk>...
> > >
> > >>Den eneste af de ting du har skrevet der man kun kan hvis man bruger
> > >>"var" vil være at sætte variablen til "nil". Resten operer kun på det
> > >>pointeren peger på!
> > >
> > >Helt forkert. Netop ved at bruge en var-variabel kan man behandle
listen
> > >nøjagtigt som man lyster. Prøv følgende :
> > >
> >
> > //Kode klippet
> >
> > Prøv det samme, uden var. Det giver samme resultat.
> >
> > /Data
>
> A constant (const) parameter is like a local constant or read-only
variable.
> Constant parameters are similar to value parameters, except that you can't
> assign a value to a constant parameter within the body of a procedure or
> function, nor can you pass one as a var
> parameter to another routine. (But when you pass an object reference as a
> constant parameter, you can still modify the object's properties.)
> Using const allows the compiler to optimize code for structured- and
> string-type parameters. It also provides a safeguard against
unintentionally
> passing a parameter by reference to another routine.
>
> Here, for example, is the header for the CompareStr function in the
SysUtils
> unit:
>
> function CompareStr(const S1, S2: string): Integer;
>
> Because S1 and S2 are not modified in the body of CompareStr, they can be
> declared as constant parameters.
>
> -Jan
>
>
| |
Dennis Fantoni (17-12-2000)
| Kommentar Fra : Dennis Fantoni |
Dato : 17-12-00 10:50 |
|
"Thomas Due" <noname@nowhere.net> wrote in message
news:90ne5f$17p$1@news.inet.tele.dk...
> Så med andre ord, du kan godt have et procedure hoved som f.eks. hedder :
>
> procedure IndsaetVaerdi(Var liste : TList);
>
> Men det vil have fuldstændig den samme virkning hvis du skriver
>
> procedure IndsaetVaerdi(liste : TList);
>
> Fordi liste _er_ allerede en pointer.
Der er dog den lille forskel at du kan gøre følgende :
Procedure MakeList(var liste:Tlist);
Begin
liste:=MyListType.Create;
End;
og lade den kaldte rutine returnere en liste.
Hvis du havde defineret procedure som MakeList(liste:Tlist);
så ville du ikke få den nye liste retur, da kun den lokale liste vil blive
ændret.
VAR parametre i procedurekald, hvor der er tale om objekter er brugbare hvis
den kaldte rutine skal lave objektet, eller returnere et objekt, fremfor
bare at ændre i objektets indhold.
En generel god regel er at undgå var parametre så meget som muligt.
Programmer med masser af var parametre er svære at finde rundt i (syntes
jeg).
---
Dennis Fantoni
df@image.dk
Fantoni EDB - Delphi konsulent.
Delphi, interbase, ibobjects, cgi-expert, isapi alt kan lade sig gøre
| |
Niels (niLLer) (17-12-2000)
| Kommentar Fra : Niels (niLLer) |
Dato : 17-12-00 15:28 |
|
Just as I expected, "Dennis Fantoni" <df@image.dk> came up with this:
>Der er dog den lille forskel at du kan gøre følgende :
>
>Procedure MakeList(var liste:Tlist);
>Begin
> liste:=MyListType.Create;
>End;
>
>og lade den kaldte rutine returnere en liste.
Hvis det var det der var meningen, så ville jeg nok vælge OUT i stedet
for VAR.
Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- I've been Windozed!
| |
Thomas Schulz (06-12-2000)
| Kommentar Fra : Thomas Schulz |
Dato : 06-12-00 14:57 |
|
> Haster, tak for alle svar
hvis du bruger *var parameter* kan du ændre hvad den TList pointer peger på
det sted hvor du sender den som parameter
...
hvis ikke du bruger *var* kopiers pointeren til TList objektet (din
parameter) ned i din procedure/function stack det vil sige du så kun kan
modificere det givne objekt (du kan dog stadigvæk sætte din stack pointer
til TList objecktet til at pege andre sted hen - dette kan *const*
forhindre)..
Så.. dvs. Det vil for det meste ikke give nogen mening at bruge *var* med et
TObject (eller nedarvere)
du overfører 4 byte under alle omstændigheder
Thomas
| |
Thomas Schulz (07-12-2000)
| Kommentar Fra : Thomas Schulz |
Dato : 07-12-00 15:45 |
|
>..
Glem det
minimum noget af det er forkert
Thomas
| |
|
|