SortedList_InsertElement.pb anpassen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

SortedList_InsertElement.pb anpassen

Beitrag von uweb »

Aus dem Codearchiv habe ich mir SortedList_InsertElement.pb geholt und schon etwas angepasst.

ADD_Element() fügt nun nur noch wirklich neue Texte ein
und gibt die Adresse des eingefügten Strings zurück.

Was ich nicht schaffe ist find_var() so anzupassen, daß es statt 1
die Adresse des bereits enthaltenen Strings mit gleichem Inhalt zurück gibt.

Ich habe zwar die entsprechende Stellen gefunden und markiert, aber irgendwie schaffe ich es nicht
mich so weit in den Code zu denken um die richtige Adresse zu speichern

Code: Alles auswählen

; English forum: http://purebasic.myforums.net/viewtopic.php?t=7503&highlight=
; Author: GPI
; Date: 14. September 2003
;
; leicht veränderte Version

NewList var.String() 
Procedure find_var(*Name.Byte) 
  ResetList(var()) 
  half=CountList(var())>>1 
  If half 
    SelectElement(var(),half) 
    pos=half 
    quit=0 
  Else 
    pos=0 
    If NextElement(var())=0 
      quit=2 ; **************************************************
    Else 
      quit=0 
    EndIf 
  EndIf 
  oldcompare=0 
  While quit=0 
    compare=CompareMemoryString(*Name,@var()\s,1) 
    If half 
      Select compare 
        Case -1:half>>1:pos-half:SelectElement(var(),pos) 
        Case 0:quit=1 
        Case 1:half>>1:pos+half:SelectElement(var(),pos) 
      EndSelect 
    Else 
      If compare=0 
        quit=1 
      ElseIf compare=oldcompare Or oldcompare=0 
        oldcompare=compare 
        If compare=-1 
          If PreviousElement(var())=0 
            ResetList(var()) 
            quit=2 ; ********************************************
          EndIf 
        Else 
          If NextElement(var())=0 
            LastElement(var()) 
            quit=2 ; ********************************************
          EndIf 
        EndIf 
      Else 
        If oldcompare=1 
          If PreviousElement(var())=0 
            ResetList(var()) 
          EndIf 
        EndIf 
        quit=2 ; ************************************************
      EndIf 
    EndIf    
  Wend 
  If quit=2 
    ProcedureReturn 0 
  Else 
    ProcedureReturn 1 
  EndIf  
EndProcedure 

Procedure.l ADD_Element(a$)
  Wert = find_var(@a$)
  If Wert
    ProcedureReturn Wert
  Else 
    AddElement(var()) 
    var()\s=a$
    ProcedureReturn @var()\s 
  EndIf
EndProcedure 


Debug "hallo - "+Str(ADD_Element("hallo"))
Debug "adfak - "+Str(ADD_Element("adfak"))
Debug "23456 - "+Str(ADD_Element("23456"))
Debug "uioaj - "+Str(ADD_Element("uioaj"))
Debug "23jlk - "+Str(ADD_Element("23jlk")) 
Debug "hallo - "+Str(ADD_Element("hallo"))
Debug "osade - "+Str(ADD_Element("osade"))
ResetList(var()) 
While NextElement(var()) 
  Debug var()\s 
Wend 
Benutzeravatar
t-master
Beiträge: 6
Registriert: 04.01.2006 00:43
Wohnort: Haselünne (Emsland)

Beitrag von t-master »

Versuchs mal hiermit in Procedure find_var(*Name.Byte)

Code: Alles auswählen

  If quit=2 
    ProcedureReturn 0 
  Else 
        Procedurereturn var()\s  ;statt ProcedureReturn 1 
  EndIf  
Habs aber jetzt nicht getestet.
Gruß t-master
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Mein Gott, so einfach und ich war so knapp dran.

Heute ist nicht mein Tag !

Natürlich habe ich das auch schon ausprobiert.
In ADD_Element() hatte ich ja eine gute Vorlage.
Nur, irgend etwas habe ich dabei etwas falsch gemacht.

Ich habe reichlich an dem Code rumprobiert.
Vor dem Absenden habe ich dann noch
einigen Müll beseitigt, das ganze richtig eingerückt, ....
und wohl dabei auch meinen Fehler entfernt.

Wie dem auch sei jetzt läuft es genau so.

DANKE !!!
Antworten