Autor Beitrag
lapadula
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 14:39 
Hallo, ich bin gerade dabei eine Aufgabe aus dem Buch "C# von Kopf bis Fuß" zu lösen.

Der Folgende Codesnippet stamm aus einer Musterlösung. Ich muss leider C# 2005 Express benutzen und dort wird der Code nicht compiliert. In C# 2015 Express funktionert alles.

Weiss noch jemand wie die alte Syntax für den folgenden Code ging?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
greyhounds = new Greyhound[4]
{
  new Greyhound() {MyRandom = myRandomizer, MyPictureBox = pbDog1, StartingPosition = start, RacetrackLength = finish},
  new Greyhound() {MyRandom = myRandomizer, MyPictureBox = pbDog2, StartingPosition = start, RacetrackLength = finish},
  new Greyhound() {MyRandom = myRandomizer, MyPictureBox = pbDog3, StartingPosition = start, RacetrackLength = finish},
  new Greyhound() {MyRandom = myRandomizer, MyPictureBox = pbDog4, StartingPosition = start, RacetrackLength = finish}
};


Moderiert von user profile iconTh69: Quode- durch C#-Tags ersetzt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 26.05.16 14:49 
Hallo und :welcome:

das ist mit C# 2.0 etwas umständlicher. Entweder du mußt einen Konstruktor für die Klasse erstellen, welcher diese Eigenschaften setzt oder zumindestens eine Methode erzeugen, welche das dann tut:
ausblenden C#-Quelltext
1:
2:
3:
new Greyhound(myRandomizer, pbDog1, start, finish}
// oder
CreateGreyHound(myRandomizer, pbDog1, start, finish}

Wie man so einen Konstruktor oder Methode schreibt, weißt du hoffentlich? ;-)

PS: Warum mußt du noch das veraltete VS 2005 benutzen?


Zuletzt bearbeitet von Th69 am Do 26.05.16 14:49, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: lapadula
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 26.05.16 14:49 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
Greyhound[] greyhounds = new Greyhound[4];
greyhounds[0] = new Greyhound();
greyhounds[0].MyRandom = myRandomizer;
greyhounds[0].MyPictureBox = pbDog1;
greyhounds[0].StartingPosition = start;
greyhounds[0].RacetrackLength = finish;
// und wiederhole das ganze für jedes Element


Ist vermutlich nicht hilfreich beim lernen wenn man einen alten Compiler mit neuem Lehrbuch verwendet.
Versuche das anzugleichen.

Für diesen Beitrag haben gedankt: lapadula
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 14:58 
Das ging ja schnell, danke :) Ich versuch das gleich nochmal.

Also in der Schule benutzen wir c# 2005 deshalb, zuhause habe ich 2015 express und 2005. Wenn ich die Hausaufgaben zuhause mit der neuen version erstelle, kann das der compiler in der schule nicht compilieren.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Do 26.05.16 15:05 
Ja sowas ist typisch Schule. Als ich noch auf der Realschule war (2009) haben wir in QBasic programmiert. Das war auch eine Erfahrung...

Auf der Uni wirds dann besser, falls dich dein Weg dahin fürt ;)

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 15:21 
Habe noch eine Frage :)

und zwar folgendes geht mal wieder nicht im alten compiler

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 private Wette ErstelleLeereWette() 
        {
            
            return new Bet() { Amount = 0, Dog = 0, Bettor = this };
            
        }


Wenn ich nun sowas probiere, dann kann er wieder nicht auf die Felder drauf, meckert aber wenigstens wegen der Syntax nicht mehr. Außerdem kann der den Code nach return doch sicher nicht mehr erreichen, wegen dem ; nach return.

Weiss da jemand mehr?

ausblenden C#-Quelltext
1:
return new Wette(); {Betrag = 0; Hund = 0; Wetter = this; };					


Beim Konstruktor sind wir noch nicht.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 26.05.16 15:33 
Das Feature, hinter dem Konstruktor in {} das setzen von Properties der Klasse zu erlauben, heißt Intializer und das hast du einfach nicht in VS 2005.
Du musst die Klasse an einer Variable erzeugen dann über die Variable die Properties setzen und das dann zurückgeben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
private Wette ErstelleLeereWette() 
{
   Bet bet = new Bet();
   bet.Amount = 0;
   bet.Dog = 0;
   bet.Bettor = this;
   return bet;
}


Vermeide denglisch. Schreib das in englisch oder deutsch. Das man auf eine andere Sprache ausweicht weil einem irgendwann die Namen ausgehen etwas sinnvoll zu benennen ist leider üblich bei vielen Programmierern aber eine absolute Unart (Bet <-> Wette, Hund <-> Dog, Bettor <-> Wetter etc.). Entscheide dich für eine Sprache und bleib dabei.

Ps. Deine ErstelleLeereWette Methode wäre eine super Kandidat dafür einen Konstruktor von Bet/Wette zu sein.


Zuletzt bearbeitet von Ralf Jansen am Do 26.05.16 17:39, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: lapadula
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 15:56 
Ich danke dir!

Ich muss zugeben ich komme schon ein wenig durcheinander. Ist echt blöd mit VS2005, bei Delphi sind wir wenigstens auf Version 7 :/
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 26.05.16 17:38 
Zitat:
Ist echt blöd mit VS2005, bei Delphi sind wir wenigstens auf Version 7 :/


Öhm. VS 2005 ist von 2005 und dann gab es 5 neuere Version danach. Delphi 7 ist von 2002 und danach gab es so ungefähr 18 neuere Versionen. Wenigsten klingt da ein wenig komisch ;)
Doof ist es aber natürlich trotzdem das man bei euch nicht einfach die aktuellste Version eines kostenlosen Produkts nimmt. Aber ich vermute wenn man mal einen Lehrer fragt bürokratisch fundierte Ausreden (primär der Schulen nicht der Lehrer) finden sich bestimmt ;)
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 20:33 
So ich bin soweit fertig mit der Aufgabe. Es gibt keine Fehler mehr aber er meckert an einer Stelle beim compilieren und ich komme nicht drauf was er will. Für mich scheint alles richtig zu sein.


Klasse Windhund
ausblenden volle Höhe C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;

namespace Wettbüro
{
    class Windhund
    {
        public int StartPosition;
        public int RennstreckenLänge;
        public PictureBox MeinePictureBox = null;
        public int Location = 0
        public Random Zufallszahl;

        public Windhund()
        {
            Location = 0;
            MeinePictureBox = new PictureBox();
            Zufallszahl = new Random();
            RennstreckenLänge = 100;
            StartPosition = 0;
        }

        public bool Rennen()
        {
            // Zufällig 1,2,3 oder 4 Schritte nach vorne laufen
            int schritte = Zufallszahl.Next(14);
            Location += schritte;

            // Position auf der PictureBox aktualisieren
            PictureBoxBewegen(schritte);

            // Liefer true, wenn das Rennen gewonnen wurde
            return schritte > RennstreckenLänge;
        }

        private void PictureBoxBewegen(int schritte)
        {
            Point p = MeinePictureBox.Location;
            p.X = Location;
            MeinePictureBox.Location = p;
        }

        public void StartPositionEinnehmen()
        {
            Location = StartPosition;

            Point p = MeinePictureBox.Location;
            p.X = Location;
            MeinePictureBox.Location = p;
        }

    }
}


Klasse Wette

ausblenden volle Höhe C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Text;

namespace Wettbüro
{
    class Wette
    {
        public int Betrag ; // Der Betrag der gewettet wurde
        public int Hund; // Die Nummer des Hundes, auf den gewettet wird
        public Spieler Wetter; // Der Spieler der die Wette plaziert hat

        public string Bezeichnung()
        {
            // Wer hat die Wette plaziert, wie viel und auf welchen Hund
            // "Tim wettet 10€ auf Hund Nr. 1"
            // Wenn der Betrag 0 ist, wurde keine Wette plaziert
            // "Tim hat keine Wette plaziert"
            if (KeineWettePlaziert())
            {
                return string.Format("{0} hat keine Wette plaziert", Wetter.Name);
            }
            else
            {
                return string.Format("{0} wettet {1} EUR auf Hund #{2}", Wetter.Name, Betrag, Hund); //
            }
        }

        public int Auszahlung(int sieger)
        {
            //Der Sieger ist der Gewinner des Spiels.
            //Wenn sein Hund gewonnen hat, gebe den Betrag zurück
            //sonst gebe einen negativen Betrag zurück.

            if (MeinHund(sieger))
            {
                return Betrag;
            }
            else
            {
                return -Betrag;

            }
        }

        private bool MeinHund(int sieger)
        {
            return sieger == Hund;
        }

        private bool KeineWettePlaziert()
        {
            return Betrag == 0;
        }
    }
}


Klasse Spieler

ausblenden volle Höhe C#-Quelltext
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:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Wettbüro
{
    class Spieler
    {
        public string Name; //Name des Spielers
        public Wette MeineWette; // Instanz von Wette() die die Wette enthählt
        public int Geld; // Geldbetrag des Spielers

        public RadioButton MeineRadioButton;
        public Label MeinLabel;
 
        public Spieler()
        {
            MeineWette = ErstelleLeereWette();
        }

        public void LabelAktualisieren()
        {
            //
            MeinLabel.Text = MeineWette.Bezeichnung();

            //Radiobutton für den Geldbetrag("Tim hat 40 EUR")
            MeineRadioButton.Text = NimmRadioButtonText();

        }

        public void WetteLöschen()
        {
            //Wette annullieren
            MeineWette = ErstelleLeereWette();
        }

        public bool PlaziereWette(int betrag, int hund)
        {
            const int MinimumEinsatz = 5;
            const int MaximumEinsatz = 15;
            if (betrag > Geld || betrag < MinimumEinsatz || betrag > MaximumEinsatz)
            {
                MeineWette = ErstelleLeereWette();
                return false;
            }
            
            // Plaziere eine neue Wette und speicher diese in MeineWette Var
            MeineWette = new Wette();  
            MeineWette.Betrag = betrag; 
            MeineWette.Hund = hund; 
            MeineWette.Wetter = this;

            // Liefer true zurück, wenn der Spieler genug Geld hat
            return true;
        }

        public void Auszahlen(int sieger)
        {
            Geld += MeineWette.Auszahlung(sieger);
        }

        private Wette ErstelleLeereWette() 
        {
            Wette wette = new Wette();
            wette.Betrag = 0;
            wette.Hund = 0;
            wette.Wetter = this;
            return wette;
            
        }

        

        private string NimmRadioButtonText()
        {
            return string.Format("{0} hat {1} EUR", Name, Geld);
        }

            

    }
}


Und meine Form1 Klasse in der der Fehler kommt: Null Reference Exception was unhandled bei der Stelle:
ausblenden C#-Quelltext
1:
2:
3:
private void FormularAktualisieren()
        {
            for (int spielerNum = 0; spielerNum < spieler.Length; spielerNum++) speziell hier: spielerNum < spieler.Length

Jemand eine Idee woran es liegt?

ausblenden volle Höhe C#-Quelltext
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:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.Linq;

namespace Wettbüro
{
    public partial class Form1 : Form
    {
        private Windhund[] windhunde;
        private Spieler[] spieler;
        private Spieler ausgewählerSpieler;

        public Form1()
        {
            InitializeComponent();

            Random meineZufallszahl = new Random();

            int start = pictureBox1.Location.X;
            int ende = pictureBox1.Width - 65;

            Windhund[] windhunde = new Windhund[4];

            windhunde[0] = new Windhund();
            windhunde[0].Zufallszahl = meineZufallszahl;
            windhunde[0].MeinePictureBox = pictureBox2;
            windhunde[0].StartPosition = start;
            windhunde[0].RennstreckenLänge = ende;

            windhunde[1] = new Windhund();
            windhunde[1].Zufallszahl = meineZufallszahl;
            windhunde[1].MeinePictureBox = pictureBox3;
            windhunde[1].StartPosition = start;
            windhunde[1].RennstreckenLänge = ende;

            windhunde[2] = new Windhund();
            windhunde[2].Zufallszahl = meineZufallszahl;
            windhunde[2].MeinePictureBox = pictureBox4;
            windhunde[2].StartPosition = start;
            windhunde[2].RennstreckenLänge = ende;

            windhunde[3] = new Windhund();
            windhunde[3].Zufallszahl = meineZufallszahl;
            windhunde[3].MeinePictureBox = pictureBox5;
            windhunde[3].StartPosition = start;
            windhunde[3].RennstreckenLänge = ende;

            Spieler[] spieler = new Spieler[3];

            spieler[0] = new Spieler();
            spieler[0].Name = "Joe";
            spieler[0].Geld = 50;
            spieler[0].MeineRadioButton = radioButton1;
            spieler[0].MeinLabel = label4;

            spieler[1] = new Spieler();
            spieler[1].Name = "Bob";
            spieler[1].Geld = 50;
            spieler[1].MeineRadioButton = radioButton2;
            spieler[1].MeinLabel = label4;

            spieler[2] = new Spieler();
            spieler[2].Name = "Al";
            spieler[2].Geld = 50;
            spieler[2].MeineRadioButton = radioButton3;
            spieler[2].MeinLabel = label4;

            ausgewählerSpieler = spieler[0];
            radioButton1.Tag = spieler[0];
            radioButton2.Tag = spieler[1];
            radioButton3.Tag = spieler[2];

            FormularAktualisieren();
        }

        private void radioButton1_CheckedChanged(object sender, EventArgs e)
        {
            ausgewählerSpieler = WirdAusgewählt(sender);
            label1.Text = ausgewählerSpieler.Name;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            AktualisiereMinimumLabel();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int wette = (int)numericUpDown1.Value;
            int hund = (int)numericUpDown2.Value;
            ausgewählerSpieler.PlaziereWette(wette, hund);
           
            FormularAktualisieren();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;

            bool nichtGewonnen = true;
            while (nichtGewonnen)
            {
                for (int hund = 0; hund < windhunde.Length; hund++)
                {
                    Application.DoEvents();
                    if (windhunde[hund].Rennen())
                    {
                        DerGewinner(hund);
                        AuszahlenBeiSieg(hund);
                        nichtGewonnen = false;
                    }
                }
            }

            FormularAktualisieren();

            button1.Enabled = true;
        }

        private void DerGewinner(int hund)
        {
            MessageBox.Show(string.Format("Windhund {0} hat gewonnen!", hund + 1));
        }

        private void AuszahlenBeiSieg(int hund)
        {
            for (int spielerNummer = 0; spielerNummer < spieler.Length; spielerNummer++)
            {
                spieler[spielerNummer].Auszahlen(hund + 1);
                spieler[spielerNummer].WetteLöschen();
            }
        }

        private void AktualisiereMinimumLabel()
        {
            label7.Text = string.Format("Minimum Wetteinsatz: {0} EUR", numericUpDown1.Value);
        }

        private Spieler WirdAusgewählt(object sender)
        {
            RadioButton rb = (RadioButton)sender;
            return (Spieler)rb.Tag;
        }

        private void FormularAktualisieren()
        {
            for (int spielerNum = 0; spielerNum < spieler.Length; spielerNum++)
            {
                spieler[spielerNum].LabelAktualisieren();
            }

            for (int hund = 0; hund < windhunde.Length; hund++)
            {
                windhunde[hund].StartPositionEinnehmen();
            }

            AktualisiereMinimumLabel();
        }
    }
}


Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 26.05.16 20:55 
Hallo,

der Fehler kommt daher, dass Du im Konstruktor der Form folgende Zeilen hast:

ausblenden C#-Quelltext
 
28:
/* ... */
Windhund[] windhunde = new Windhund[4];

ausblenden C#-Quelltext
 
55:
/* ... */
Spieler[] spieler = new Spieler[3];


Hier deklarierst Du neue, lokale Variablen und befüllst diese. Was Du eigentlich tun möchtest, ist, auf die gleichnamigen Felder der Klasse zugreifen.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Do 26.05.16 21:25 
Heisst ich soll Windhund[] windhunde = new Windhund[4]; und Spieler[] spieler = new Spieler[3]; entfernen?
Oder wie gehts das in .Net 2.0?

Stehe aufm Schlauch :/
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 26.05.16 21:56 
user profile iconlapadula hat folgendes geschrieben Zum zitierten Posting springen:
Heisst ich soll Windhund[] windhunde = new Windhund[4]; und Spieler[] spieler = new Spieler[3]; entfernen?

Du greifst doch in den anderen Klassen auch auf Felder zu, wie machst Du es denn da? :)

user profile iconlapadula hat folgendes geschrieben Zum zitierten Posting springen:
Oder wie gehts das in .Net 2.0?

Das geht in jeder Version von C# gleich ;)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Fr 27.05.16 11:51 
Habs, danke nochmal :) Funktioniert jetzt alles wie es soll
lapadula Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 180
Erhaltene Danke: 10



BeitragVerfasst: Fr 27.05.16 13:57 
Ich lade meinen Projektordner hoch, damit jeder was davon hat, falls er nach der Lösung sucht :)

Ist für das Buch C# von Kopf bis Fuß, Workshop 1.
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Christian S.