Autor |
Beitrag |
lapadula
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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?
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 Th69: Quode- durch C#-Tags ersetzt
|
|
Th69
Beiträge: 4778
Erhaltene Danke: 1055
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Do 26.05.16 14:49
Hallo und
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:
C#-Quelltext 1: 2: 3:
| new Greyhound(myRandomizer, pbDog1, start, finish} 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 26.05.16 14:49
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; |
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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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#
Beiträge: 561
Erhaltene Danke: 65
Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
|
Verfasst: 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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: Do 26.05.16 15:21
Habe noch eine Frage
und zwar folgendes geht mal wieder nicht im alten compiler
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?
C#-Quelltext 1:
| return new Wette(); {Betrag = 0; Hund = 0; Wetter = this; }; |
Beim Konstruktor sind wir noch nicht.
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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.
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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: 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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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
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() { int schritte = Zufallszahl.Next(1, 4); Location += schritte;
PictureBoxBewegen(schritte);
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
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 ; public int Hund; public Spieler Wetter; public string Bezeichnung() { 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) { if (MeinHund(sieger)) { return Betrag; } else { return -Betrag;
} }
private bool MeinHund(int sieger) { return sieger == Hund; }
private bool KeineWettePlaziert() { return Betrag == 0; } } } |
Klasse Spieler
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; public Wette MeineWette; public int Geld; public RadioButton MeineRadioButton; public Label MeinLabel; public Spieler() { MeineWette = ErstelleLeereWette(); }
public void LabelAktualisieren() { MeinLabel.Text = MeineWette.Bezeichnung();
MeineRadioButton.Text = NimmRadioButtonText();
}
public void WetteLöschen() { 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; } MeineWette = new Wette(); MeineWette.Betrag = betrag; MeineWette.Hund = hund; MeineWette.Wetter = this;
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:
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?
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 Th69: C#-Tags hinzugefügt
|
|
Christian S.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 26.05.16 20:55
Hallo,
der Fehler kommt daher, dass Du im Konstruktor der Form folgende Zeilen hast:
C#-Quelltext 28:
| /* ... */ Windhund[] windhunde = new Windhund[4]; |
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
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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.
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 26.05.16 21:56
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
lapadula
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: Fr 27.05.16 11:51
Habs, danke nochmal Funktioniert jetzt alles wie es soll
|
|
lapadula
Beiträge: 180
Erhaltene Danke: 10
|
Verfasst: 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.
|
|