| Autor | Beitrag | 
| lapadula 
          Beiträge: 180
 Erhaltene Danke: 10
 
 
 
 
 | 
Verfasst: Do 26.05.16 13: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?
 		Moderiert von                       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}
 };
 |   Th69: Quode- durch C#-Tags ersetzt | 
|  | 
| Th69 
          
  Beiträge: 4800
 Erhaltene Danke: 1059
 
 Win10
 C#, C++ (VS 2017/19/22)
 
 | 
Verfasst: Do 26.05.16 13: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 13:49, insgesamt 1-mal bearbeitet
 Für diesen Beitrag haben gedankt: lapadula
 | 
|  | 
| Ralf Jansen 
          Beiträge: 4708
 Erhaltene Danke: 991
 
 
 VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
 
 | 
Verfasst: Do 26.05.16 13: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 13: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 14: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 14: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: 4708
 Erhaltene Danke: 991
 
 
 VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
 
 | 
Verfasst: Do 26.05.16 14: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 16:39, insgesamt 1-mal bearbeitet
 Für diesen Beitrag haben gedankt: lapadula
 | 
|  | 
| lapadula  
          Beiträge: 180
 Erhaltene Danke: 10
 
 
 
 
 | 
Verfasst: Do 26.05.16 14: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: 4708
 Erhaltene Danke: 991
 
 
 VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
 
 | 
Verfasst: Do 26.05.16 16: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 19: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?
 			Moderiert von									| 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();
 }
 }
 }
 |   Th69: C#-Tags hinzugefügt | 
|  | 
| Christian S. 
          Beiträge: 20451
 Erhaltene Danke: 2264
 
 Win 10
 C# (VS 2019)
 
 | 
Verfasst: Do 26.05.16 19: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 20: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 20: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 10:51 
 
Habs, danke nochmal    Funktioniert jetzt alles wie es soll | 
|  | 
| lapadula  
          Beiträge: 180
 Erhaltene Danke: 10
 
 
 
 
 | 
Verfasst: Fr 27.05.16 12: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.
 | 
|  |