  | 
					
						Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!   
						
						
					 | 
				 
			 
			 
	
		| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	 
	
	
		| Autor | 
		Nachricht | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 01.07.2012, 10:16    Titel: Zugriff auf UDT/Property's? | 
				     | 
			 
			
				
  | 
			 
			
				Hab mir grad mal eine 'Undef Integer Array' UDT gebastelt die ganz gut funktioniert, nur ist das 'ansprechen' mit (bei mir) .V(Index) nicht so toll
 
 
Gibts da 'ne möglichkeit das man die Property direkt ohne Punkt (und Komma  ) ansprechen kann/könnte?!
 
 
 	  | Code: | 	 		  
 
Type Pointer_Undefined_Integer_Array as Type_Undefined_Integer_Array ptr
 
 
Type Type_Undefined_Integer_Array
 
    NextInteger  as Pointer_Undefined_Integer_Array
 
    PrevInteger  as Pointer_Undefined_Integer_Array
 
    
 
    Value        as Integer
 
    Index        as Integer
 
End Type
 
 
    
 
Type Class_Undefined_Integer_Array
 
    Public:'
 
        Declare Constructor()
 
        Declare Destructor()
 
    Public:'
 
        Declare Property V(byval Index as Integer) as Integer
 
        Declare Property V(byval Index as Integer, byval Value as Integer)
 
        Declare Function LBound() as Integer
 
        Declare Function Ubound() as Integer
 
    Private:'
 
        FirstInteger as Pointer_Undefined_Integer_Array
 
        LastInteger  as Pointer_Undefined_Integer_Array
 
        SelectInteger as Pointer_Undefined_Integer_Array
 
        
 
        Declare Function getIndex(byval Index as Integer) as Pointer_Undefined_Integer_Array
 
        Declare Function setPrev()  as Pointer_Undefined_Integer_Array
 
        Declare Function setNext()  as Pointer_Undefined_Integer_Array
 
End Type
 
 
Function Class_Undefined_Integer_Array.UBound() as Integer
 
    Function = LastInteger -> Index
 
End Function
 
 
Function Class_Undefined_Integer_Array.LBound() as Integer
 
    Function = FirstInteger -> Index
 
End Function
 
 
Constructor Class_Undefined_Integer_Array
 
    Dim NULLIndex as Pointer_Undefined_Integer_Array
 
    NULLIndex = NEW Type_Undefined_Integer_Array
 
    FirstInteger  = NULLIndex
 
    LastInteger   = NULLIndex
 
    SelectInteger = NULLIndex
 
End Constructor
 
 
Destructor Class_Undefined_Integer_Array
 
    Dim DelNext as Pointer_Undefined_Integer_Array
 
    Dim DelNow  as Pointer_Undefined_Integer_Array
 
    If (FirstInteger <> 0) Then
 
        DelNow  = FirstInteger
 
        Do
 
            DelNext = DelNow -> NextInteger
 
            
 
            Delete DelNow
 
            
 
            DelNow = DelNext
 
        Loop while (DelNow <> 0)
 
    End If
 
End Destructor
 
 
Function Class_Undefined_Integer_Array.getIndex(byval Index as Integer) as Pointer_Undefined_Integer_Array
 
    Dim TInt as Pointer_Undefined_Integer_Array
 
    Dim INum as Integer
 
    
 
    Dim FI   as Integer
 
    Dim LI   as Integer
 
    Dim SI   as Integer
 
    
 
    TInt = SelectInteger
 
    If (TInt <> 0) Then
 
        SI = TInt -> Index
 
        If     ((SI+1) = Index) Then
 
            If (TInt -> NextInteger <> 0) Then 
 
                TInt = TInt -> NextInteger
 
                Return TInt
 
            Else
 
                TInt = setNext()
 
                Return TInt
 
            End If
 
        ElseIf ((SI-1) = Index) Then
 
            If (TInt -> PrevInteger <> 0) Then 
 
                TInt = TInt -> PrevInteger
 
                Return TInt
 
            Else
 
                TInt = setPrev()
 
                Return TInt
 
            End If
 
        End If
 
    End If
 
    
 
    FI = FirstInteger -> Index
 
    LI = LastInteger  -> Index
 
            
 
    If     (abs(Index-FI) < abs(Index-LI)) Then
 
        TInt = FirstInteger
 
    ElseIf (abs(Index-FI) > abs(Index-LI)) Then
 
        TInt = LastInteger
 
    End If
 
            
 
    Do
 
        FI = TInt -> Index
 
                    
 
        If     (Index < FI) Then
 
            TInt = TInt -> PrevInteger
 
            If (TInt = 0) Then TInt = setPrev()
 
        ElseIf (Index > FI) Then
 
            TInt = TInt -> NextInteger
 
            If (TInt = 0) Then TInt = setNext()
 
        ElseIf (Index = FI) Then
 
            Return TInt
 
        End If
 
    Loop
 
 
End Function
 
 
Property Class_Undefined_Integer_Array.V(byval Index as Integer) as Integer
 
    SelectInteger = getIndex(Index)
 
    Return SelectInteger -> Value
 
End Property
 
 
Property Class_Undefined_Integer_Array.V(byval Index as Integer, byval Value as Integer)
 
    SelectInteger = getIndex(Index)
 
    SelectInteger -> Value = Value
 
End Property
 
 
 
Function Class_Undefined_Integer_Array.setNext() as Pointer_Undefined_Integer_Array
 
    Dim NewInt as Pointer_Undefined_Integer_Array
 
    NewInt = NEW Type_Undefined_Integer_Array
 
    
 
    NewInt -> PrevInteger = LastInteger
 
    NewInt -> NextInteger = 0
 
    
 
    If (LastInteger <> 0) Then 
 
        NewInt -> Index = LastInteger -> Index +1
 
        LastInteger -> NextInteger = NewInt
 
    Else
 
        FirstInteger = NewInt
 
    End If
 
 
    LastInteger  = NewInt
 
    SelectInteger = NewInt
 
    Function = NewInt
 
End Function
 
 
Function Class_Undefined_Integer_Array.setPrev() as Pointer_Undefined_Integer_Array
 
    Dim NewInt as Pointer_Undefined_Integer_Array
 
    NewInt = NEW Type_Undefined_Integer_Array
 
    
 
    NewInt -> PrevInteger = 0
 
    NewInt -> NextInteger = FirstInteger
 
    
 
    If (FirstInteger <> 0) Then 
 
        NewInt -> Index = FirstInteger -> Index -1
 
        FirstInteger -> PrevInteger = NewInt
 
    Else
 
        LastInteger  = NewInt
 
    End If
 
    
 
    FirstInteger  = NewInt
 
    SelectInteger = NewInt 
 
    Function = NewInt
 
End Function
 
 
'Short Type
 
Type UndefInt as Class_Undefined_Integer_Array
 
 
'' **
 
'' ' Beispiel:
 
 
Dim test as UndefInt
 
for l as Integer =-100 to 100
 
    test.V(l)=l
 
next l
 
?"added from:";test.LBound; " to:";test.UBound
 
for l as Integer =-100 to 100
 
    ?test.V(l)
 
next l
 
 
sleep
 
 | 	 
  _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		Eternal_pain
 
  
  Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
  | 
		
			
				 Verfasst am: 01.07.2012, 13:09    Titel: Sortieren... | 
				     | 
			 
			
				
  | 
			 
			
				Habe mit dem obigen Code mal etwas gearbeitet und daraus ein weiteres Type abgeleitet (Vec3Int)
 
hinzugefügt habe ich ein Quicksort-Algo der mir die Liste nach Ihrer Distanz zum Referenzpunkt (meist den ersten gefundenen in der Liste) sortieren soll.
 
 
Aber entweder habe ich einen Fehler im obigen Code den ich noch nicht entdeckt habe oder aber der rekursive Sortieralgo verhagelt mir meinen Stack (schon öffter bei grösseren Datenmengen die rekursiv verarbeitet werden sollten passiert) 
 
Evtl sieht aber jemand einen Fehler im Algo hier oder aber kann mir ein paar hinweise zu einem guten Iterativen Sortieralgo als alternative geben...
 
 
(atm: stürzt er schon bei einer sortiermenge < 100 ab)
 
 
Edit: fehler im sortieralgo gehabt, läuft bombe!  
 
 
 	  | Code: | 	 		  
 
#include "Undefined_Integer_Array.bas"
 
 
 
Type Vec3Int
 
    Declare Property X (byval Index as Integer) as Integer
 
    Declare Property X (byval Index as Integer, byval Value as Integer)
 
 
    Declare Property Y (byval Index as Integer) as Integer
 
    Declare Property Y (byval Index as Integer, byval Value as Integer)
 
 
    Declare Property Z (byval Index as Integer) as Integer
 
    Declare Property Z (byval Index as Integer, byval Value as Integer)
 
    
 
    Declare Function LBound() as Integer
 
    Declare Function UBound() as Integer
 
    
 
    Declare SUB Sort(byval RefPoint as Integer=0, byVal ls As Integer=-1, byVal re As Integer=-1)
 
    Declare Function Distance(Byval VecJ as Integer, Byval VecK as Integer) as Integer
 
    
 
    Private:
 
    Xx as UndefInt
 
    Yy as UndefInt
 
    Zz as UndefInt
 
    lb as Integer
 
    ub as Integer
 
End Type
 
 
Function Vec3Int.LBound() as Integer
 
    return lb
 
End Function
 
 
Function Vec3Int.UBound() as Integer
 
    return ub
 
End Function
 
 
Function Vec3Int.Distance (byval VecJ as Integer, Byval VecK as Integer) as Integer
 
    Dim as Integer X1,Y1,Z1
 
    Dim as Integer X2,Y2,Z2
 
    
 
    X1 = X(VecJ) : Y1 = Y(VecJ) : Z1 = Z(VecJ)
 
    X2 = X(VecK) : Y2 = Y(VecK) : Z2 = Z(VecK)
 
    
 
    Dim PX as Integer = abs(X1-X2)*abs(X1-X2)
 
    Dim PY as Integer = abs(Y1-Y2)*abs(Y1-Y2)
 
    Dim PZ as Integer = abs(Z1-Z2)*abs(Z1-Z2)
 
    
 
    Function = SQR(PX+PY+PZ)
 
End Function
 
 
 
Property Vec3Int.X (byval Index as Integer) as Integer
 
    Return Xx.V(Index)
 
End Property
 
Property Vec3Int.X (byval Index as Integer, byval Value as Integer)
 
    Xx.V(Index)=Value
 
    If Xx.LBound() < lb Then lb = Xx.LBound()
 
    If Xx.UBound() > ub Then ub = Xx.UBound()
 
End Property
 
Property Vec3Int.Y (byval Index as Integer) as Integer
 
    Return Yy.V(Index)
 
End Property
 
Property Vec3Int.Y (byval Index as Integer, byval Value as Integer)
 
    Yy.V(Index)=Value
 
    If Yy.LBound() < lb Then lb = Yy.LBound()
 
    If Yy.UBound() > ub Then ub = Yy.UBound()
 
End Property
 
Property Vec3Int.Z (byval Index as Integer) as Integer
 
    Return Zz.V(Index)
 
End Property
 
Property Vec3Int.Z (byval Index as Integer, byval Value as Integer)
 
    Zz.V(Index)=Value
 
    If Zz.LBound() < lb Then lb = Zz.LBound()
 
    If Zz.UBound() > ub Then ub = Zz.UBound()
 
End Property
 
    
 
 
 
 
 
 
'--->>>> QuickSort <<<<---
 
Sub Vec3Int.Sort(byval RefPoint as Integer=0, byVal ls As Integer=-1, byVal re As Integer=-1)
 
  ls = IIF(ls>-1, ls, lb)
 
  re = IIF(re>-1, re, ub)
 
 
  Dim TempL as Integer
 
  Dim TempR as Integer
 
  Dim i as Integer = ls
 
  Dim j as Integer = re
 
  Dim RD as Integer = Distance(RefPoint,(ls+re)\2)
 
 
  Do
 
    While Distance(RefPoint,i) < RD
 
      i+=1 
 
    Wend
 
    
 
    While RD < Distance(RefPoint,j)
 
      j-=1
 
    Wend
 
    
 
    If (i <= j) Then 
 
      TempL = X(i) : TempR = X(j)
 
      X(i) = TempR : X(j) = TempL
 
      TempL = Y(i) : TempR = Y(j)
 
      Y(i) = TempR : Y(j) = TempL
 
      TempL = Z(i) : TempR = Z(j)
 
      Z(i) = TempR : Z(j) = TempL
 
      
 
      i += 1 
 
      j -= 1
 
    End If
 
    
 
  Loop Until (i > j)
 
 
  If (ls < j ) Then Sort(RefPoint,ls, j ) 
 
  If (i  < re) Then Sort(RefPoint,i , re)
 
End Sub
 
 | 	 
  _________________
   | 
			 
		  | 
	 
	
		| Nach oben | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
  | 
   
 
     |