 |
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, 11: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, 14: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.
|
|