Type als Array ansprechen

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

hectic

Sieger des IS Talentwettbewerb 2006

Betreff: Type als Array ansprechen

BeitragFr, Okt 23, 2015 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benötige acht Typefelder mit jeweils unbekannter Anzahl von Einträgen. Dabei möchte ich vermeiden, dass eine riesige Liste per If AktuellerEintrag=BenötigterEintrag Then durchgearbeitet werden muss.

Gibt es eine Möglichkeit mehrere Types als Indizies (nennt man das so?) anzusprechen? Beispiel Code: [AUSKLAPPEN]
Type TType[7]
   Field Eins%
   Field Zwei%
End Type

Klar, man könnte einmal TType1, dann TType2 ... TType8 erstellen. Blöd ist dann aber die spätere Abfrage. Diese müsste dann auch achtmal vorhanden sein statt einmal For Liste.TType[wert]=Each TType[wert] zu schreiben.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Jan_

Ehemaliger Admin

BeitragFr, Okt 23, 2015 14:01
Antworten mit Zitat
Benutzer-Profile anzeigen
banks?
between angels and insects

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Okt 23, 2015 14:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ganze soll für ein Editor sein. In diesem sollen auch Einträge wieder gelöscht werden können. Oder wie meinst du das?

Folgendes hätte ich mir vorestellt gehabt: Code: [AUSKLAPPEN]
Graphics 1920,1080,0,2
SetBuffer FrontBuffer()

Type TType[1]
   Field eins%
   Field zwei%
End Type

Local meinType.TType[1]

TNew(0,101,102)
TNew(0,103,104)
TNew(1,201,202)
TNew(1,203,204)




Print "zeige nur aus 0 die werte an '100er'"

For meinType.TType[0]=Each TType
   Print meinType\eins+" "+meinType\zwei
Next

Print "zeige nur aus 1 die werte an '200er'"

For meinType.TType[1]=Each TType
   Print meinType\eins+" "+meinType\zwei
Next

WaitKey




Function TNew%(pos%,one%,two%)
   
   Local meinType.TType[pos]=New TType
   
   meinType\eins=one
   meinType\zwei=two
   
   Return Handle(meinType)
   
End Function
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Chester

BeitragFr, Okt 23, 2015 15:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Irre ich mich, oder sollte eigentlich nicht
Code: [AUSKLAPPEN]
Type TType
   Field eins%
   Field zwei%
End Type

Local meinType[7].TType

meinType[1]\eins=42
funktionieren?

Kann es gerade nicht testen und bin mir über die Position der [] unsicher, aber iich glaub ich hatte das auch mal so ähnlich

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Okt 23, 2015 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat leider nicht geklappt. Aber das Type müsste ja in das BlitzArray gepackt werden damit es mehrere davon gibt. In deinem Beispiel gibt es ja nach wie vor nur ein Type. Hmmm. Also wenn du eine Lösung dazu hast, würde mich das freuen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Silver_Knee

BeitragFr, Okt 23, 2015 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du die Liste sortierst kannst du einmal TType erstellen und dann folgendes tun:

Code: [AUSKLAPPEN]
Local ersterEintrag[7].TType


Könntest jetzt 7 Dummy-Instanzen nehmen um damit die Sub-Listen zu trennen (dann musst du die bei For-Each aussortieren) oder du fügst viele !=Null-Vergleiche ein, gibst noch die listennummer jedem Objekt mit und gehst die Sub-Listen mit Until current.listennummer<>listennummer durch.

Oder du ignorierst die interne Liste von BB und machst dein eigenes Dim array.TType(listeNummer,eintragNummer) das du mit For i .. For j durchgehst.

Xeres

Moderator

BeitragFr, Okt 23, 2015 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Das lässt sich nicht (schön/elegant) in BB lösen, weil es nur exakt eine Liste pro Type gibt.
Gib dem Type noch einen Wert "group" oder "list" und überspringe die ungewollten Werte (jede menge unnötige Schleifendurchläufe!) oder bau die komplette Listenlogik nochmal nach mit einer Mischung aus Handle, Object und Dim - oder schau ins codearchiv unter dem stichwort "collection" um das per DLL(?) nach zu rüsten.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Silver_Knee

BeitragFr, Okt 23, 2015 22:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Das mit dem Nachbauen geht auch einfacher:

Code: [AUSKLAPPEN]
Type TList
Field firstElement.TListElement
End Type

Type TListElement
Field nextElement.TListElement
...
End Type

;For Each einer Liste
Local l.TList=First TList;welche Liste auch immer
Local current.TListElement=l.first
While current
...
current=current\nextElement
Wend

;Insert New TListElement Before First TListElement
current=new TListElement
current\nextElement=l.firstElement
l\firstElement=current

;Delete
current=...
If current\nextElement
current\nextElement=current\nextElement\nextElement
Endif
Delete current


Dabei ist zu beachten, dass die Reihenfolge in den einzelnen Listen nichts mit der Reihenfolge von For Each/Insert After Before zu tun hat. Zum durchgehen allet TListElement kann man wenn einem die Reihenfolge egal ist aber immernoch For Each nehmen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Okt 24, 2015 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke erstmal für die Vorschläge. Ich werde mir das mal die Tage zu Gemüte führen. Es ist jetzt zwar kein Weltuntergang acht Listen per Ident auszufiltern, dafür ist die Abarbeitung der Types zu schnell. Aber eine "schönere" Lösung hätte ich mir schon gewünscht. Das Beispiel von Silver_Knee prüfe ich auch noch mal durch.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group