Feld eines Typen / DIMPUSH

Previous topic - Next topic

S.O.P.M.

Hey,

ich möchte gerne ein Feld von einem Typen haben und wollte das wie folgt machen. Ich definiere mir also meinen Typ

  TYPE ObjectProperties
      PosX
      PosY
      Mode
      State
   ENDTYPE


und will dann ein Feld damit verknüpfen

  DIM Object[10] AS ObjectProperties

Weil ich dabei einen Syntax Error bekomme, versuche ich es so:

  GLOBAL Object[] AS ObjectProperties

Jetzt ist das Feld jedoch noch nicht dimensioniert (erlaubt er mir mit GLOBAL nicht) und ich tue dies erst jetzt:

  DIM Object[10]

Nun sollte jeder Index dieses Feldes die Member des Types ObjectProperties haben, richtig!? Also versuche ich jetzt eine Zuweisung eines Wertes:

  Object[0].PosX = 1

Darauf hin meldet mir der Compiler jedoch "error : wrong argument type : TYPE  is not declared" Was mache ich falsch? Wenn ich übrigens einen weiteren Type mit einem Feldmember dieses Types erstelle, dann funktioniert es. Allerdings ist mir das dann zu umständlich und auch nicht mehr übersichtlich. Es muss doch direkt möglich sein!

Und noch eine Frage zu DIMPUSH. Was für ein Argument erwartet dieser Befehl an letzter Stelle? In der Hilfe steht "DIMPUSH feld[], eintrag", doch was ist mit Eintrag gemeint? Etwa der Wert, der dem neu hinzugefügten Index zugewiesen wird? Offensichtlich aber nicht, denn ich bekomme immer "error : wrong argument type :"
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Quentin

Ehrlich gesagt so ganz verstanden habe ich das auch noch nicht, warum man nicht gleich mit DIM hier arbeiten kann oder mache noch etwas falsch. Auf jeden Fall kann man mit DIMPUSH neue Einträge in ein Array einfügen, benötigt dazu allerdings eine Hilfsvariable vom gleichen Typ.

Folgendes kleine Beispiel kann das vielleicht verdeutlichen

Code (glbasic) Select
TYPE ObjectProperties
  PosX
  PosY
  Mode
  State
ENDTYPE

GLOBAL Object[] AS ObjectProperties   // Array
GLOBAL newObject AS ObjectProperties  // Hilfsvariable zum Einfügen in das Array

// 1. Eintrag erzeugen und mit DIMPUSH ins Array eintragen
newObject.PosX = 10
newObject.PosY = 10
newObject.Mode = 1
newObject.State = 0
DIMPUSH Object[], newObject  

// 2. Eintrag
newObject.PosX = 20
newObject.PosY = 30
newObject.Mode = 0
newObject.State = 1
DIMPUSH Object[], newObject

// .... weitere Einträge ...

// zur Kontrolle am Bildschirm ausgeben
FOREACH newObject IN Object[]
  PRINT newObject.PosX, 0, y
  INC y, 15
  PRINT newObject.PosY, 0, y
  INC y, 15
  PRINT newObject.Mode, 0, y
  INC y, 15
  PRINT newObject.State, 0, y
  INC y, 25
NEXT

SHOWSCREEN
MOUSEWAIT
END

Kitty Hello

Code (glbasic) Select
TYPE ObjectProperties
      PosX
      PosY
      Mode
      State
   ENDTYPE



   GLOBAL Object[] AS ObjectProperties


   DIM Object[10]



   Object[0].PosX = 1
Aktuelle Version - läuft! Bitte evtl. Update machen?

S.O.P.M.

Quentin, Dein Beispiel verdeutlicht das bestens! Das habe ich sofort verstanden, vielen Dank. Okay, dann könnte ich den Befehl zumindest schon beim Array eines Types anwenden. Bleibt nur die Frage, wie es bei einem Array ohne speziellen Typ aussieht. Wenn der also eine Variable desselben Typs erwartet und es keinen gibt, vielleicht klappt es dann auch mit einer einfachen Variable... eine Variable als Argument habe ich nämlich noch nicht probiert.

@GernotFrisch
Es ist natürlich erfreulich wenn es funktioniert. Ich hatte zwar auch schon ein Update unmittelbar nach dem Kauf gemacht aber vielleicht ist da wirklich ein Bug drin, was das betrifft. Leider befinde ich mich bereits in meinem nächsten Projekt und da will ich erst einmal lieber kein Update machen, damit ich mir nichts kaputt mache oder mein Code dann nicht mehr funktioniert - aber ich werde es später auf jedem Fall probieren.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Schranz0r

DimPush macht einen neuen Eintrag in das "Type-Array".

Wenn du ein Array erstellst, kannst du es auch später noch vergroßern:

Siehe mal mein Particletest dazu :D :

Code (glbasic) Select
// --------------------------------- //
// Project: Particle with Dims
// Start: Saturday, June 02, 2007
// IDE Version: 4.192

LIMITFPS 100

DIM Anzahl[0]

DIM Pos_X[0]
DIM Pos_Y[0]
DIM Pos_Z[0]

DIM Winkel[0]
DIM Winkel2[0]
DIM Alter[0]

LOCAL Particle_Nummer
LOCAL WinX = 800
LOCAL WinY = 600
LOCAL Speed = 1
LOCAL Joinpoint_X = 0
LOCAL Joinpoint_Y = 0
LOCAL Joinpoint_Z = 0

//-----------CREATE SPRITE--------------------------------
FILLRECT 0,0,5,5,RGB(0xff, 0x00, 0x00)
GRABSPRITE 1, 0, 0, 5, 5
BLACKSCREEN
//--------------------------------------------------------

SETSCREEN WinX, WinY, FALSE


WHILE TRUE
X_MAKE3D 1,10000,45
X_3rd_Person(Joinpoint_X, Joinpoint_Y, Joinpoint_Z, 400, 10)

//-----------CREATE PARTICLES-----------------------------
INC Particle_Nummer,1

REDIM Anzahl[Particle_Nummer]
REDIM Pos_X [BOUNDS(Anzahl[],0)]
REDIM Pos_Y [BOUNDS(Anzahl[],0)]
REDIM Pos_Z [BOUNDS(Anzahl[],0)]
REDIM Winkel[BOUNDS(Anzahl[],0)]
REDIM Winkel2[BOUNDS(Anzahl[],0)]
REDIM Alter[BOUNDS(Anzahl[],0)]

Pos_X [BOUNDS(Anzahl[],0)-1] = Joinpoint_X
Pos_Y [BOUNDS(Anzahl[],0)-1] = Joinpoint_Y
Pos_Z [BOUNDS(Anzahl[],0)-1] = Joinpoint_Z
Winkel [BOUNDS(Anzahl[],0)-1] = RND(359)
Winkel2 [BOUNDS(Anzahl[],0)-1] = RND(359)
Alter [BOUNDS(Anzahl[],0)-1] = -1
//--------------------------------------------------------

//-----------DRAW PARTICLES-------------------------------
FOR Draw_num = 0 TO BOUNDS(Anzahl[],0)-1
DEC Pos_X[Draw_num], COS(Winkel[Draw_num])*Speed
DEC Pos_Y[Draw_num], SIN(Winkel[Draw_num])*Speed
DEC Pos_Z[Draw_num], SIN(Winkel2[Draw_num])*Speed

INC Alter[Draw_num], 0.0015

ALPHAMODE Alter[Draw_num]
X_SPRITE 1, Pos_X[Draw_num], Pos_Y[Draw_num], Pos_Z[Draw_num], Alter[Draw_num]

IF Alter[Draw_num] > 0
DIMDEL Anzahl[], Draw_num
DIMDEL Pos_X[], Draw_num
DIMDEL Pos_Y[], Draw_num
DIMDEL Pos_Z[], Draw_num
DIMDEL Winkel[], Draw_num
DIMDEL Winkel2[], Draw_num
DIMDEL Alter[], Draw_num
DEC Particle_Nummer,1
ENDIF

NEXT
//--------------------------------------------------------

X_DRAWAXES 0,0,0

//-----------OUTPUTS--------------------------------------
X_MAKE2D
PRINT BOUNDS(Anzahl[],0),10,10
FPS(TRUE)
//--------------------------------------------------------

SHOWSCREEN
WEND
END





FUNCTION  X_3rd_Person: Player_x, Player_y, Player_z, Max_Entfernung_zum_Spieler, Min_Entfernung_zum_Spieler
IF ein_durchlauf = FALSE
Entfernung = Max_Entfernung_zum_Spieler
my = 45
ein_durchlauf = TRUE
ENDIF


X_CAMERA cam_x+Player_x, cam_y+Player_y, cam_z+Player_z,    Player_x, Player_y, Player_z



INC Entfernung,MOUSEAXIS(2)*10
IF Entfernung < Min_Entfernung_zum_Spieler THEN Entfernung = Min_Entfernung_zum_Spieler
IF Entfernung > Max_Entfernung_zum_Spieler THEN Entfernung = Max_Entfernung_zum_Spieler

mx = mx + MOUSEAXIS(0)/4
my = my + MOUSEAXIS(1)/4

IF my < 0 THEN my = 0
IF my > 90 THEN my = 90

cam_x = Entfernung * COS(mx)
cam_z = Entfernung * SIN(mx)
cam_y = Entfernung * SIN(my)
ENDFUNCTION


FUNCTION FPS: ShowFps
    TimeK=GETTIMER(); Time=Time+TimeK; frames=frames+1;
    IF Time>999; FR=frames; frames=0; Time=TimeK-1000; Seconds=Seconds+1;
        IF Seconds>59; Minutes=Minutes+1; Seconds=0; ENDIF;
        IF Minutes>59; Hours=Hours+1; Minutes=0; ENDIF;
        IF Hours>23; Days=Days+1; Hours=0; ENDIF;
    ENDIF;
    IF ShowFps=TRUE
        Line=20
        PRINT "Time: "+Days+ ":" + Hours + ":" + Minutes + ":" + Seconds,10,Line*1
        PRINT "FPS="+FR,10,Line*2
    ENDIF
                     RETURN FR
ENDFUNCTION
ZITAT:
Leider befinde ich mich bereits in meinem nächsten Projekt und da will ich erst einmal lieber kein Update machen, damit ich mir nichts kaputt mache oder mein Code dann nicht mehr funktioniert - aber ich werde es später auf jedem Fall probieren.


Dazu kann ich nur eins sagen...........LOL
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin

@S.O.P.M
ich würde trotzdem ein Update vorziehen. In der Regel werden damit (zumindest bei den kleinen Ups) selten neue Funktionalitäten hinzugefügt bzw. bestehde geändert, sondern Fehler behoben. Könntest ja auch eine Sicherungskopie des GLBasic-Ordners machen.

S.O.P.M.

@Schranz0r
Dein Partikeltest ist wirklich nett, hab ich mal eben mit rumgespielt. Bei 5000 Partikeln geht dann die Framerate bei mir auf 60 zurück :) Also kurz gesagt: beim einfachen Array nehm ich doch gleich REDIM!
QuoteDazu kann ich nur eins sagen...........LOL
Bei Deinem Code musste ich doch auch sehr über diese Stelle schmunzeln:
Code (glbasic) Select
RGB(0xff, 0x00, 0x00)RGB kombiniert mit Hexadezimalzahlen... :D

Quote from: Quentinich würde trotzdem ein Update vorziehen.
Naja, ma gucken...
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Schranz0r

Was ist daran lustig?


Rechtsklick / Werkzeug / RGB Auswahl

Da haste dann deinen Witz XD


Und mach das Update, das Funzt immer!!
Und Gernot macht keine Veränderungen in der Syntax... Max. einen neuen Befehl, aber laufen tuts wie sonnst auch, da achtet der schon drauf!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S.O.P.M.

Achso, ich dachte mit der RGB Auswahl erhält man normale Zahlenwerte. Nee, dann ist es natürlich nicht mehr witzig. Der Witz daran wäre nämlich gewesen, wenn Du jetzt das machst, was du vor einiger Zeit umständlich fandest und das aber kombiniert mit dem bequemen RGB Werkzeug. Äh, vergessen wir das lieber schnell...

Zum Update: Hab es so eben durchgeführt und jetzt startet der Editor nicht mehr. Neuinstallation könnte das Problem beheben, heißt es...
Edit: Moment, ich brauch' doch jetzt diese Laufzeitbibliothek! Die installiere ich erstmal und sehe, was passiert...

Jetzt geht's.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Schranz0r

HEHE.... soooo, schwein gehabt was :D
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S.O.P.M.

jup, das kann man wohl sagen ;)
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Kitty Hello

LOL. Die Updates machen i.d.R. nie was kaputt, nur besser.

Schranz0r

Hab ich ihn auch versucht mit zu teilen XD
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard