[Prog] Variabele i gebruiken bij objecten

Forum van 1ste Bachelor Informatica.

Moderator: Praesidium

Glenn
Posts: 280

Post#16 » Fri Feb 06, 2009 12:21 pm

Kan het zijn dat je geen objecten kan meegeven als parameter? Ik heb dat ergens geprobeerd maar toen crashte mijn compiler.

Code: Select all


PROCEDURE (cur : Speler) Add*(naam : String; SpelLeider : SpelLeider);

VAR
l : Speler;

BEGIN
NEW(l);
l^.nr := INC(cur^.prev^.nr);
l^.naam := naam;
WHILE (cur # NIL) & (cur^.next # NIL) DO
cur := cur^.next;
END;
l^.prev := cur;
l^.next := NIL;
cur^.next := l;
SpelLeider^.aantalspelers := l^.nr;
END Add;
In dit stukje code wilde ik dus het mogelijk maken om een nieuwe node aan te maken in het spelerobject. Ik wilde ook communiceren met het object SpelLeider dat belangrijke gegevens bijhoudt, zoals o.a. het aantal spelers. Vandaar dat ik het Object had meegegeven als parameter, maar hierdoor crasht mijn compiler blijkbaar :P .

ps: later ga ik dit stukje code sowieso nog aanpassen want ik ga ook aan de velden triple, carre, yahtzee, ... standaard de waarde 0 meegeven.

User avatar
nasam
Posts: 233
Contact:

Post#17 » Fri Feb 06, 2009 3:14 pm

De reden dat de compiler hier crasht is dat de naam van een variabele/parameter hetzelfde is als het type. Oberon snapt dat niet zo goed...
Voor de duidelijkheid het gaat over:

Code: Select all

SpelLeider : SpelLeider
Dit is trouwens ook tegen de OCC => de variabele/parameter mag niet met een hoofdletter starten (juist om deze reden?).

EDIT:
Ik ben trouwens ook niet overtuigd van de juistheid van volgende code

Code: Select all

 l^.nr := INC(cur^.prev^.nr); 
INC geeft niets terug, verandert alleen maar de waarde van de parameter.
Wat jij (wss) bedoelt is

Code: Select all

 l^.nr := cur^.prev^.nr + 1; 
EDIT 2:
Ben je er trouwens zeker van dat cur^.prev^ een waarde heeft in het begin (volgens mij niet, maar ik ken de rest van je code natuurlijk niet...) dus wss gaat je programma crashe bij het uitvoeren...

EDIT 3:
De procedure Add hangt vast aan Speler en heeft als parameter SpelLeider.

Is het niet logischer dat de procedure Add vasthangt aan SpelLeider met als parameter Speler? (Ik ken de rest van je design natuurlijk niet)
http://www.nathansamson.be" onclick="window.open(this.href);return false; Flattr me!Image

User avatar
racekakje
WOZ
Posts: 740

Post#18 » Sat Feb 07, 2009 4:37 am

1 ook niet als variabele gebruiken!

Ik denk zelfs dat het niet mag, maar mocht het toch kunnen dan krijg je problemen met i := i + 1 etc..

User avatar
nasam
Posts: 233
Contact:

Post#19 » Sat Feb 07, 2009 1:54 pm

racekakje wrote:1 ook niet als variabele gebruiken!

Ik denk zelfs dat het niet mag, maar mocht het toch kunnen dan krijg je problemen met i := i + 1 etc..
1 (één) is geen variabele (en het mag ook niet, want een varnaam moet beginnen met een letter of een _, maar niet met een cijfer), het is de kleine letter L (allez, daar ga ik toch vanuit)
http://www.nathansamson.be" onclick="window.open(this.href);return false; Flattr me!Image

Glenn
Posts: 280

Post#20 » Sat Feb 07, 2009 3:11 pm

nasam wrote:De reden dat de compiler hier crasht is dat de naam van een variabele/parameter hetzelfde is als het type. Oberon snapt dat niet zo goed...
Voor de duidelijkheid het gaat over:

Code: Select all

SpelLeider : SpelLeider
Dit is trouwens ook tegen de OCC => de variabele/parameter mag niet met een hoofdletter starten (juist om deze reden?).

EDIT:
Ik ben trouwens ook niet overtuigd van de juistheid van volgende code

Code: Select all

 l^.nr := INC(cur^.prev^.nr); 
INC geeft niets terug, verandert alleen maar de waarde van de parameter.
Wat jij (wss) bedoelt is

Code: Select all

 l^.nr := cur^.prev^.nr + 1; 
EDIT 2:
Ben je er trouwens zeker van dat cur^.prev^ een waarde heeft in het begin (volgens mij niet, maar ik ken de rest van je code natuurlijk niet...) dus wss gaat je programma crashe bij het uitvoeren...

EDIT 3:
De procedure Add hangt vast aan Speler en heeft als parameter SpelLeider.

Is het niet logischer dat de procedure Add vasthangt aan SpelLeider met als parameter Speler? (Ik ken de rest van je design natuurlijk niet)
-> Merci voor de uitleg over het crashen van de compiler :).

EDIT 2-> Ja, dat is inderdaad fout. Ik kan natuurlijk het nummer pas gaan toekennen nadat ik mijn current op het laatste element heb gezet. Als dan blijkt dat cur^.prev niet NIL is, hem de waarde geven van de vorige + 1 (op de manier die jij dan beschreven hebt), en als dat niet het geval is de waarde 1 toekennen.

Eigenlijk is het inderdaad wel logischer om dat onder SpelLeider te plaatsen, ik ga dat veranderen en er nog eens goed over nadenken.

User avatar
Scheder
Posts: 212

Post#21 » Tue Feb 17, 2009 4:40 pm

nasam wrote:
Shinta wrote:

Code: Select all


dobbelsteen^.i := DROPFRACTIONALPART(RandomNumbers.Uniform() * 5 + 1);
ENTIER(RandomNumbers.Uniform()*5+1);

wordt dat dus
Het getal wordt in een INTEGER geplaatst...
Is da dan nog nodig?
Dan wordt het fractioneel deel toch automatisch gedropt?

User avatar
Tom
Posts: 602

Post#22 » Tue Feb 17, 2009 5:31 pm

Als je geen ENTIER gebruikt probeer je een float in een integer te steken, en dat gaat niet zomaar. Verder wil je ook naar beneden afronden bij bijvoorbeeld 6.9.

User avatar
Scheder
Posts: 212

Post#23 » Wed Feb 18, 2009 10:17 pm

Tom wrote:Als je geen ENTIER gebruikt probeer je een float in een integer te steken, en dat gaat niet zomaar. Verder wil je ook naar beneden afronden bij bijvoorbeeld 6.9.
INT DIV FLOAT, geeft toch een INT trug?

User avatar
nasam
Posts: 233
Contact:

Post#24 » Wed Feb 18, 2009 10:26 pm

Scheder wrote:
Tom wrote:Als je geen ENTIER gebruikt probeer je een float in een integer te steken, en dat gaat niet zomaar. Verder wil je ook naar beneden afronden bij bijvoorbeeld 6.9.
INT DIV FLOAT, geeft toch een INT trug?
Ik ben niet zeker of dit ook maar kan, maar zelfs als zou het kunnen: wat zou dan de INT en wat de FLOAT/REAL zijn?

volgens de Oberon Language report:
The operators DIV and MOD apply to integer operands only. They are related by the following
formulas defined for any dividend x and positive divisors y:
x = (x DIV y) * y + (x MOD y)
0 ≤ (x MOD y) < y
INT DIV REAL gaat dus idd niet.
http://www.nathansamson.be" onclick="window.open(this.href);return false; Flattr me!Image

User avatar
Tom
Posts: 602

Post#25 » Thu Feb 19, 2009 12:30 am

Ja, met FLOAT (afkomstig van het Engelse "floating point") bedoelen we dus het sleutelwoord REAL in de programmeertaal Oberon.
Scheder wrote:
Tom wrote:Als je geen ENTIER gebruikt probeer je een float in een integer te steken, en dat gaat niet zomaar. Verder wil je ook naar beneden afronden bij bijvoorbeeld 6.9.
INT DIV FLOAT, geeft toch een INT trug?
Zoals nasam gevonden heeft in de "Oberon Language Report" ondersteund dat enkel integer operanden.

Return to “1ste Bachelor”

Who is online

Users browsing this forum: No registered users and 59 guests