Problem - Programm zur Generierung eines Stundenplans

Hallo erstmal :-)

Ich schreibe im Moment im Rahmen meiner Facharbeit in Informatik ein Programm, dass einen Stundenplan von der Klasse 5 bis zur 10 für eine Schule generieren soll.

Zu Anfang: Ich programmiere noch nicht sehr lange, und ich bin mir sicher, dass die Methoden, die ich angewandt habe, vielleicht nicht die besten sind, aber wäre trotzdem schön, wenn es sich mal jemand angucken würde. :-)

Die verwendete Sprache ist Delphi 7, habe das Programm mit Borland Delphi 7 geschrieben.

Nun zu meinem Problem:

Es tritt an einer bestimmten Stelle, wenn ich den Plan generieren lassen will, immer einen Laufzeitfehler, den ich einfach nicht finden kann. Finde es eh schwer, seine eigenen Fehler zu finden, aber naja, das ist eine andere Sache ... ;-)


Ich bin mir ziemlich sicher, dass der Fehler in dieser Function ist:
Code:
procedure TForm1.generate(pTag, pStd : Integer);
begin
  if momentaneKlasse = '5a' then
    begin
    if self.generateTage(PlanKlasse5a, '5a', pTag, pStd, false) = true then  //Wenn die Klasse in der Std frei hat ...
      begin
      if self.generateTage(self.generateKlasse(Klasse5a), '5a', pTag, pStd, true) = true then   //Wenn der Lehrer in der Std frei hat ...
        begin
        PlanKlasse5a.MosetzeKlErste(tempFach);
        Klasse5a.naechsterLehrer;
        if (pStd <= (Klasse5a.gibWochenStd/5 + 1)) and (pTag = 5) then
          begin
          self.naechsteKlasse;
          self.generate(1, 1);
          end;
        if pStd <= (Klasse5a.gibWochenStd/5 + 1) then   //+1, damit nicht gerade am Fr 7 Std zustande kommen, wenn es auch am Mo ginge.
          self.generate(pTag, pStd + 1)  //nächste Std am selben Tag nehmen.
        else
          self.generate(pTag + 1, 1);  //Wieder mit der 1. Std am nächsten Tag anfangen.
        end
      else
        begin
        Klasse5a.naechsterLehrer;
        self.generate(pTag, pStd);
        end;
      end
    else
      begin
      self.generate(pTag, pStd + 1);
      end;
    end;
//ab hier abgeschnitten.

Hier nochmal die aufgerufene Funktion generateTage:
Code:
function TForm1.generateTage(pPlan : Plan; pKlasse : String; pTag, pStd : Integer; pLehrer : boolean) : boolean;
begin
  if genKlErfolg = false then
    result:=false
  else     //Wird alles nicht überprüft, falls genKlErfolg false ist!
  begin
  //Stundenüberprüfung - Montag
  if pTag = 1 then
    begin
    if pStd = 1 then
      begin
      if pLehrer = true then
        begin
        if pPlan.MosetzeLErste(pKlasse) = true then
          result:=true;
        end
      else
        begin
        if pPlan.MoKlErsteFrei = true then
          result:=true
        else
          result:=false;
        end;
      end;
// ab hier wieder abgeschnitten

Ob die Überlegungen so stimmen, kann ich nicht sagen, konnte es ja noch nicht testen. :)

Ich habe den kompletten Quelltext auch nochmal hochgeladen, falls in diesen beiden Abschnitten nichts zu finden sein sollte.
http://home.arcor.de/phearo/facharbeit/Programm.rar

Ich hoffe, ihr könnt mir helfen, Danke schonmal!


//edit:
tut mir leid, die Formatierung ist verloren gegangen beim Einfügen.
 
schon mal versucht mit nem debugger den fehler zu finden?
wenn nicht solltest du dich damit mal vertraut machen und es damit probierenn. klappt meistens ganz gut ...
 
Nein, habe icht nicht. Hab sowas noch nie benutzt :-)

Kannst du mir denn da einen bestimmten empfehlen, oder sind die alle recht gleich ?
 
Stimmt, is beschädigt ... achso und wenn du 3 If Klauseln hast die ineinander greifen kann man sie auch mit AND Verknüpfen.
 
sry, hab vergessen, dass die cmd in windows bei mir immer die dateien beim upload beschädigt ;)

das mit dem 'and' kenne ich, aber ich wollte sie getrennt haben, wieso erkennt man, wenn man sich den kompletten code anschaut ... glaube ich :rolleyes:
 
das isn stack overflow da ich mich leider net so in delphi auskenn kann ich das net genau nachvollziehen

if self.generateTage(self.generateKlasse(Klasse5a), '5a', pTag, pStd, true) = true then //Wenn der Lehrer in der Std frei hat ...

irgendwo da sot

du hättest da auch vieles mit switch case machen können, wenn es sowas gibt verdammt unübersichtlich
 
ja, sowas gibt es. Hatte auch alles erst mit case geplant, allerdings hat mein Delphi sich beschwert, dass case nicht mit Strings ginge, sondern nur mit Integer ...

aber danke erstmal so weit, ich versuch mal was zu finden.

edit:

ok, hab das programm nochmal überarbeitet und nen paar fehler gefunden.
das einzige problem was ich jetzt noch habe, ist eben der stack overflow in der procedure generateTage. Ich habe mal gegoogelt, und hab herausgefunden, dass der stack irgendwann einfach voll ist, wenn man bei ner Rekursion zu viele Methoden aufruft.
Nun hab ich aber absolut keine Ahnung, und habe auch nichts dazu gefunden, wie man einen solchen Fehler beheben kann ... der Rest sollte so in Ordnung sein. Ich habe alles nochmal hochgeladen.

wär schön, wenn mir jemand helfen könnte...
 
array hab ich nicht eins drin, und sonst auch nur strings verwendet und manchmal integer ...

edit:
den stack overflow hab ich nur bei der rekursion immer ... könnte es was bringen, wenn ich die rekursion in mehrere kleine teile aufteile ? so dass die prozeduren, die den stack belegen dabei, nicht so groß sind ? die werden doch wieder aus dem stack entfehrnt, wenn sie abgeschlossen wurden, oder ?
 
wenn ich das richte verstehe läuft der aufruf stack über, das ist der stack der speichert wo bei einem return hin zurück gesprungen wird. Also musst du versuchen das wiederholte aufrufen einer funktion durch schleifen zu ersetzten.
(alle Angaben ohne Gewähr, ich hab kein Plan von Delphi. Ich schliesse hier einfach durch andere Sprachen auf das Problem)
 
Zurück
Oben