Funktionen
-
Diese soll nen Werrt zurück geben, quasi einen einzigen.
Wobei mich auch interessiert wie das ist mit mehreren Werten.
-
Einen Wert:
public int Sum(int a, int b) { return a + b; }
Gibt die Summe zweier Integer zurück.
Mehrere Werte:
public int SumAndDif(int a, int b, out int dif) { dif = a - b; return a + b; }
Gibt die Summe der Integer a und b zurück und die Differenz im out-Paramter. Aufgerufen wird das so:
int sum, dif; sum = SumAndDif(1, 2, out dif); // sum ist dann 2, dif -1
-
*Asche aufs Haupt schütt*
sum ist im letzten Beispiel natürlich 3, nicht 2 *erröt*
-
ja trotzdem gibt die funktion nur einen wert zurück, funktionen können NIE mehr als 1 wert zurückgeben, außer du arbeitest mit Referenzen, aber das kann man ja nicht Rückgabe bezeichnen sondern eher als Manipulation
-
Jedoch kann man sich eine Struktur basteln, welche alle Rückgabewerte enthält...
-
Man kann auch mit Kanonen auf Spatzen schießen?
Warum so kompliziert, wenn es auch mit Referenzen geht?
-
jap stimmt...ich denke referenzen reichen aus, außer die rückgabewerte werden komplexe werte
-
Auch komplexe Werte kann man per ref übergeben. Wann man wie mehrere Werte zurück gibt ist sehr individuell. Strukturen, Listen, ref Parameter. An sich ist die Fragestellung vom OP so sehr Grundlagen behaftet, das er diese Fragen in jedem Einstiegskapitel in nahezu jeder Sprache nachlesen kann und an sich keine Diskussionsgrundlage für ein Forum darstellen.
-
O.o schrieb:
Man kann auch mit Kanonen auf Spatzen schießen?
Warum so kompliziert, wenn es auch mit Referenzen geht?
Weil es sauberer ist, weil es sich besser dokumentieren lässt, weil es logischer ist, weil es oft praktischer ist …
da fallen einem schon Gründe ein.
-
Vielen Dank für die Beispiele, werde mich mal dran setzen.
-
Habe da mal was probiert:
public int Zwischenzeit(DateTime t1, DateTime p1, DateTime p2, DateTime p3, DateTime p4) { TimeSpan pause; if (DateTime.Compare(t1, p1) > 0) { pause = t1 - p1; lblpause.Text = Convert.ToString(String.Format("{0}:{1}:{2}", pause.Hours * (-1), pause.Minutes * (-1), pause.Seconds * (-1))); if (DateTime.Compare(t1, p2) < 0) { pause = t1 - p2; lblpause.Text = Convert.ToString(String.Format("{0}:{1}:{2}", pause.Hours * (-1), pause.Minutes * (-1), pause.Seconds * (-1))); } else if (DateTime.Compare(t1, p3) < 0) { pause = t1 - p3; lblpause.Text = Convert.ToString(String.Format("{0}:{1}:{2}", pause.Hours * (-1), pause.Minutes * (-1), pause.Seconds * (-1))); } else if (DateTime.Compare(t1, p4) < 0) { pause = t1 - p4; lblpause.Text = Convert.ToString(String.Format("{0}:{1}:{2}", pause.Hours * (-1), pause.Minutes * (-1), pause.Seconds * (-1))); } else lblpause.Text = "Keine Pausen mehr"; } }
Nun aber bekomme ich als Fehlermeldung:
Fehler 1 "Uhrzeit.Form1.Zwischenzeit(System.DateTime, System.DateTime, System.DateTime, System.DateTime, System.DateTime)": Nicht alle Codepfade geben einen Wert zurück.
Und:
Fehler 2 Keine Überladung für die Zwischenzeit-Methode nimmt 0 Argumente an.
Versteh das nicht so ganz.
-
Fehler 1:
public int Zwischenzeit(DateTime t1, DateTime p1, DateTime p2, DateTime p3, DateTime p4)
In der Deklaration der Methode "Zwischenzeit" steht, dass sie ein int zurück gibt. Deine Methode gibt aber gar nichts zurück (return).
Fehler 2:
Deine Methode ist so deklariert, dass sie 5 DateTime-Objekte als Übergabeparameter erwartet. Nach der Fehlermeldung zu urteilen rufst du sie aber so auf: Zwischenzeit().PS: Bei dir scheint es am grundlegenden Verständins der Programmiersprache zu hapern. Besorg dir am Besten ein anständiges Buch oder ein Tutorial aus dem Internet und arbeite es durch.
-
Die Datetime Objekte hab ich dort nur reing estzt weil er sonst meckerte das Werte angeblich fehlen sollten.
-
Nachtrag, ich hab dort kein Return genutzt, da eine Function nur einen zurückgabewert hat. Was ich hier für suche ist eher eine Prozedure.
-
C(#) macht keinen Unterschied zwischen Funktionen und Prozeduren. Willst du nicht zurückgeben musst du "void" als Rückgabetyp angeben.
public void Zwischenzeiten(...);
Zu den Übergabewerten:
Wenn er meckert, dass die Werte fehlen dann hast du die Variablen so definiert, dass sie im Scope der Funktion "Zwischenzeiten" nicht sichtbar sind. Entweder du übergibst also die Werte beim Aufruf der Funktion oder du definierst sie z.B. in der Klasse in der die Funktion "Zwischenzeiten" steht.
-
O.o schrieb:
C(#) macht keinen Unterschied zwischen Funktionen und Prozeduren.
Richtig, weil man in .Net gar keine Funktionen und Prozeduren hat, sondern nur Methoden
Deine Aussage ist natürlich richtig dass nicht unterschieden wird, da aber sämtlicher funktionaler Code immer in irgend einem Klassenkontext steht, heißen sie Methoden. Funktionen und Prozeduren sind eigenständige Funktionalität wie sie in .Net nicht vorkommt.