Type in Function

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

adba

Betreff: Type in Function

BeitragSo, Feb 01, 2004 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo

Ich habe folgendes Problem:

Ich habe einen Type erstellt

Type WindowType
field bla
field blabla
end type

;und ich übergebe nun einer functionen diesen type:

fenster.WindowType = new WindowType
fenster.WindowType = MakeWindow(fenster.WindowType,x,y)
; Hier tritt der Fehler auf: illegal Type conversion


;Meine Function ist in etwa so:

function MakeWindow(win.WindowTape,x,y)
win\bla=blablabla
win\blabla=test
return win.WindowType
end function


; Wo könnte der Fehler liegen???

Blatolo

BeitragSo, Feb 01, 2004 19:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
function MakeWindow(win.WindowTape,x,y)

Hier wird ein Objekt des types windowtape erwartet aber du übergibst eines vom type windowtype.
Oder war das jetzt nur ein Tippfehler der nicht im Programm ist?
 

IonPainter

BeitragSo, Feb 01, 2004 19:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]

Type WindowType
Field bla
Field blabla
end type

;und ich übergebe nun einer functionen diesen type:

fenster.WindowType = New WindowType
xHandle = MakeWindow(fenster.WindowType,x,y)
fenster.WindowType = Object.WindowType(xHandle)

Print fenster\bla
Print fenster\blabla

WaitKey()



;Meine Function ist in etwa so:

Function MakeWindow(win.WindowType,x,y)
win\bla=122
win\blabla=133
Return Handle(win.WindowType)
End Function
 

walski

Ehemaliger Admin

Betreff: Re: Type in Function

BeitragSo, Feb 01, 2004 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
- WEGLASSEN! fenster.WindowType = new WindowType

fenster.WindowType = MakeWindow(fenster.WindowType,x,y)
; Hier tritt der Fehler auf: illegal Type conversion


;Meine Function ist in etwa so:

function MakeWindow.WindowType(x,y)
local TempType.WindowType = new WindowType
TempType\bla=x
TempType\blabla=y
return TempType
end function


So ist es wohl am elegantesten gelöst.

walski
buh!

Markus2

BeitragSo, Feb 01, 2004 22:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Oder so :

Global fenster.WindowType ;für For Each

Global fenster1.WindowType ;nur dieses

fenster1= NewWindow(x,y)
x=x+20
SetWindow fenster1,x,y

function SetWindow(win.WindowType,x,y)
win\x=x
win\y=y
end function

function NewWindow.WindowType (x,y)
local win.WindowType = new WindowType
win\x=x
win\y=y
return win
end function

adba

BeitragMo, Feb 02, 2004 0:06
Antworten mit Zitat
Benutzer-Profile anzeigen
dankefür eure schnelle Antworten! habs geschafft!

ich habe aber gerade noch eine weiter frage mit types:

ich habe ca. folgenden code:

type blablatype
field x,y
end type

type testtype
field b.blablatype ;also type in typs aber das ist nicht das problem
field irgendwas
end type

und jetzt will ich:

for a=0 to 10
t.testtype = new testtype
for b=0 to 5
t\b.blablatype = new blablatype
next
next
.
.
.
und jetzt will ich aber nur die blablatypes von einem testtype aufrufen und nicht alle blablatypes:

for t.testtype = Each testtype
if t\irgendwas>0 then
for t\b.blablatype = each blablatype ; <- das funktioniert irgedwie nicht
t\b\x=t\b\x*-1
next
endif
next

das problem ist das es wenn ich
for t\b.blablatype = each blablatype schreibe es dann immer alle blablatypes durchgeht und nicht nur diese die im t drinn sind also nicht nur diese 5 sondern alle 50! (ist das verständlich?)

wie krig ich das hin?

(tja blitzbasic ist halt nicht objekt orintierts programmieren aber java ist zu langsam und mit c++ verbraucht man sooo viel zeit bis schon nur das gerüst läuft!)

PS: gibt es bald DirectX 8 und 9 unterstützung von B3d? ich finde die DirectX 7 hat langsam ausgedient, mann kann zwar schon schöne sachen zaubern aber nichts mehr revolutionäres Smile
 

walski

Ehemaliger Admin

BeitragMo, Feb 02, 2004 0:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit BMax soll ja OpenGL kommen und das wär geil.
Und gestern hat irgendwer im Chat das Gerücht gestreut, dass der 11. März BMax Stichtag sei... naja wers glaubt...

Zu deinem Problem:
Das ganze ist leider nur durch n ID Field machbar Smile
Also musst du jedem "Parent-Type" ne ID geben und dann

for Type = each TypeType
for SubType = each SubTypeType
if SubType\ID = Type\ID then
...
endif
next
next

Sowas in der Art.
Nur dann mussu halt auch wieder IDs vergeben, aufpassen was passiert wenn du eine ID aus der Mitte rauslöschst etc...
Wenn du das umgehen willst und nicht "unendlich" Types hast, dann würd ich einfach ne globale (ich weiß is unschön aber was solls) Variable nehmen und die hochzählen bei jeder "Type-Erstellung".

So long

walski
buh!

Markus2

BeitragMo, Feb 02, 2004 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
so geht das nicht weil du jedes mal das Handle überschreibst .

Alternative wenn die 5 fest sind

for a=0 to 10
t.testtype = new testtype
t\b1.blablatype = new blablatype
t\b2.blablatype = new blablatype
t\b3.blablatype = new blablatype
t\b4.blablatype = new blablatype
t\b5.blablatype = new blablatype
next

oder mit IDs arbeiten die auf t verweisen


for a=0 to 10
t.testtype = new testtype
t\ID=a
for i=1 to 5
b.blablatype = new blablatype
b\IDParent=t\ID
next
next

adba

BeitragMo, Feb 02, 2004 0:24
Antworten mit Zitat
Benutzer-Profile anzeigen
ja das mit den ids hab ich mir auch schon überlegt aber das frisst enorm rechnleistung wenn ich dann mit ca 1000 oder noch mehr typs arbeite den anstatt nur ca 10 durzugehen muss ich dann jedes mal 1000*10 durchgehen und bei jedem noch die id testen... hmm dann ist java schon wider schneller Smile

naja ich schau mal was sich machen lässt oder gibt es eine dll die solche typs unterstützt? währe mal eine gute aufgabe für die c++ spezialisten die könnten doch so eine dll schreiben! Smile
 

walski

Ehemaliger Admin

BeitragMo, Feb 02, 2004 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das braucht weniger Zeit als du denkst die durchzugehen.
Mach mal ein paar Messungen, es ist wirklich wenig, auch bei vielen Elementen. Aber ich gebe gerne zu: optimal is das nicht.

Aber eben auch nicht so schlimm, wie man meinen sollte.

walski
buh!

TheShadow

Moderator

BeitragMo, Feb 02, 2004 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
schau dir Handle und Objekt an - handles kann man in bank speichern...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Markus2

BeitragMo, Feb 02, 2004 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
@adba

Wenn es geht kannst du ja das Parent Objekt in den vielen Types
merken und direkt ansprechen .

Also einmal die Unterliste durch gehen und was mit dem Parent machen .

Als Beispiel ,
du hast drei Spieler aber 10000 Kugeln die durch die Gegend fliegen .
Dabei muß man ja nicht erst die Spieler durch gehen und die
Kugel heraus suchen max. 3*10000 sondern man kann ja auch
1*10000 Kugeln durch gehen und gucken wen die treffen werden .

adba

BeitragDi, Feb 03, 2004 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja das stimmt. aber ich will nicht meine cpu leistung damit belasten unnütze sachen zu testen...

ich hätte gerne ca folgende type struktur:

type baumtype
field aestetype
field früchtetype
field x,y,z,h,w,b,t
field color
field texturen
end type

type haustype
field wandtype
field stocktype
field mesh
field x,y,z,w,h,b,t
field usw...
end type

type level
field terraintype
field baumtype
field haustemp
field uswtype
end type


... usw.. aber ich will dann zb nur eine frucht eines baumes ansprechen dann wil ich nicht alle andern auch noch (das könnten ja 10000 sein)

naja...
 

BIG BUG

BeitragMi, Feb 04, 2004 20:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier mal eine Lösung:

Code: [AUSKLAPPEN]


Const TYPE_ENTRY    = 0
Const TYPE_INSTANCE = 1


SeedRnd MilliSecs()


Global Cnt_Instance

Type Frucht
   Field Typ; 0=Entry 1=Instance
            ; Könnte man auch in Name oder Gewicht verstecken
   Field Name$
   Field Gewicht
End Type

Type Baum
   Field Name$
   Field Frucht.Frucht
End Type


;Bäume erzeugen
abaum.baum = CreateBaum("Apfelbaum",    "Apfel")
bbaum.baum = CreateBaum("Birnbaum",     "Birne")
kbaum.baum = CreateBaum("Kirschbaum",   "Kirsche")
pbaum.baum = CreateBaum("Pflaumenbaum", "Pflaume")



;Früchte erzeugen
For b.baum = Each baum
   
   Anzahl = Rand(2,7)
   For i = 1 To Anzahl
      CreateFrucht(b,Rand(50,250))     
   Next

Next


;Früchte je Baum ausgeben

For b.baum = Each baum
   
   Print b\name$
   f.frucht = After b\frucht
 
   While f <> Null 
      If f\Typ = TYPE_INSTANCE Then Exit

      Print "  " + f\Name$ + "  " + f\Gewicht + "g"
      f.frucht = After f.frucht
   Wend

Next

WaitKey()

;Ende Hauptprogramm

Function CreateBaum.Baum(Baumname$, Fruchtname$)

   Local b.Baum

   b = New Baum

   b\Name$  = Baumname$
   b\Frucht = CreateFruchtInstance(Fruchtname$)
   Return b

End Function


Function CreateFruchtInstance.Frucht(Fruchtname$)

   Local f.Frucht

   f        = New Frucht
   f\typ    = TYPE_INSTANCE
   f\Name$  = Fruchtname$
   Return f

End Function


Function CreateFrucht.Frucht(Baum.Baum, Gewicht)

   Local f.Frucht
   Local h.Frucht

   If baum.baum = Null Return Null

   h = baum\frucht

   f         = New Frucht
   f\typ     = TYPE_ENTRY
   f\Name$   = h\name$
   f\Gewicht = Gewicht
   Insert f After baum\frucht

   Return f

End Function



Prinzip:
Es wird für jeden "Ober-Type" ein eigener Informations-Eintrag im "Unter-Type" angelegt, der entsprechend verlinkt wird.
Alle neuen Objekte werden dann direkt hinter dem entsprechenden InfoEintrag erzeugt. Über diesen Infoeintrag werden dann die einzelnen Instanzen direkt abgefragt.

Die manuelle Abarbeitung der Type-Einträge ist bei deaktiviertem Debugger übrigens nicht viel langsamer als eine For-Each-Schleife:
Code: [AUSKLAPPEN]


Type blup
   Field affe
End Type

For i = 1 To 1000000
   f.blup = New blup
Next

 
Print "Zeitmessung Manuell"
 
f.blup = First blup

oldtime = MilliSecs()
While f <> Null 
   If f\Affe = 5 Then Exit
   f.blup = After f.blup
Wend
Print MilliSecs() - oldtime


Print "Zeitmessung For-Each"

oldtime = MilliSecs()
For f.blup = Each blup

Next

Print MilliSecs() - oldtime

WaitKey()
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

adba

Betreff: Cool Danke!

BeitragMi, Feb 04, 2004 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke genau das brauchte ich. ist zwar ein bisschen umständlich aber machbar und genug schnell.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group