Autor Beitrag
itchaas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: Mo 29.10.12 17:15 
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)

ausblenden volle Höhe 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
    {
        //Instanzvariable

        internal long sec;


        //Konstruktor

        public Uhrzeit(int hh, int mm, int ss)
        {
            SetUhrzeit(hh, mm, ss);
        }


        //Methoden die durchgeführt werden können

        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:

ausblenden 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(020310);
            Uhrzeit t2 = new Uhrzeit(050310);
            Uhrzeit t3 = new Uhrzeit(010516);
            Uhrzeit t4 = new Uhrzeit(053020);
            
            
            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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
public void SchreibeWasInDenParameter(out string derParameter)
{
  derParameter = "was";
}

/* ... irgendwo dann der Aufruf: ... */

string what;
SchreibeWasInDenParameter(out what);


Nach dem Aufruf in der letzten Zeile steht in what der String "was" drin.

Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 29.10.12 17:42 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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

ausblenden 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...

ausblenden C#-Quelltext
1:
2:
int diff;
            t1.Diff(t2, out diff);


Sonst klappt alles nur bei dieser Methode happerts noch...
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

ausblenden 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.

ausblenden C#-Quelltext
1:
int meinLieberInteger = Convert.ToInt32(meinLieberLong);					


Letzteres wirft zumindest eine Exception wenn der long zu groß für einen Int ist.
itchaas Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 21



BeitragVerfasst: 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...