Autor |
Beitrag |
birdylicious
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 11.03.14 17:58
Hallo Zusammen,
hoffe ich bin hier im richtigen Forum, mit einer Frage zu meinem c# Konsolen Projekt Mastermind.
Ich bin noch ein Anfänger im Programmieren und habe ein Problem damit meine funktion "start()" aus einer anderen Klasse aufzurufen da sie keine Argumente annimmt (?)
Hier rufe ich die Funktion auf:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| static void Main(string[] args) { Master v1 = new Master(); WinMaster v2 = new WinMaster(); while (true) { v2.Menü(); int menüeingabe = Convert.ToInt32(Console.ReadLine()); switch (menüeingabe) { case 1: { v1.start(); break; } |
und so sieht die Funktion aus:
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:
| public void start(string templower, int schwarzerpin, int weißerpin) { int Versuche = 0; string[] Lösungsversuch; Console.Clear(); Console.SetCursorPosition(0, 0); Console.ForegroundColor = ConsoleColor.DarkCyan; Console.WriteLine("Gib deinen Versuch ein und bestätige mit Enter."); Console.WriteLine("Dein Versuch muss 5 Stellen sein"); Console.WriteLine("Es können nur folgende Farben enthalten sein:"); Console.WriteLine("''b'' für blue, ''g'' für green, ''y'' für yellow,"); Console.WriteLine("''c'' für cyan, ''r'' für red, ''m'' für magenta, "); Console.WriteLine("''w'' für white und ''d'' für darkgrey"); do { string Input = Console.ReadLine(); k2.eingabe(Input); if (templower == "0") { Console.WriteLine("Falsche Eingabe"); k2.eingabe(Input); } Lösungsversuch = new string[templower.Length]; for (int i = 0; i < templower.Length; i++) { Lösungsversuch[i] = Convert.ToString(templower[i]); }
getSchwarz(templower); if (schwarzerpin == 5) { Console.Clear(); Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine("Du hast gewonnen"); Console.WriteLine("Du hast es in {0} Versuchen geschafft", Versuche); if (Versuche <= 10) { Console.WriteLine("WOW, Sehr gut"); } else if (Versuche > 10 && Versuche <= 20) { Console.WriteLine("Nicht schlecht"); } Console.WriteLine("Da müssen wir noch dran arbeiten"); break; } getWeiss(templower); Console.ForegroundColor = ConsoleColor.White; Console.SetCursorPosition(Versuche, Versuche + 6); Console.Write("Versuch _ Deine Eingabe ___ Schwarze Stifte ___ Weiße Stifte "); Console.SetCursorPosition(Versuche + 2, Versuche + 7); Console.Write("{0}", Versuche); Console.SetCursorPosition(Versuche + 13, Versuche + 7); foreach (var farbe in Lösungsversuch) { Console.Write(farbe.ToString()); } Console.SetCursorPosition(Versuche + 33, Versuche + 7); Console.Write(schwarzerpin); Console.SetCursorPosition(Versuche + 53, Versuche + 7); Console.Write(weißerpin);
Versuche++; } while (Versuche < 30); { Console.Clear(); Console.SetCursorPosition(50, 50); Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Du hast leider verloren"); } } |
Die Funktion Start gibt an 3 andere Funktionen Werte und bekommt dafür auch Werte wieder. Aber warum kommt nun die Fehlermeldung "Keine Überladung für die Methode 'start' nimmt 0-Argumente an."
Danke im Vorraus für die Hilfe.
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 11.03.14 18:13
In deine Main rufst du die Methode so auf
Zitat: | C#-Quelltext |
definiert ist die Methode aber so.
Zitat: | C#-Quelltext 1:
| public void start(string templower, int schwarzerpin, int weißerpin) | |
Die 3 Parameter sind nicht optional sondern müssen übergeben werden.
Was du da konkret übergeben must erschließt sich mir nicht auf anhieb. Dazu sind im Code der Start Methode selbst noch zuviel Ungereimtheiten. Ich gehe aber mal davon aus das es nicht dein Code ist so wie du andeutest sondern fertiger Code den du korrigieren sollst im Rahmen einer Schulaufgabe?
|
|
birdylicious 
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 11.03.14 19:11
Hallo Ralf Jansen, danke für die schnelle Antwort.
Nein, das ist mein Code.
die 3 Parameter die in "public void start(string templower, int schwarzerpin, int weißerpin)" stehen sind dort, weil ich in der Funktion start(), 3 weitere Funktionen aufrufe (k2.eingabe(input) - der ich einen Input übergebe und dafür einen Input zurückbekomme (das ist der string templower) und getschwarz(templower) und getweiß(templower) denen ich templower übergebe und dafür die ints' schwarzerpin und weißerpin "returned" bekomme))
Jetzt ist natürlich die frage ob ich die Funktionen anders innerhalb dieser start() funktion aufrufen kann, damit keine 3 Parameter gegeben sind, die wie du sagst, übergeben werden müssen (was ich natürlich nicht möchte)
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 11.03.14 20:20
Zitat: | der ich einen Input übergebe und dafür einen Input zurückbekomme (das ist der string templower |
Nein? In k2.eingabe geht was rein und nix raus. Und das was da rein geht hast du von der Console gelesen. Und das hat keinerlei Zusammenhang zu templower.
Zitat: | getschwarz(templower) und getweiß(templower) denen ich templower übergebe und dafür die ints' schwarzerpin und weißerpin "returned" bekomme)) |
Dito. In die Methoden geht nur was rein. Raus kommt da gar nix.
Da du nirgendwo templower, schwarzerpin oder weißerpin im Code änderst ist der einzige Weg auf dem sie Werte bekommen könnten der das du die der Start Methode mitgibst.
Wenn die gar nicht übergeben werden sollen dann mach die zu lokalen Variablen und weise denen Werte zu. Nachdem was du beschreibst möchtest du offensichtlich das die Ausgaben von
k2.eingabe, getSchwarz, getWeiss in diesen 3 Variablen landen. Im Moment wird aber, wenn die 3 Methoden was zurückliefern, dieses ignoriert und die Rückgabe landet nirgendwo.
|
|
birdylicious 
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 11.03.14 20:36
C#-Quelltext 1: 2:
| string Input = Console.ReadLine(); k2.eingabe(Input); |
In der Funktion eingabe() die sich in der 2. Klasse befindet wird der Input string auf die gewünschte Länge überprüft und anschließend als string "templower" (da er in einen .toLower string unmgewandelt wird) zurückgegeben mit "return templower;" - Daher der Zusammenhang, ich habe mich mit dem "input zurückgegeben falsch ausgedrückt.
In der Parameter Liste erstelle ich den string templower aus dem "returned string templower;" aus der 2. Klasse um ihn in dieser Funktion start() weiter zu verwenden.
Anschließend übergebe ich den beiden Funktionen in der selben Klasse - getschwarz(templower) und getweiß(templower) diesen String um aus ihnen die beiden int "schwarzerpin" und "weißerpin" zu bekommen.
C#-Quelltext 1:
| public void start(string templower, int schwarzerpin, int weißerpin) |
Daher sind hier der string und die beiden int, weil ich diese aus den anderen Funktionen holen möchte. Ich kenne leider keinen anderen/besseren weg dies zu machen. Oder einen der passender für mein Programm wäre.
EDIT:
Danke für die Hilfe, auch wenn es nicht ganz den Projekt Anweisungen enspricht, habe ich die 3 funktionen jetzt in die start() funktion geholt und kann somit erstmal weiterarbeiten
|
|
Ralf Jansen
      
Beiträge: 4708
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Di 11.03.14 21:26
Zitat: | Daher sind hier der string und die beiden int |
Die Variablen heißen vielleicht gleich sind aber nicht das gleiche.
Wenn da was return wird weiße es lokal zu. Aka
Zitat: | string templower; // nicht als Parameter sondern als lokale Variable in der Methode
templower = k2.eingabe(Input); |
Nochmal. Falls es in k2.Eingabe eine Variable gibt die auch templower heißt hat das nichts mit einer Variablen oder einem Methodenparameter zu tun der zufällig auch templower heißt.
Das gleiche gilt dann für die beiden anderen Variablen bzw. Parameter.
|
|
|