Ducati: making mechanics out of riders since 1946
Klaar voor een nieuwe uitdaging.
ik denk grieks
[/bijdehand mode]
Leef lekker in het nu, er is niks anders
Op woensdag 17 oktober 2001 10:56 schreef FireFoz het volgende:
[bijdehand mode]
ik denk grieks
[/bijdehand mode]
Ja man
return kaartenRij (zonder []) zou denk ik moeten werken...
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
melp
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
Geef voortaan de foutmelding.Op woensdag 17 oktober 2001 10:42 schreef MayaFreak het volgende:
ik dacht misschien zo, maar dat werkt niet.
iemand een idee?
Nu is dit niet zo'n moeilijke error maar toch.
mbravenboer heeft het antwoord al gegeven..
foeiminne: Of maak kaartenRij[] gewoon public...
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
thnxOp woensdag 17 oktober 2001 10:59 schreef mbravenboer het volgende:
Java
return kaartenRij (zonder []) zou denk ik moeten werken...
hoe kan ik nu de return waarde gebruiken in andere methode?
Ducati: making mechanics out of riders since 1946
1
2
3
4
5
6
| int [] result = new int [ aantal ]; result = vulkaartenRij ( andereArray ); for ( int a = 0; a < result.length; a++ ) System.out.println ( a ); |
toch
* drm heeft al een tijdje geen java meer gedaan...
Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz
door hem mee te geven aan die andere methode..Op woensdag 17 oktober 2001 14:03 schreef MayaFreak het volgende:
[..]
thnx
hoe kan ik nu de return waarde gebruiken in andere methode?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
| package memory;
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet
{
int invoer = 20;
TextField invoerveld;
Button knopDeel;
Label beschr;
Spel spel= new Spel(invoer);
public void init()
{
beschr = new Label("Vul hier het aantal paren in (1 tm 20)");
invoerveld = new TextField("Hier intikken svp");
knopDeel = new Button("Deel");
add (beschr);
add (invoerveld);
add (knopDeel);
}
public void paint(Graphics g)
{
spel.tekenveld(g,invoer);
spel.resetWaarden();
}
public boolean action(Event e,Object o)
{
if(e.target == knopDeel)
{
repaint();
return true;
}
return false;
}
}
class Kaarten
{
int invoer;
int[] kaartenRij;
Kaarten(int invoer)
{
this.invoer = invoer;
System.out.println(invoer); //levert 0!!!!
kaartenRij = new int[invoer];
}
int[] vulkaartenRij()
{
for (int i=0;i<kaartenRij.length; i++)
{
kaartenRij[i]=i+1;
}
return kaartenRij;
}
}
class Spel
{
int invoer;
int xpos,ypos;
int getal;
int[] dumpRij;
int[] volkaartenRij;
Kaarten k = new Kaarten(invoer);
Spel(int invoer)
{
this.invoer = invoer;
System.out.println(invoer); //levert 20
}
/**
* pakt een willekeurig getal uit volkaartenRij[]
* en tekent een kaart en herhaald dat
*/
public void tekenveld(Graphics g, int invoer)
{
volkaartenRij = k.vulkaartenRij();
for(int i=0;i<volkaartenRij.length;i++)
{
volkaartenRij[(int) ((this.invoer-1)* Math.random())] = getal;
g.drawString(""+getal,xpos+10,ypos+20);
g.drawRect(xpos,ypos,30,30);
xpos += 30;
}
}
void resetWaarden()
{
xpos =0;
ypos = 90;
}
} |
Waarom levert de eerste System.out.prinln(invoer) 0?
Ducati: making mechanics out of riders since 1946
1
2
3
4
5
6
7
| public class Applet1 extends Applet
{
int invoer = 20;
TextField invoerveld;
Button knopDeel;
Label beschr;
Spel spel= new Spel(invoer); |
Dit is het initialiseren van variabelen. Dit wordt gedaan op het moment dat de klass wordt aangemaakt. Bij bovenstaande code zou je dus verwachten dat invoer de waarde 20 heeft.. maar..
de compiler kan en mag de volgorde van deze regels omdraaiien. hij mag dus bijvoorbeeld eerst alle variabelen aanmaken en ze dan pas van waarde voorzien.
Dit verklaard waarom invoer o kan zijn
stel dat hij er de volgende regels van maakt:
1
2
3
4
5
| public class Applet1 extends Applet
{
int invoer;
Spel spel= new Spel(invoer);
invoer = 20; |
Dit is volkomen legaal, invoer krijgt de waarde 0 bij initialisatie. Daar word een nieuw spel mee aangemaakt. En dan wordt de waarde van invoer op 20 gezet.
(let op dit geld alleen bij ingebouwde typen)
Dit wetende moet je dus zorgen dat je van deze volgorde nooit afhankelijk bent.
Dus moet je wachten met het aanmaken van Spel tot je zeker weet dat invoer de juiste waarde heeft:
1
2
3
4
5
6
7
8
9
10
11
12
| public class Applet1 extends Applet
{
int invoer = 20;
TextField invoerveld;
Button knopDeel;
Label beschr;
Spel spel;
public void init()
{
spel = new Spel(invoer);
beschr = new Label("Vul hier het aantal paren in (1 tm 20)"); |
bij nader inzien klinkt het verhaal van mbravenboer logischer
De instantie variabele invoer krijgt een waarde op het moment dat de constructor wordt aangeroepen. Voordat de de constructor wordt aangeroepen worden echter al de declaraties in je klasse verwerkt. De variabele invoer heeft als beginwaarde dus 0. Met de waarde wordt ook het object Kaarten aangemaakt die opgeslagen wordt in de variabele k. Daarna wordt pas de invoer variabele ingesteld in de constructor.MayaFreak:
code:
1 2 3 4 5 6 7 8 9 10class Spel { int invoer; ... Kaarten k = new Kaarten(invoer); Spel(int invoer) { this.invoer = invoer; }
In het algemeen is het onverstandig en onduidelijk om instantie variabelen gelijk bij hun declaratie in de klasse een waarde te geven. Doe dat liever in de constructor
edit: hum we waren tegelijk bezig
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
Ook dit geeft alweer aan dat het gewoon erg onhandig en onduidelijk is om variabelen al bij de declaratie in de klasse gelijk te initialiseren. Doe dit gewoon in de constructor, daar zijn ze voorwasigh: Dit is het initialiseren van variabelen. Dit wordt gedaan op het moment dat de klass wordt aangemaakt. Bij bovenstaande code zou je dus verwachten dat invoer de waarde 20 heeft.. maar..
de compiler kan en mag de volgorde van deze regels omdraaiien. hij mag dus bijvoorbeeld eerst alle variabelen aanmaken en ze dan pas van waarde voorzien.
Dit verklaard waarom invoer o kan zijn
We zijn het eensDus moet je wachten met het aanmaken van Spel tot je zeker weet dat invoer de juiste waarde heeft
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
| package memory;
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet
{
int invoer;
TextField invoerveld;
Button knopDeel;
Label beschr;
Spel spel;
public void init()
{
spel= new Spel(invoer);
beschr = new Label("Vul hier het aantal paren in (1 tm 20)");
invoerveld = new TextField("Hier intikken svp");
knopDeel = new Button("Deel");
add (beschr);
add (invoerveld);
add (knopDeel);
}
public void paint(Graphics g)
{
spel.tekenveld(g,invoer);
spel.resetWaarden();
}
public boolean action(Event e,Object o)
{
if(e.target == knopDeel)
{
invoer = Integer.parseInt(invoerveld.getText());
repaint();
return true;
}
return false;
}
}
class Kaarten
{
int invoer;
int[] kaartenRij;
Kaarten(int invoer)
{
this.invoer = invoer;
System.out.println(invoer); //levert 0!!!!
kaartenRij = new int[invoer];
}
/**
* vult de array met de waarden 1- max 20
*/
int[] vulkaartenRij()
{
for (int i=0;i<kaartenRij.length; i++)
{
kaartenRij[i]=i+1;
}
return kaartenRij;
}
}
class Spel
{
int invoer;
int xpos,ypos;
int getal;
int[] dumpRij; //om te checken welke getallen er al getekend zijn
int[] volkaartenRij;
Kaarten k = new Kaarten(invoer);
Spel(int invoer)
{
this.invoer = invoer;
System.out.println(invoer); //levert 20
}
/**
* pakt een willekeurig getal uit veld[]
* en tekent een kaart en herhaald dat
*/
public void tekenveld(Graphics g, int invoer)
{
volkaartenRij = k.vulkaartenRij(); //volkaaartenRij wordt de returnwaarde kaartenRij
for(int i=0;i<volkaartenRij.length;i++)
{
volkaartenRij[(int) ((this.invoer-1)* Math.random())] = getal;
g.drawString(""+getal,xpos+10,ypos+20);
g.drawRect(xpos,ypos,30,30);
xpos += 30;
}
}
void resetWaarden()
{
xpos =0;
ypos = 90;
}
} |
(Ik heb alleen wat verandert in boolean action)
Nu geven beide System.out.println 0 (dat is logisch!), maar als je via het textvak (bijvoorbeeld) 5 invuld blijven de beide op 0 staan
Ducati: making mechanics out of riders since 1946
Wel een paar tips:
1. Gebruik geen public boolean action(bla) want dat is heel erg deprecated. De goede manier om akies af te vangen is via een ActionListener. Je moet een ActionListener implementeren voor die knop en daarna aanmelden op de knop. Je events komen dan binnen via de methode actionPerformed.
2. Die variabele invoer is op heel veel plekken te vinden en wordt zelfs ook nog op een aantal plaatsen als parameter meegegeven. Dat werkt erg verwarrend en zorgt snel voor fouten. Probeer eens of je de status van je spel niet in een model (1 of meer klassen) kan representeren. Dat is een stuk makkelijker en de code wordt duidelijker.
3. Probeer het aantal instantie-variabelen te beperken. Je hebt vrij veel variabelen in de klassen zelf gedefinieerd.
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment
> maak variabelen private en gebruik getters en setters
> kies logische namen niet k
> geef je class een duidelijke naam en niet Applet1
> gebruikt voor action's een actionHandler en geen deprecated methode
1
2
3
4
5
6
7
8
9
10
| public void tekenveld(Graphics g, int invoer)
{
volkaartenRij = k.vulkaartenRij(); //volkaaartenRij wordt de returnwaarde kaartenRij
for(int i=0;i<volkaartenRij.length;i++)
{
volkaartenRij[(int) ((this.invoer-1)* Math.random())] = getal;
g.drawString(""+getal,xpos+10,ypos+20);
g.drawRect(xpos,ypos,30,30);
xpos += 30;
} |
tuurlijk blijft invoer van spel op 0 staan je wijzigd hem toch ook niet?
Bedankt voor de tips, en wat betreft boolean action: dat moeten we gebruiken van de school!
Maar hij ziet er voor de rest wel goed uit?
Ducati: making mechanics out of riders since 1946
MooiMayaFreak: Ik heb hem werkende!
Hum.... ach, het is pas 3 jaar deprecatedBedankt voor de tips, en wat betreft boolean action: dat moeten we gebruiken van de school!
Het is nog een behoorlijke brei, waardoor het programmeren juist erg lastig gaat... Als je OO echt goed te pakken gaat krijgen (dat zal vast wel komenMaar hij ziet er voor de rest wel goed uit?
Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment