Autor Beitrag
kuschelfreddy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 01.05.09 15:15 
Hey!
Ich schon wieder. Habe ein Programm mit Pointern geschrieben, was auch so weit funktioniert, bis auf eine Kleinigkeit, die ich nicht behoben bekomme. Deshalb hoffe ich, dass ihr mir dabei behilflich sein könnt.
Was das Programm macht, dürfte beim Angucken ziemlich klar werden. Das Problem ist Folgendes:
Wenn ich die Liste im linken Memofeld alphabeitsch einlesen lasse und dann ausgebe, funktioniert dies einwandfrei. Wenn ich dann ein Wort hinzufügen möchte, zB Maus, dann setzt er es ganz oft nur an das Ende der Liste und sortiert es nicht ein. Füge ich ein zweites Wort ein, sortiert er es einwandfrei ein. Deshalb weiß ich auch nicht, wo genau der Fehler liegt....
Bei allen anderen Sortiermodi (FiFo, LiFo) funktioniert das Hinzufügen einwandfrei...
Ich hoffe, hier findet jemand das Problem und hilft mir beim Beheben!

Danke schon mal im Voraus!

LG Nathalie


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Sa 02.05.2009 um 00:29
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 02.05.09 00:35 
Moin!

Was hast du denn schon unternommen, um den Fehler zu finden? Hast du denn wenigstens eine Ahnung, wo im Quelltext der Fehler liegen müsste? Hast du mal versucht, das Programm zu debuggen? Oder mal ein paar Testausgaben eingefügt? :nixweiss:

Du wirst hier vermutlich niemanden finden, der dir dein Programm einfach so analysiert und die Fehler entfernt. Vielleicht solltest du erstmal den relevanten Codeteil identifizieren und nur diesen hier direkt im Beitrag präsentieren. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
kuschelfreddy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Sa 02.05.09 16:25 
Hey!
Also so wirklich ne Ahnung, wo der Fehler liegt, habe ich nicht und ich habe auch noch keine genaue Fehleranalyse gemacht, da ich keine Ahnung habe, wie ich das in Delphi am besten angehe.
Ich hoffe, dass das Problem klar geworden ist. Theoretisch müsste der Fehler entweder in diesem:

ausblenden volle Höhe Delphi-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:
procedure TForm2.alphabetisch;
begin
  new(lauf);                                                                     //erstellen eines neuen Elements, auf das lauf zeigt
  lauf^.inhalt:=memo2.lines[a];                                                  //zuordnen eines Inhaltes zu dem erstellten Element
  if lauf^.inhalt<start^.Inhalt                                                  //überprüfen, ob das einzuordnende Element im Alphabet vor dem Element
    then                                                                         //am Beginn der Kette kommt
      begin                                                                      //sollte dies der Fall sein,
        lauf^.richtung:=start;                                                   //zeigt das neu erstellte Element auf die Start-Position und nimmt
        start:=lauf;                                                             //dadurch diese ein, wodurch der, die Start-Position markierende Zeiger
        hilfe:=start;                                                            //auf das erstellte Element zeigen und hilfe auch neu auf den Anfang
      end                                                                        //gesetzt werden muss
    else                                                                         //andernfalls ist das neu erstellte Element hinter das Start-Element
      begin                                                                      //einzuordnen
        if start^.richtung=nil                                                   //sollte das Start-Element gleichzeitig das letzte sein, muss keine
          then                                                                   //Position gesucht werden, sondern das neue lediglich dahinter gereiht
            begin                                                                //werden
              lauf^.richtung:=start^.richtung;                                   //dazu soll das neu erstellte auf das gleiche zeigen, wie das Start-
                                                                                 //Element
              start^.richtung:=lauf;                                             //das Start-Element zeigt dann auf das neu erstellte Element
            end
          else                                                                   //ist das Start-Element nicht das letzte, muss die korrekte Position ge-
            begin                                                                //sucht werden!
              repeat                                                             //dazu wird der Hilfe-Zeiger so lange um ein Element weiterverschoben,
                hilfe:=hilfe^.richtung;                                          //bis die Position gefunden wurde, vor die das neu erstellte Element ein-
              until (hilfe^.richtung=nilor (lauf^.inhalt<hilfe^.inhalt);       //geordnet werden muss
              if hilfe^.richtung=nil                                             //sollte es so eines nicht geben, muss das neu erstellte Element an das
                then                                                             //Ende der Kette
                  begin
                    hilfe^.richtung:=lauf;                                       //dazu zeigt das letzte Element der Kette auf das neu erstellte
                    lauf^.richtung:=nil;                                         //das neu erstellte wird geerdet
                    hilfe:=start;                                                //hilfe wird wieder an den Anfang der Kette gesetzt, um diese wieder neu
                  end                                                            //durchlaufen zu können
                else
                  begin                                                          //muss es jedoch mitten in die Kette eingeordnet werden,
                    lauf^.richtung:=hilfe;                                       //zeigt das neu erstellte zunächst auf das von hilfe gefundene nachfolgende Element
                    hilfe:=start;                                                //hilfe wird wieder an den Start gesetzt, um nun die Position zu finden,
                    if hilfe^.richtung<>lauf^.richtung                           //die vor dem neu erstellten Element sein müsste
                      then                                                       //ist diese nicht die erste Position in der Kette,
                        begin
                          repeat
                            hilfe:=hilfe^.richtung;                              //wird der Hilfe-Zeiger nun wieder so lange um ein Element weiter gesetzt,
                          until hilfe^.richtung=lauf^.richtung;                  //bis diese gefunden wurde
                        end;
                    hilfe^.richtung:=lauf;                                       //das gefundene Element zeigt nun auf das neu erstellte
                    hilfe:=start;                                                //hilfe wird wieder auf die Start-Position gesetzt
                  end;
            end;
      end;
  inc(a);                                                                        //a wird um eins hochgesetzt, sodass beim nächsten Schleifendurchlauf der
end;                                                                             //Inhalt der nächsten Zeile im Memofeld in die Kette eingeordnet wird
oder in diesem Teil:
ausblenden Delphi-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:
procedure TForm2.Button4Click(Sender: TObject);                                  //hinzufügen
begin
  memo2.lines.add('');                                                           //um dem Eingabe-Memofeld einen Inhalt hinzuzufügen, wird eine neue
  memo2.lines[a]:=edit1.text;                                                    //Zeile erstellt, die diesen dann übergeben bekommt
  hilfe:=start;
  if button1.Visible                                                             //je nachdem, welcher Ausgabe-Button sichtbar ist, nach diesem 
    then lifo                                                                    //Sortiermodus wird das neue Wort eingefügt, in diesem Fall LiFo
                                                                                 //wenn nach LiFo sortiert wird, muss keine Position, an der einsortiert
                                                                                 //werden soll, gesucht werden, sondern kann einfach mit der Prozedur
                                                                                 //LiFo das Wort angehängt werden
    else if button2.Visible                                                      //im Folgenden wird nach FiFo sortiert
           then
             begin
               if hilfe^.richtung<>nil
                 then
                   begin
                     repeat                                                      //da hier das neue Wort an die letzte Stelle der Kette muss,
                       hilfe:=hilfe^.richtung;                                   //wird zunächst mit Hilfe des Hilfe-Zeigers die letzte Position
                     until hilfe^.richtung=nil;                                  //in der Kette gesucht
                   end;
               fifo;                                                             //dann wird mit Hilfe der Prozedur FiFo das neue Element an die
             end                                                                 //gefundene letzte Position der Kette gebracht
           else alphabetisch;                                                    //sollte alphabetisch einsortiert werden, so ist es nicht nötig,
                                                                                 //erst die richtige Position zu finden, da dies bereits in der
                                                                                 //Prozedur Alphabetisch geschieht
  lauf:=start;                                                                   //da für die Ausgabe der Lauf-/und Hilfe-Zeiger an der Kette
  hilfe:=start;                                                                  //entlanggehangelt werden, müssen diese auf der Startposition sein
  Ausgabe;                                                                       //die Reihe mit dem neu einsortierten Wort wird wieder ausgegeben
  edit1.clear;                                                                   //das Edit-Feld wird wieder geleert
end;


liegen, da das eigentlich die einzigen relevanten Teile sind, für den Teil, in dem das Problem auftaucht....
Notfalls gebe ich das Programm so ab und mein Lehrer muss sich damit rum schlagen... Ist ja eigentlich auch nur ein kleines Problem, aber ich hätte es gern behoben...

LG Nathalie

Moderiert von user profile iconKha: Delphi-Tags hinzugefügt