Avatar billede lasse_32 Nybegynder
06. december 2004 - 12:06 Der 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?
Avatar billede jasman Nybegynder
06. december 2004 - 12:15 #1
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.
Avatar billede lasse_32 Nybegynder
06. december 2004 - 15:04 #2
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?
Avatar billede jasman Nybegynder
06. december 2004 - 15:46 #3
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.
Avatar billede lasse_32 Nybegynder
06. december 2004 - 16:19 #4
Hvad i mit oprindelige udtryk er det egentlig der får en værdi via funktionen?
Avatar billede lasse_32 Nybegynder
06. december 2004 - 16:23 #5
Altså hvis situationen f.eks. er:
FUNCTION INT FUNC1 (BYREF STR 10 &s, BYVAL INT &i, &Sum)
Avatar billede jasman Nybegynder
06. december 2004 - 16:40 #6
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.
Avatar billede lasse_32 Nybegynder
06. december 2004 - 19:39 #7
Men hvad hvis det tredje argument er med som jeg skriver?

Og får selve Func1 en værdi, da den jo er erklæret som en Int (mellem Function og Func1)?
Avatar billede lasse_32 Nybegynder
08. december 2004 - 10:30 #8
Hvad så jasman... er det for kryptisk, det jeg spør ind til?
Avatar billede jasman Nybegynder
08. december 2004 - 10:33 #9
Det kommer fuldstændigt an på hvad du angiver som tredje argument når du kalder FUNC1.

Hvis du kalder FUNC1 således:

FUNC1("Hest",42,4711)

Vil &S have værdien "HEST"
    &I have værdien 42 og
    &Sum have værdien 4711.
Avatar billede lasse_32 Nybegynder
08. december 2004 - 11:36 #10
OK fint nok, men hvad så med Func1... som er defineret som INT... får den nogen selvstændig værdi? Hvad skal typen ellers defineres for?
Avatar billede jasman Nybegynder
08. december 2004 - 11:44 #11
Denne type selve funktionen erklæres med, er den datatype som RESULTATET af funktionen returnerer.

Hvis FUNC1 er defineret med

FUNCTION INT FUNC1 (BYREF STR 10 &s, BYVAL INT &i, &Sum)

Så returnerer FUNC1 et heltal.
For at returnere en værdi fra en funktion anvendes kommandoen:

RETURN (som man er vant til fra en xal-kørsel, triggere m.v.).

Fidusen er så, at det der returneres SKAL have samme datatype som den datatype funktionen er erklæret med, ellers får man compilefejl.

Så d.v.s. at hvis du i dette tilfælde vil have FUNC1 til at returnere 15
Så skriver du

RETURN 15.

Det kan også være, at funktionen skal returnere noget forskelligt ud fra en given betingelse, også kan man anvende:

IF <betingelse> THEN
  RETURN 15
ELSE IF <betingelse2> THEN
  RETURN 20
ELSE IF <betingelse3> THEN
  RETURN 30
ENDIF ENDIF ENDIF

Ergo, den type der angives FORAN funktionens navn, er returtypen på funktionen.
Avatar billede lasse_32 Nybegynder
08. december 2004 - 12:08 #12
OK, så den eneste komponent i udtrykket der kan skifte værdi er &s, da den jo bruges med et BYREF foran!?
Avatar billede jasman Nybegynder
08. december 2004 - 12:10 #13
Sådan kan du godt udtrykke det.
Avatar billede lasse_32 Nybegynder
08. december 2004 - 12:28 #14
Tak for din hjælp.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester