Entwickler-Ecke
C# - Die Sprache - OOP Programmierung Verwendung von out ? im Beispiel Uhrzeit
itchaas - Mo 29.10.12 17:15
Titel: OOP Programmierung Verwendung von out ? im Beispiel Uhrzeit
Hallo ich mal wieder,
ich verstehe nicht ganz wie ich die out funktion implentieren soll...
Folgendes Bsp.: Uhrzeit.cs
Wobei die Methode DIFF hier falsch gelöst ist. Sie sollte nach Wunsch so gelöst sein:
(Uhrzeit t2, out int hh, out int mm, out int ss)
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:
| class Uhrzeit { internal long sec;
public Uhrzeit(int hh, int mm, int ss) { SetUhrzeit(hh, mm, ss); }
public void SetUhrzeit(int hh, int mm, int ss) { sec = hh * 3600 + mm * 60 + ss; }
public void Add(Uhrzeit t2) { this.sec = this.sec + t2.sec; }
public void Sub(Uhrzeit t2) { this.sec = this.sec - t2.sec; }
public void Diff(Uhrzeit t2) { if (this.sec > t2.sec) { this.sec = this.sec - t2.sec; } else this.sec = t2.sec - this.sec;
}
public void Drucken() { long a,b,c; a=sec/3600; b=(sec%3600)/60; c=(sec%3600)%60;
Console.WriteLine("Die aktuelle Uhrzeit ist: " + a +" , " + b + " , " +c); }
} |
Die Program.cs bei mir zur Zeit:
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:
| class Program { static void Main(string[] args) { Uhrzeit t1 = new Uhrzeit(02, 03, 10); Uhrzeit t2 = new Uhrzeit(05, 03, 10); Uhrzeit t3 = new Uhrzeit(01, 05, 16); Uhrzeit t4 = new Uhrzeit(05, 30, 20); t1.Add(t2); t1.Drucken(); Console.WriteLine(); t1.Sub(t3); t1.Drucken(); Console.WriteLine(); t4.Sub(t1); t4.Drucken(); Console.WriteLine(); t1.Diff(t2); t1.Drucken();
} } |
Ich hoffe ich strapaziere Euch nicht zu sehr. Ihr helft mir sehr beim Lernen...DANKE!
Christian S. - Mo 29.10.12 17:25
Hallo!
Du kannst Funktionsparameter als Ausgabe benutzen, wenn Du sie sowohl mit
out deklarierst, als auch die Funktion dann mit
out aufrufst. Ein Beispiel sähe so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| public void SchreibeWasInDenParameter(out string derParameter) { derParameter = "was"; }
string what; SchreibeWasInDenParameter(out what); |
Nach dem Aufruf in der letzten Zeile steht in
what der String
"was" drin.
Grüße,
Christian
Ralf Jansen - Mo 29.10.12 17:42
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public void Diff(Uhrzeit t2, out long hh, out long mm, out long ss) { long diff = Math.Abs(this.sec - t2.sec);
hh = diff / 3600; mm = (diff % 3600) / 60; ss = diff % 60; } |
Sauberer fände ich allerdings wenn die Funktion einfach ein neues Uhrzeit Object mit der Differenz zurückgeben würde anstatt die Einzelteile als out Parameter. In deiner ~nicht~ Lösung findet ich merkwürdig das die Diff Funktion die eigenen Sekunden ändert. Ein Programmierer würde beim Aufruf einer Diff Funktion nie damit rechnen das die den Zustand der aktuellen Instanz ändert(macht ja auch schon die Sub Funktion).
itchaas - Mo 29.10.12 18:50
Danke Ihr Beiden!
Hab jetzt noch ein Kleines Problem und zwar müssen wir bei den out Dingern int nehmen
und jetzt habe ich ein paar Probleme:
Meine Uhrzeit.cs
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public void Diff(Uhrzeit t2, out int hh, out int mm, out int ss) { int diff;
if (t2.sec > this.sec) { diff = t2.sec - this.sec; } else { diff = this.sec - t2.sec; } hh = diff / 3600; mm = (diff % 3600) / 60; ss = (diff % 3600) % 60;
} |
Und meine Testklasse - hier weiss ich nicht wie die aussehen muss...
C#-Quelltext
1: 2:
| int diff; t1.Diff(t2, out diff); |
Sonst klappt alles nur bei dieser Methode happerts noch...
Ralf Jansen - Mo 29.10.12 18:54
Du hast drei out Parameter nicht einen. Wenn darüber hinaus was nicht geht solltest du das genauer sagen was nicht geht.
itchaas - Mo 29.10.12 19:05
Mich verwirrt noch einwenig das out Argument
-) In der Uhrzeit Klasse habe ich 3 out Variablen (hh, mm, ss)
-> Diese werden übergeben bzw. ausgegeben an die Testklasse retour oder?
-) In der Testklasse werden die 3 out Variablen angenommen - hier jedoch müssen
die variablen erneut deklariert werden und können anders heißen?
Sehe ich das jetzt mal richtig oder?
**EDIT**
OK hat sich erübrigt: Jetzt kapier ich out...nur noch long / int problem.
C#-Quelltext
1: 2: 3:
| long hh, mm, ss; t1.Diff(t2, out hh, out mm, out ss); Console.WriteLine("Die Differenz: "+hh+":"+mm+":" + ss); |
ad Probleme
Ich habe noch Probleme wegen der long int Mischung.(meldet visual studio)
Ralf Jansen - Mo 29.10.12 19:17
Zitat: |
Sehe ich das jetzt mal richtig oder? |
Ja. Der Aufrufer einer Methode kann seine Variablen so nennen wie er möchte. Die Parameternamen in der Methode sind davon völlig unabhängig. Stell die vor du willst die selbe Methode mit unterschiedlichen out Variablen mehrmals hintereinander aufrufen. Und das ginge nicht weil die Variablen in der Testklasse genauso heißen müssen wie die Parameter. Wäre schön blöd;)
Zitat: |
Ich habe noch Probleme wegen der long int Mischung.(meldet visual studio) |
Bei der Zuweisung der diff Variablen? Das sec ein long ist wird auch sec - sec ein long sein. Da ein long größere Zahlen enthalten kann als ein int wird der Compiler das nicht einfach so fressen wenn du einen long einen int zuweist da der zu groß sein könnte. Wenn du dir ganz sicher bist das das nie auftreten kann (ein long der nicht in den int passt) kannst du das runtercasten.
C#-Quelltext
1:
| int meinLieberInteger = unchecked((int)meinLieberLong); |
Das unchecked zeigt deutlich das du jetzt dafür verantwortlich bist das das auch immer passt. Alternativ kannst du auch die Convert Klasse zum ~konvertieren~ verwenden.
C#-Quelltext
1:
| int meinLieberInteger = Convert.ToInt32(meinLieberLong); |
Letzteres wirft zumindest eine Exception wenn der long zu groß für einen Int ist.
itchaas - Mo 29.10.12 19:37
Vielen Dank, da konnte ich mit dieser Aufgabe wieder einige Fragen klären und habe wiedermal viel viel dazugelernt...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!