DATA und DIM

Previous topic - Next topic

Worebu

Hallo Leute, ich bin's mal wieder, erstmal einen schönen Samstag Abend. Kann mir jemand sagen warum ich in der DIM Zeile immer eine Fehlermeldung bekomme

Code (glbasic) Select

STARTDATA daten:
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
ENDDATA

DIM n1$[20], n2$[20], n3$[20], n4$[20], n5$[20], n6$[20], n7$[20]
//
RESTORE daten
FOR i = 1 TO 19
  READ n1$[i], n2$[i], n3$[i], n4$[i], n5$[i], n6$[i], n7$[i]
NEXT


Ich wäre für eine Antwort dankbar. Habe schon verschiedene Variationen durch. Keine funzt. Bitte nicht auf die Daten eingehen, habe ich nur so angelegt. Die Füllung dürfte der VAR ja egal sein.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

hardyx

GLBasic allows you to use variables without declaring before like in classic BASIC, but you must to see if you have the option activated. Uncheck the setting "Explicit declarations" in Project > Options in the menu, to disable the mandatory variable declarations.

If you want to use variable declarations, you must to to insert this line before the DIM line.
Code (glbasic) Select
GLOBAL n1$[], n2$[], n3$[], n4$[], n5$[], n6$[], n7$[]

Worebu

Das ist es leider auch nicht, habe alles umgestellt, bekomme immer noch die Fehlermeldung.   :'(

Code (glbasic) Select

GLOBAL  n1$[], n2$[], n3$[], n4$[], n5$[], n6$[], n7$[]
DIM n1$[20], n2$[20], n3$[20], n4$[20], n5$[20], n6$[20], n7$[20]
//
RESTORE daten
FOR i = 1 TO 19
  READ n1$[i], n2$[i], n3$[i], n4$[i], n5$[i], n6$[i], n7$[i]
NEXT
//
STARTDATA daten:
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
  DATA "Klaus","Meyer","Oldenburg","April","Mann","65","grün"
ENDDATA
//
RESTORE daten
FOR i = 1 TO 19
  READ n1$[i], n2$[i], n3$[i], n4$[i], n5$[i], n6$[i], n7$[i]
NEXT


Explicit declarations ist an. Bekomme immer noch die Fehlermeldung

*** Configuration: WIN32 ***
precompiling:
GPC - GLBasic Precompiler V.9.829 SN:e2471947 - 3D, NET
"test.gbas"(9) error : syntax error


Zeile 9 ist die Zeile mit der DIM Anweisung. Habe einpaar REM's rausgeschmissen.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Schranz0r

#3
Code (glbasic) Select
GLOBAL  n1$[], n2$[], n3$[], n4$[], n5$[], n6$[], n7$[]
DIM n1$[20]
DIM n2$[20]
DIM n3$[20]
DIM n4$[20]
DIM n5$[20]
DIM n6$[20]
DIM n7$[20]


So gehts! Btw.:
Code (glbasic) Select

FOR i = 1 TO 19
          READ n1$[i], n2$[i], n3$[i], n4$[i], n5$[i], n6$[i], n7$[i]
NEXT


sollte sein:

Code (glbasic) Select
FOR i = 0 TO 19 // 20 Durchläufe
          READ n1$[i], n2$[i], n3$[i], n4$[i], n5$[i], n6$[i], n7$[i]
NEXT
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

Worebu

#4
Hai, vielen dank SchranzOr. So Funzt es, ich dachte ich könnte alle DIM's, oder mehrere, in eine Zeile schreiben. Nochmals Danke. Sag mal kann ich die Warnings vernachlässigen?

"xxxx.gbas"(40) warning : variable already exists : plan$

Davon habe ich für jede VAR eine.
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

kanonet

Du kannst DIMs in eine Zeile schreiben, sparst dadurch aber keine Zeichen ein (im Gegensatz zu LOCALs etc), sondern lediglich etwas Platz:
Code (glbasic) Select
DIM n1$[20]; DIM n2$[20]
; hat den gleichen Effekt wie ein Zeilenumbruch, könntest also im Extremfall sogar dein ganzes Spiel in einer Zeile schreiben.  :D

Die Warnung sagt nichts anderes aus, als dass du eine Variable mehrmals definierst, ist hast also vermutlich zwei GLOABLs für eine Variable, oder zwei LOCALs im gleichen Programmteil. Übrigens Definiert FOR i% die Variable i% (oder wie auch immer du sie nennst), hat also den gleichen Effekt als würde dort ein LOCAL i% stehen, die Variable ist für die gesamte FOR Schleife definiert, danach und davor nicht. In den meisten Fällen ist eine erneute Definition bedeutungslos und es hat keinen Einfluss wenn du sie ignorierst - es kann aber ein paar Sonderfälle geben, wo es einen Unterschied macht, wenn du dir dann angewöhnst Sie einfach zu ignorieren (was eben meist gut geht, aber nicht immer), findest du das Problem nicht. Daher empfehle ich, die Warnungen loszuwerden indem du die zweite Definition löscht, ist wohl in deinem Fall nicht nötig, aber perspektivisch besser so.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Worebu

Eigentlich habe ich nur einmal Global und einmal DIM für jede VAR. :S
Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

Schranz0r

Quote from: Worebu on 2013-Jun-29
Hai, vielen dank SchranzOr. So Funzt es, ich dachte ich könnte alle DIM's, oder mehrere, in eine Zeile schreiben. Nochmals Danke. Sag mal kann ich die Warnings vernachlässigen?

"xxxx.gbas"(40) warning : variable already exists : plan$

Davon habe ich für jede VAR eine.


Hört sich nach "doppeldekleration" an, bitte mal den Code schicken.
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

hardyx

Quote from: Worebu on 2013-Jun-29

"xxxx.gbas"(40) warning : variable already exists : plan$

Perhaps you made a DIM in a SUB of FUNCTION and it's called more than once.
In this case, use REDIM instead.

Worebu

Das ist richtig, die GLOBAL Anweisung mache ich in einer SUB, und die DIM ist in einer anderen. Aber auch wenn ich GLOBAL  und DIM zusammen in einer SUB habe kommt die Medlung. Mit REDIM ändert sich auch nichts. Mit REDIM kommt noch zusätzlich die Meldung:

"xxxx.gbas"(27) error : variable is not explicitly defined : plan$


Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD

hardyx

#10
If you need to call many times the GLOBAL declaration, is better to put outside all the SUBs and FUNCTIONS. This way is available to all the program (it's a global). This code works without warning messages.

Code (glbasic) Select
' call many times to test
GOSUB test
GOSUB test
END

' declare global vars
GLOBAL n1$[], n2$[], n3$[], n4$[], n5$[], n6$[], n7$[]

SUB test:
        ' each dim in one separate instruction
DIM n1$[20]; DIM n2$[20]; DIM n3$[20]; DIM n4$[20]
        DIM n5$[20]; DIM n6$[20]; DIM n7$[20]
n1$[0] = "aa"    ' to use some variable
ENDSUB

WPShadow

Ich für meinen Teil habe mir folgenden Programmierstil angewöhnt:

Code (glbasic) Select

// Definition aller Variablen, Types usw. die ich benötige, die global gesetzt werden müssen

TYPE beispiel_type
  x
  y
ENDTYPE

// Dieser Block ist meistens größer
GLOBAL beispiel AS beispiel_type, test$
GLOBAL test_2[]

// Danach folgt erst der Code, die Funktionen, Subs, usw.

main()

FUNCTION main:
  beispiel.x = 7
  PRINT beispiel.x, 0, 0
  SHOWSCREEN
  KEYWAIT
  END
ENDFUNCTION
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est

Worebu

#12
Hi, jetzt habe ich es raus  =D.
Ich habe die GLOBALs direkt vor den Hauptprogrammteil gesetzt.

Globals also aus einer SUB genommen und jetzt gehts ohne Warnings und Errors. Es war also kein doppelter Aufruf oder eine doppelte Deklaration.

THX an alle. Danke für die Antstösse und Hilfe  :good:

Code (glbasic) Select

SETCURRENTDIR("Media") // go to media files
SETTRANSPARENCY RGB(255,0,128)
SETSCREEN 1680,1050,1

//
GLOBAL n1$[]
GLOBAL n2$[]
GLOBAL n3$[]
//
//
GOSUB init
GOSUB gfx
GOSUB startscreen
GOSUB daten
LOADBMP "bground.bmp"
//
main: // Hier startet das Programm
//
MOUSESTATE mx,my,b1,b2 // VAR
PRINT "MX:"+ mx, 350, 980 // Kontrollausgabe X, wo ist die Maus ?
PRINT "MY:"+ my, 650, 980 // Kontrollausgabe Y, wo ist die Maus ?
//
        PRINT n1$[3], 500,500                                    // Testausgabe von n1$
SHOWSCREEN
GOTO main // ... und hier ist es zuende

Intel I5 9600 - RTX 4070, WaKü, 32GB RAM, 1x 512gb + 1x 1Gb NVRAM,  1x4TB + 1x1TB HD