Type und Array verbinden

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Hubsi

Betreff: Type und Array verbinden

BeitragMi, Nov 17, 2010 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo beisammen.

Ich möchte einer festen Anzahl von Einheiten (das Array) eine unbestimmte Anzahl Informationen (das Type-Konstrukt) mitgeben. Darum habe ich einfach mal auf blöd folgendes versucht:

BlitzBasic: [AUSKLAPPEN]
; Pseudo-Beispielcode

Type T_open_data
Field dat
End Type

Dim open_data.T_open_data(4)


Der ein oder andere erkennt vielleicht schon worauf ich hinaus will? Ich brauche im Beispiel 5 voneinander unabhängige Typelisten, welche ich aber über den Index einzeln ansprechen kann. Was aber nicht wie gedacht funktioniert:
BlitzBasic: [AUSKLAPPEN]
; Pseudo-Beispielcode

Type T_open_data
Field dat
End Type

Dim open_data.T_open_data(4)

open_data.T_open_data(1)=New T_open_data
open_data(1)\dat=1

open_data.T_open_data(2)=New T_open_data
open_data(2)\dat=2

For open_data.T_open_data(1)=Each T_open_data
Print open_data(1)\dat
Next

WaitKey()
End

Erwartungswert wäre gewesen nur die 1 auf dem Bildschirm zu sehen, da in dieser Liste nur ein Eintrag gespeichert werden sollte, eben die 1. Aber gut, so einfach ist es scheinbar nicht Very Happy Gibt es vielleicht eine andere Lösung zu dem Problem?
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

BladeRunner

Moderator

BeitragMi, Nov 17, 2010 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Das geht so leider in BB nicht, da es eine gemeinsame interne Liste für alle Typeinstanzen anlegt.
Du kannst nur deinem Type ein ID-Feld geben und anhand dessen bestimmen welcher Liste ein Type angehört, was allerdings performancetechnisch schwach ist.
Die Alternative wäre das einspeichern der Handles der Typeinstanzen in einzelne Banken und dann ein durchiterieren durch diese. each fällt dann halt flach, da mussst du eigene Steuerinstrumente schaffen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Holzchopf

Meisterpacker

BeitragMi, Nov 17, 2010 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich dich richtig verstanden habe:
Leider nein. Denn in BB sind Listen und Benutzerdefinierte Types nicht getrennt. Das heisst, dass ausnahmslos alle Objektinstanzen eines Types in derselben Liste landen =/

Wenn du nicht zwingend auf das Verhalten (resp. die Vorteile) von Listen angewiesen bist - also die hohe Dynamik - dann mach' doch statt 5 Listen (was ja so gar nicht direkt geht) einfach 5 Arrays vom Typ T_open_data.

Wenn du nicht auf die Listendynamik verzichten kannst und du im Voraus genau weisst, wie viele Listen es immer sein werden, könntest du auch pro Liste einfach einen Type erstellen mit je einem einzigen Feld vom Typ T_open_data um dieses Objekt zu referenzieren. Ist aber unsauber hoch zehn.

Eine nicht ganz so optimale Lösung (die aber viel Optimierungspotenzial mit sich bringt - je nach Fall) ist auch, einfach alle Listen zu vereinen und jedem Objekt zu sagen, in welche Liste es gehört (also ein Feld list%). Wenn du dann "Liste 1" durchgehen willst, gehst du einfach die ganze Liste durch, verarbeitest aber nur die Objekte mit list%=1 Wink Jetzt denkst du aber: "Das ist ja total langsam, wenn ich für ein paar wenige Objekte immer die ganze Liste durchgehen muss!" und damit hast du auch irgendwie recht, aber wenn du eh jeden Schleifendurchgang mal jede Liste komplett durchgehen musst und mit jedem Objekt je nach Listenzugehörigkeit was anderes anstellen willst, kannst du auch einfach die Funktionalität in ein Entscheidungskonstrukt einplastern und musst dann die ganze liste nur noch ein mal durchgehen.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

FireballFlame

BeitragMi, Nov 17, 2010 16:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja. Schönere Wege gibts da wohl nicht.
Einer der Gründe, warum ich auf BlitzMax umgestiegen bin Razz
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Hubsi

BeitragMi, Nov 17, 2010 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, schade Very Happy Dann muß ich die Daten in eine Bank packen. Die max. Anzahl der Einträge ist zwar fest, wird aber in den allerwenigsten Fällen voll gebraucht. Mit dem Type wollte ich eigentlich den Ram entlasten, aber man kann halt nicht alles haben Mr. Green
@Holzchopf: Die einzelnen Listen würden nicht in jedem Durchlauf alle benötigt. Einmal brauche ich Liste 1, ein paar Sekunden später wieder Liste 3 wegen meiner, etc. Aber der Gedanke an sich ist merkenswert. Wer weiß was noch kommt Very Happy

Vielen Dank an alle für die Hilfe.
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...
 

BIG BUG

BeitragDo, Nov 18, 2010 2:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ja. Schönere Wege gibts da wohl nicht.

Gibt es doch:
Du kannst für jeden Eintrag in Deinem DIM einen Dummy-Type erzeugen und direkt referenzieren. Dann musst Du einen Wert/Feld festlegen, woran Du Deine Dummies erkennst. Wenn Du jetzt zu Deiner Liste einen Eintrag hinzufügen möchtest, verwendest Du einfach INSERT AFTER Dummyeintrag. Möchtest Du die Teilliste durchgehen, kannst Du mit eigener Schleife und AFTER arbeiten. Sobald Du auf den nächsten Dummyeintrag triffst, brichst Du ab, Du hast alle Sätze in der Schleife verarbeitet.

Ein Beispiel - Type in Type aber vom Prinzip gleich - habe ich mal hier gepostet(uhh ist das alt, gerade mal 4-stellige Topic ID):
https://www.blitzforum.de/foru...php?t=1052
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

Mr.Keks

BeitragSo, Nov 21, 2010 14:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm? Natürlich gehen Listen mit Blitz! (Nur eben keine generischen...)

BlitzBasic: [AUSKLAPPEN]
Type T_open_data
Field dat
Field nextElement.T_open_data ; Verweis auf der nächsten Eintrag in der Liste
End Type

; Fügt newEntry an das Ende der Liste, die auf list folgt an.
Function Append(newEntry.T_open_data, list.T_open_data)
If list = Null Then Return
While Not list\nextElement = Null
list = list\nextElement
Wend
list\nextElement = newEntry
End Function
Jetzt kannst du durch das Merken des jeweils ersten Elements ne beliebige Anzahl einfach verketteter Listen vom selben Type benutzen.

Ne For-Each sieht dann so aus, BlitzBasic: [AUSKLAPPEN]
elem.T_open_data = firstElement
While Not elem = Null
; mach etwas
elem = elem\nextElement
Wend
MrKeks.net

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group