Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zugriff auf UDT/Property's?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.07.2012, 11:16    Titel: Zugriff auf UDT/Property's? Antworten mit Zitat

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 grinsen) 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 01.07.2012, 14:09    Titel: Sortieren... Antworten mit Zitat

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! grinsen

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz