powerbot - Fr 27.02.09 20:33
Titel: Arrayproblem
es geht um folgenden Quellcode:
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(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
Christian S.: C#-Tags hinzugefügt
JüTho - 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.
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 - Fr 27.02.09 21:32
danke schoma Jürgen
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) { string[] beginn = start.Split( '\u002C'); 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; 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; } else { j = 1; } 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 - 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 [
http://msdn.microsoft.com/de-de/library/ms229002(VS.80).aspx] 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:
C#-Quelltext
1: 2: 3: 4: 5:
| string ergs = Convert.ToString(erg); return (ergs); 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:
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