Autor Beitrag
powerbot
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 27.02.09 20:33 
es geht um folgenden Quellcode:

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:
        private void button1_Click(object sender, EventArgs e)
        {
            stundenarray = new string[12]
            {
                Mitarbeitername.Text,
                Datum.Text,
                Beginn.Text,
                Ende.Text,
                Pause1beginn.Text,
                Pause1ende.Text,
                Pause2beginn.Text,
                Pause2ende.Text,
                Pause3beginn.Text,
                Pause3ende.Text,
                Pause4beginn.Text,
                Pause4ende.Text,
            };

            pause = new string[5]
            {
                (pauserechner(Beginn.Text,Ende.Text,false)),
                (pauserechner(Pause1beginn.Text,Pause1ende.Text,true)),   //pauserechner gibt String "Zahl,Zahl" zurück
                (pauserechner(Pause2beginn.Text,Pause2ende.Text,true)),
                (pauserechner(Pause3beginn.Text,Pause3ende.Text,true)),
                (pauserechner(Pause4beginn.Text,Pause4ende.Text,true))
            };
            endergebn = Convert.ToDecimal(pause[0]);
            for (int i = 1; i < 5; i++)
            {
                endergebn = endergebn - Convert.ToDecimal(pause[i]);
            }
            MessageBox.Show(Convert.ToString(endergebn));
        }


bis zum Array pause läuft das programm aber dann hängt es sich auf
das Programm zeigt keinen Fehler an

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 27.02.09 21:01 
Hallo und :welcome:

Wenn das Programm dort blockiert, wo erstmals die Methode pauserechner benutzt wird, solltest Du diese mit zitieren.

Hast Du schon den Debugger verwendet?

Mir gefallen zwei Sachen nicht. Statt Convert ist besser (je nachdem) Parse, ParseExact, TryParse, TryParseExact zu verwenden; vor allem die TryParse-Methoden prüfen Falscheingaben in den TextBoxen. Auch pause[0] kann aus diesem Grund besser in die Schleife übernommen werden.
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
endergebn = 0;
for (int i = 0; i < 5; i++)
{
   decimal pauseValue = 0;
   if (decimal.TryParse(pause[i], out pauseValue) {
      if (i == 0)
         endergebn = pauseValue;
      else
         endergebn -= pauseValue:
   }
}

Gruß Jürgen
powerbot Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 27.02.09 21:32 
danke schoma Jürgen

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:
59:
60:
61:
62:
63:
64:
        private string pauserechner(string start, string stop, bool pause)  // false wenn keine Pause!!
        {
            string[] beginn = start.Split( '\u002C');                       //aufteilung in Stunden [0] und Min[1]
            string[] ende = stop.Split( '\u002C');
            int beginnstd = Convert.ToInt32(beginn[0]);
            int endestd = Convert.ToInt32(ende[0]);
            int beginnmin = Convert.ToInt32(beginn[1]);
            int endemin = Convert.ToInt32(ende[1]);

            int bminhundertstel = beginnstd * 60;                           //Stunden => Min
            int eminhundertstel = endestd * 60;

            int res = ((eminhundertstel + endemin) - (bminhundertstel + beginnmin));
            int resstd = 0;
            while (res - 60 > 0)
            {
                resstd++;
            }
            int resmin = res - (resstd * 60);
            decimal erg=0;

            int j;

            if (pause == false)
            {
                j = 0;              //keine Pause
            }
            else
            {
                j = 1;              //Pause
            }
            int stfkt = 0;
            for (int k = 0; k < 12;k++ )
            {
                if(resmin == Convert.ToInt32(rundung[k,0]))
                {
                    stfkt = 1;
                    erg = resstd + Convert.ToDecimal(rundung[k,1]);
                }
            }


            for (int i = 0; i < 12; )
            {
                if (stfkt == 1)
                {
                    break;
                }
                if (resmin > Convert.ToInt32(rundung[i+j,0]))
                {
                    erg = Convert.ToDecimal(rundung[i,1]);
                    break;
                }
                else
                {
                    i++;
                }
            }

            string ergs = Convert.ToString(erg);
            

            return (ergs);
      }


is der Quellcode für die Fkt pauserechner
is warscheinlich auch gespickt mit Anfängerfehlern aber se funktioniert normalerweise
also ich hab jetz ma dein skript eingebaut
aber ich hab die Vermutung das der Fehler im Array 'pause' liegen muss weil hab davor und danach ´ne messagebox anzeigen lassen und die danach hats nixmehr gezeigt

Problem gelöst ;D unendliche Schleife in pauserechner
danke an alle die sich für angestrengt ham ^^
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 28.02.09 12:04 
Hallo,

Zitat:
Problem gelöst ;D unendliche Schleife in pauserechner

Steht dort noch die falsche Version, oder hast Du den Quellcode berichtigt?

Noch ein paar Vorschläge, die eher unter "Schönheitsreparatur" fallen und als Anregungen für die künftige Arbeit gedacht sind:

Für Bezeichner schau einmal unter NET: Richtlinien für Namen nach. Ergänzend empfehle ich, nur englische Bezeichner zu verwenden: Eigentlich bin ich ein Befürworter der deutschen Sprache in Deutschland. Aber das Denglisch, das der Designer bei einem EventHandler mit MitarbeiternameTextChanged erzeugt, empfinde ich als noch viel grausamer; dann lieber gleich richtiges Englisch.

"Überflüssige" Variablen sollten vermieden werden. Vor allem bei Strings ist damit oft ein Umspeichern von Werten verbunden; ob der Compiler das bei der Optimierung bereinigt, kann man nicht immer wissen. Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
//  nicht so:
            string ergs = Convert.ToString(erg);
            return (ergs);
//  sondern so:
            return erg.ToString();

ergs ist überflüssig; ToString gibt es bei jeder Klasse, und es kann auf jedes Objekt angewandt werden.

Auch die Minuten als Zwischenwerte sind überflüssig:
ausblenden C#-Quelltext
1:
int res = (endestd * 60 + endemin) - (beginnstd * 60 + beginnmin);					

Klammern zwischen dem Gleichheitszeichen und dem Semikolon finde ich ebenfalls seltsam.

Etwas grundsätzlicher ist die ständig nötige Verwendung von Convert. Abgesehen davon, dass ich sowieso Parse usw. vorziehe (wie ich schon sagte), solltest Du überall dort, wo ein bestimmter Typ benutzt und als solcher (!) verarbeitet werden soll, diesen Typ verwenden und nicht ersatzweise einen String. pause sollte als TimeSpan-Array deklariert werden (wenn ich es richtig interpretiere). Für das Stundenarray passt besser eine eigene Klasse, in der alle Zeiten auch als solche deklariert und direkt benutzt werden. Für alle Auswertungen können direkt die DateTime-Methoden verwendet werden; das macht alles einfacher und übersichtlicher.

Viel Erfolg! Jürgen