Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#5

Re: Problem beim Vergleich von 1 Array mit sich selbst

  Alt 28. Nov 2003, 00:51
Delphi-Quellcode:
type TNames = record
       Name : String[50];
       Hit : integer;
     end;
     PNames : ^TNames; //Typisierter Zeiger auf einen TNames-Record
var
  HitListe : TList;
...
procedure CountDaHits;
var
  i,
  j,
  ext : Integer;
  AktZeile : String;
  SchonDrinn : Boolean;
begin
  ext := Memo1.Lines.Count-1;
  Label3.Caption := IntToStr(ext);
  if not Assigned(HitListe) // prüfen ob Hitliste schon instanziiert wurde,
    then HitListe := TList.Create; // wenn nicht, dann erzeugen wir sie

  for i := 0 to ext do
  begin
    AktZeile := copy(Memo1.Lines[i],Pos(']',Memo1.Lines[i])+2,MaxInt);
    AktZeile := copy(AktZeile,1,Pos('read',AktZeile)-1);
    SchonDrinn := False;
    for j := 0 to HitListe.Count-1 do begin // wird bei der 1. Memo1-Zeile nicht ausgeführt
      if PName(HitListe[i]).Name = AktZeile
        then begin
          SchonDrinn := True;
          PName(HitListe[i]).Hit := PName(HitListe[i]).Hit+1;
        end;
    end; // for j
    if not SchonDrinn then begin
      HitListe.Add(new(PNames)); // von innen nach aussen:
                                  // 1. erzeugt neuen TNames-Record (reserviert Speicher),
                                  // 2. erzeugt Neuen PNames-Zeiger ( dto. )
                                  // 3. weist dem PNames-Zeiger die Adresse des TNames-Record zu
                                  // 4. Hängt den PNames-Zeiger als untypisierten Pointer an das
                                  // Ende der HitListe an
      PName(HitListe[i]).Name := AktZeile;
      Hit := 1;
    end; // if not SchonDrinn
  end; // for i
end;

// Um kein Speicherleck zu bekommen, müssen wir die Hitliste vor
// ProgrammEnde noch leeren und freigeben:
procedure VorDemFeierabend;
var i : Integer;
begin
  if Assigned(HitListe) // sollte die HitListe nicht Instanziiert worden sein, gäbe es
    then begin // eine Zugriffsverletzung, deswegen immer schön prüfen, ob'se da ist
      for HitListe.Count-1 downto 0 do begin
        Dispose(PNames(HitListe[i])); // gibt den Record, auf den der i. PNames zeigt frei
        HitListe.Delete(i); // Löscht den i.Zeiger und kürzt die Liste (deshalb
                                      // zähle ich auch von Hinten nach vorne)
      end;
    end;
    FreeAndNil(HitListe); // Zuguterletzt geben wir die HitListe frei - et voila
end;
Gruß
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat