06. december 2004 - 12:06Der er
8 kommentarer og 6 løsninger
ByRef og ByVal
FUNCTION INT FUNC1 (BYREF STR 10 &s, BYVAL INT &i)
Jeg har læst mig til at byref og byval, henholdsvis implicit og eksplicit værdioverfører. Jeg kender godt ordene implicit og eksplicit, men hvad forskellen lige er her forstår jeg ikke. Nogen der kan uddybe evt. med et eksempel?
BYREF = En reference til den adresse i hukommelsen hvor din variabel ligger BYVAL = En kopi af værdien i den adresse i hukommelsen hvor din variabel ligger (altså en ny variabel og dermed en anden adresse i hukommelsen).
ALTSÅ, hvis der overføres BYREF, er det den samme adresse du har adgang til i funktionen, og dermed kan du ændre værdien inde i funktionen, og få den ændrede værdi med ud igen.
BYVAL er derimod en KOPI af værdien, og hvis du ændrer denne inde i funktionen, så vil det IKKE have indflydelse på værdien i hukommelsen, når du kommer tilbage fra funktionen, da det er kopien du ændrer på i funktionen.
Så i dit eksempel ovenfor, vil du kunne ændre &BYREF og få værdien med ud af funktionen, men BYVAL INDEN kaldet af funktionen har værdien 3, så vil den også have det, når du returnerer fra funktionen UANSET om du har ændret værdien på &BYVAL inde i funktionen.
Håber det er forståeligt.
Jeg vidste faktisk ikke, at man kunne bruge disse keywords i XAL, men ovenstående er generel programmeringsteori.
Hvad er &s samt &i typisk i mit eksempel ovenfor? Jeg kan læse i C5 hjælpen, at man ikke kan lave reference til databasefelter. Er de to variable evt. værdier fra Tabel.Felt et par steder fra? Og vil felt værdien i Tabel.Felt ændres, der hvor man har anvendt ByRef? Er det forståeligt?
Hvis du har et program x som kalder funktionen FUNC1 på følgende måde:
----------- XAL-KØRSEL x
INT &heltal STR 10 &streng
. . .
FUNC1(&Streng,&heltal)
. . . ------------------ XAL-KØRSEL X SLUT
Variablen &S i funktionen FUNC1 peger på samme område i hukommelsen som variablen &Streng i xal-kørsel X gør. D.v.s. at hvis du ændrer på værdien i &S i koden i funktionen FUNC1, så ændrer du faktisk også på værdien i &Streng i XAL-kørslen X.
Variablen &I i funktionen FUNC1 er en KOPI af variablen &heltal i XAL-kørslen X. Dermed kan du i koden i funktione FUNC1 ændre lige så tosset du vil på værdien i variablen &I - den er en kopi som kun eksiterer i FUNC1 - UDEN at det har indflydelse på værdien i variablen &heltal i XAL-kørslen X !!!
Jeg tror at det der står i manualen er, at du IKKE kan anvende databasefelter i kaldet af en funktion, men er nødt til at kopiere værdierne over i nogle variable, som så du kalder funktionen med.
Det er situationen heller ikke da funktionen som nævnt øverst oppe er deklareret som: FUNCTION INT FUNC1 (BYREF STR 10 &s, BYVAL INT &i) og dermed kun tager to argumenter !!!
Men hvis &Streng har værdien "ole" og &heltal har værdien 42 i xal-kørslen X og du kalder funktionen med:
FUNC1(&Streng,&heltal)
så vil &s have værdien "ole" og &i have værdien 42 i koden i funktionen FUNC1.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.