[Prog] forwarddeclaratie

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

Michael Cochez
Posts: 54

[Prog] forwarddeclaratie

Post#1 » Thu Jan 04, 2007 7:38 pm

Ik had nog een vraag over forwarddeclaraties, In de cursus staat het volgende:
Vermits beide procedures elkaar oproepen moeten we een keuze maken van welke eerst wordt gedeclareerd (het probleem van de kip en het ei:
welke was de eerste?). Een 'voorwaartse' declaratie laat toe aan te duiden dat een definitieve declaratie later volgt met identieke specificaties en een volledige uitwerking. Dit wordt aangegeven door een pijltje na het gereserveerde woord PROCEDURE te
plaatsen.
In de les is hier volgens mij niets over gezegd + ik heb er eigenlijk nog geen last van gehad.
Is Zo'n forwarddeclaratie verplicht?

Michael

Phil
Posts: 100

Post#2 » Thu Jan 04, 2007 7:41 pm

welk hoofdstuk staat da? :?

User avatar
zarry
Posts: 212

Post#3 » Thu Jan 04, 2007 7:49 pm

Phil wrote:welk hoofdstuk staat da? :?
Recursie p135 onder die driehoeken in driehoeken..
Handig zo ne cursus in pdf formaat, daarmee kunde zoeken enzo ;)

En wa da wil zeggen.. Meih, ik vroeg mij da ook al af, goeie vraag.. Maar nuttig, kweni :D jie
Ik spreek Zwarryzwaniaans en jij?

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Re: [prog] forwarddeclaratie

Post#4 » Thu Jan 04, 2007 8:34 pm

Michael Cochez wrote:Is Zo'n forwarddeclaratie verplicht?
Voor de compiler die in ETHOberon zit niet (toch niet met de opties waarmee ik hem gebruikt heb). Het kan wel zijn dat er compilers zijn die maar in 1 richting over de source gaan. Je kan dit dan oplossen door alles te definieren voor je het gebruikt, maar soms is het handiger van procedures bij elkaar te zetten, waardoor sommige dingen wel eens kunnen gebruikt worden voordat ze gedefinieerd zijn.

Code: Select all

MODULE Example;

  PROCEDURE ^ Run (verbose: BOOLEAN);

  PROCEDURE RunVerbose*;
    (* some declarations *)
  BEGIN
    (* some statements *)
    Run(TRUE);
    (* some statements *)
  END RunVerbose;

  PROCEDURE RunSilent*;
    (* some declarations *)
  BEGIN
    (* some statements *)
    Run(FALSE);
    (* some statements *)
  END RunSilent;

  PROCEDURE Run (verbose: BOOLEAN);
    (* some declarations *)
  BEGIN
    (* some statements *)
  END Run;
END Example.
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
Adelbert
Posts: 34

Post#5 » Fri Jan 05, 2007 12:51 am

Ik zit daar nog elemaal ni, maar ik meen mij toch wel een nuttig aspect te herinnere (kben ni volledig zeker of da'k nu iemand anders gaan herhale, maar dan moest'm't mor duidelijker type... het is al laat voer mij enz...):
als ge wederzijdse recursie wilt toepasse, dus vanuit procedure1 procedure2 oproepen en andersom, dan moet ge dus in het instructiegedeelte van procedure1 op ne moment de actuele oproep van procedure2 uitvoeren.
Als de compiler echter nog niks weet over procedure2 (dus geen formele hoofding bezit of zo, bestaat procedure2 voor zijn part helemaal ni), zal hij geen typechecking kunnen uitvoeren en zal hij dus zegge da da ni mag. Da probleem valt op te losse door zo'n voorwaardse declaratie in te voere, dan laat ge weten aan de compiler da ge het zelf wel zult regelen en da da wel in orde komt.
(Dit om het in de termen van onze kleine wijze|grijze prof te zeggen.)

Michael Cochez
Posts: 54

Post#6 » Fri Jan 05, 2007 7:09 pm

In de tuyeau staat de volgende vraag:
Bespreek op ondubbelzinnige wijze wanneer je een parameter van het type pointer als waarde of variabele parameter declareert.
Wat moet ge hier nu op antwoorden??
Soms is dat nuttig, soms niet???

(Waarom is de tuyeau copy protected???)

User avatar
Nick
Prosenior
Posts: 1850
Contact:

Post#7 » Fri Jan 05, 2007 7:54 pm

'k Heb eens zitten rommelen in onze archieven, want ik dacht dat die vraag vorig jaar ook al gesteld werd. Het gaat hier nu wel over de "receiver parameter", maar 't principe is hetzelfde :)
Shinta wrote:Er staat letterlijk in de cursus dat de receiver OFWEL een waardeparameter van een pointer naar een record variabele moet zijn (vb : PROCEDURE (l : Init) DoSomething; )
OFWEL een variabele parameter van een record
(vb : PROCEDURE (VAR l : InitRecord) DoSomething; )

De eerste mogelijkheid van de waardeparameter is te verklaren doordat een object een instantie is van een klasse en een klasse de type definitie is van een POINTER naar een record. Dus uw object is een pointer naar een record en dus een adres welke niet veranderd mag/moet worden in uw procedure DoSomething.

De tweede mogelijkheid is te verklaren door de run-time stack, hierin staat dat een variabele parameter per definitie een ADRES is, dus een pointer, en het bevat een record, dus het is tevens een pointer naar een record eigenlijk, net zoals de waardeparameter van een pointer.
To Woef or not to Woef, that is the question!

WINAK Scriptor 2006-2007
WINAK Vice-Praeses 2007-2008
WINAK Praeses 2008-2009
WINAK Cantor 2009-2010
... en kortom: Eeuwig WINAKer 8)

User avatar
Adelbert
Posts: 34

Post#8 » Sun Jan 07, 2007 1:39 am

Kort gezegd volges mij:
als ge wilt da de meegegeven waarde een returnwaarde krijgt (dus de laatst aan die parameter toegekende waarde in de opgeroepen procedure) moet ge da me ne variabele parameter doen, moet da echter ni aangepast worden, dan doet ge da me ne waardeparameter (o.a. uit veiligheid dat ze toch ni per ongeluk aangepast wordt).
Dan kunne we daar ook nog den hele zever bij hale vanuit de Runtime Stack da ne variabele ne pointer is enz...
En ten slotte dan nog efkes twee voorbeeldjes geven van de twee gebruikte technieken...
Daar dan nog wa uitleg rondbrije en dan zal da wel ongeveer in orde zijn zeker?

Teun
Posts: 216

Post#9 » Sun Jan 07, 2007 9:41 am

De compiler die wij gebruiken maakt daar neit zo'n probleem van. As je echter met een andere werkt (bijvoorbeeld pow!), moet je wel zien dat je je procedures eerst declareert alvorens je ze in andere procedures gebruikt.

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 1 guest