Code übersichtlicher und einfacher machen
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Das funktioniert nicht. Compiler gibt immer einen Syntax-Error aus. Keine Ahnung wieso.
Procedure:
Aufruf:
Procedure:
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was(1).Kanone_sprite, SpriteNr1.l, SpriteNr2.l)
Protected i.l
For i = 1 To AnzWas
If Was(i)\treffer = 1
DisplayTransparentSprite(SpriteNr1, Was(i)\x, Was(i)\y)
Else
DisplayTransparentSprite(SpriteNr2, Was(i)\x, Was(i)\y)
EndIf
Next
EndProcedure
Aufruf:
Code: Alles auswählen
Sprite_setzen(AnzKanone, Kanone(), 15, 10)
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Du versuchst, ein Array zu übergeben. Das funktioniert allerdings nicht, Du kannst nur die Objekte einzeln übergeben, z.B. über einen Pointer.
Und dann der Aufruf z.B. so:
Ich bin mir jetzt grad nicht sicher ob Du vor das Was(i) im Aufruf evtl. noch ein @ schreiben mußt - und ich kann es leider grad nicht testen. Aber probier's einfach mal aus. Der Grund, warum Du Pointer verwenden mußt, ist der, daß Du eben eine komplexe Datenstruktur übergibst (vom Typ Kanone_sprite) und nicht nur eine einzelne Zahl oder sowas.
Übrigens @NicTheQuick: Ich würde vorerst nur mit Procedures arbeiten und nicht mit Macros. Seit Macros in PB da sind, hab ich das Gefühl, daß alle geil drauf sind, sie zu verwenden, aber solange man sie eh nur wie eine normale Procedure verwendet, bringt es meist kaum Vorteile. Meiner Meinung nach ist es besser, erstmal das Programmieren normal zu erlernen, und nicht mit Macros rumzutricksen - das kann man immer noch machen, wenn man genau weiß, wann und warum man sie einsetzen will.
Code: Alles auswählen
Procedure Sprite_setzen(*Was.Kanone_sprite, SpriteNr1, SpriteNr2)
If Was\treffer = 1
DisplayTransparentSprite(SpriteNr1, *Was\x, Was\y)
Else
DisplayTransparentSprite(SpriteNr2, *Was\x, Was\y)
EndIf
EndProcedure
Code: Alles auswählen
For i = 1 to AnzWas
Sprite_setzen(Was(i), 1, 2)
Next i
Übrigens @NicTheQuick: Ich würde vorerst nur mit Procedures arbeiten und nicht mit Macros. Seit Macros in PB da sind, hab ich das Gefühl, daß alle geil drauf sind, sie zu verwenden, aber solange man sie eh nur wie eine normale Procedure verwendet, bringt es meist kaum Vorteile. Meiner Meinung nach ist es besser, erstmal das Programmieren normal zu erlernen, und nicht mit Macros rumzutricksen - das kann man immer noch machen, wenn man genau weiß, wann und warum man sie einsetzen will.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
@ZeHa:
Natürlich kann man Arrays übergeben. Man kann sogar LinkedLists als Parameter
übergeben: Dokumentation zu Procedures
Da steht auch, dass Arrays und LinkedLists als Referenz und nicht als Wert übergeben
werden.
Und warum mit Makros rumtricksen? Makros sind sehr praktisch. Leider noch nicht so
dynamisch wie z.B. in C. Aber sie haben z.B. sehr zur Übersichlichkeit einiger meiner
Programme beigetragen, ohne dabei Geschwindigkeit zu verlieren.
Während bei Procedures alle Parameter zuerst einmal auf den Stack gepushed werden,
bevor sie genutzt werden, wird ein Makro schon während dem Kompilieren an Ort und Stelle
ersetzt.
Natürlich sollte man zuerst mal verstehen, wie sie funktionieren, wenn man sonst nur
Procedures gewohnt ist. Aber wenn man selbst von Procedures noch keine Ahnung hat,
kann man mit Makros niemanden verwirren.
Natürlich kann man Arrays übergeben. Man kann sogar LinkedLists als Parameter
übergeben: Dokumentation zu Procedures
Da steht auch, dass Arrays und LinkedLists als Referenz und nicht als Wert übergeben
werden.
Und warum mit Makros rumtricksen? Makros sind sehr praktisch. Leider noch nicht so
dynamisch wie z.B. in C. Aber sie haben z.B. sehr zur Übersichlichkeit einiger meiner
Programme beigetragen, ohne dabei Geschwindigkeit zu verlieren.
Während bei Procedures alle Parameter zuerst einmal auf den Stack gepushed werden,
bevor sie genutzt werden, wird ein Makro schon während dem Kompilieren an Ort und Stelle
ersetzt.
Natürlich sollte man zuerst mal verstehen, wie sie funktionieren, wenn man sonst nur
Procedures gewohnt ist. Aber wenn man selbst von Procedures noch keine Ahnung hat,
kann man mit Makros niemanden verwirren.
Ich sende euch mal die definitionen.
Da hab ich nun 3 mal eine FOR NEXT Schleife. Ich würde dies gerne in eine Procedur packen. Der Syntax Fehler kommt hier
[/code]
Code: Alles auswählen
AnzSpeicher = 5
AnzKanone = 5
kanonen = 5
AnzSchiffe = 7
mxg = 300
myg = 150
mxs = 350
mys = 550
pos = 0
Count1 = 1
Count2 = 1
a = 1
b = 1
Schuss1 = 0
Schuss2 = 0
FlipFlop = 0
AbzugKanone = 0
AbzugSchiffe = 0
AbzugSpeicher = 0
Structure Schiffe_sprite
x.l
y.l
treffer.l
EndStructure
Structure Kanone_sprite
x.l
y.l
treffer.l
EndStructure
Structure Speicher_sprite
x.l
y.l
treffer.l
EndStructure
Dim Schiff.Schiffe_sprite(AnzSchiffe)
Dim Kanone.Kanone_sprite(AnzKanone)
Dim Speicher.Speicher_sprite(AnzSpeicher)
; Kanone gesetzt
For i = 1 To AnzKanone
If Kanone(i)\treffer = 1
DisplayTransparentSprite(15, Kanone(i)\x, Kanone(i)\y)
Else
DisplayTransparentSprite(10, Kanone(i)\x, Kanone(i)\y)
EndIf
Next
;Schiff gesetzt
For i = 1 To AnzSchiffe
If Schiff(i)\treffer = 1
DisplayTransparentSprite(14, Schiff(i)\x, Schiff(i)\y)
Else
DisplayTransparentSprite(13, Schiff(i)\x, Schiff(i)\y)
EndIf
Next
;Speicher gesetzt
For i = 1 To AnzSpeicher
If Speicher(i)\treffer = 1
DisplayTransparentSprite(17, Speicher(i)\x, Speicher(i)\y)
Else
DisplayTransparentSprite(16, Speicher(i)\x, Speicher(i)\y)
EndIf
Next
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was(1).Kanone_sprite, SpriteNr1.l, SpriteNr2.l)
da muss auch
stehen, und nicht
Code: Alles auswählen
Was.Kanone_sprite(1)
stehen, und nicht
Code: Alles auswählen
Was(1).Kanone_sprite
Zuletzt geändert von edel am 28.11.2007 13:40, insgesamt 1-mal geändert.
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Ja, ich seh's grad.
So ist es richtig:
Die Klammer mit der 1 muss auch hinter die Struktur.
Aber mit einem beherzten Blick in die Dokumentation wäre dir das sicherlich auch
aufgefallen. Dazu ist sie da.
Allgemein sind Syntaxfehler eigentlich die Fehler, die man mit der Dokumentation leicht
beheben kann.
So ist es richtig:
Code: Alles auswählen
Procedure Sprite_setzen(AnzWas.l, Was.Kanone_sprite(1), SpriteNr1.l, SpriteNr2.l)
Aber mit einem beherzten Blick in die Dokumentation wäre dir das sicherlich auch
aufgefallen. Dazu ist sie da.
Allgemein sind Syntaxfehler eigentlich die Fehler, die man mit der Dokumentation leicht
beheben kann.
@ NicTheQuick:
Trotzdem kann es anfangs für einen Anfänger verwirrend sein, daß es Prozeduren UND Makros gibt. Und wenn man dann noch sagt, daß Makros "schneller" sind, ist es gut möglich, daß viele nur noch mit Makros arbeiten, was aber nicht unbedingt empfehlenswert ist. Und auch der Geschwindigkeitsvorteil ist in vielen Fällen gar nicht spürbar.
Zur Strukturierung eines Programms sind Prozeduren erstmal das Richtige. Später, wenn jemand mehr Wissen besitzt, kann man auch erklären, was es mit Makros auf sich hat, und in welchen Situationen man sie einsetzen kann/soll/darf, aber jemandem von Anfang an Makros beizubringen ist meiner Meinung nach so ähnlich, wie wenn man jemandem sofort beibringt, daß man bestimmte Multiplikationen durch Bitshifting ersetzen kann.
Trotzdem kann es anfangs für einen Anfänger verwirrend sein, daß es Prozeduren UND Makros gibt. Und wenn man dann noch sagt, daß Makros "schneller" sind, ist es gut möglich, daß viele nur noch mit Makros arbeiten, was aber nicht unbedingt empfehlenswert ist. Und auch der Geschwindigkeitsvorteil ist in vielen Fällen gar nicht spürbar.
Zur Strukturierung eines Programms sind Prozeduren erstmal das Richtige. Später, wenn jemand mehr Wissen besitzt, kann man auch erklären, was es mit Makros auf sich hat, und in welchen Situationen man sie einsetzen kann/soll/darf, aber jemandem von Anfang an Makros beizubringen ist meiner Meinung nach so ähnlich, wie wenn man jemandem sofort beibringt, daß man bestimmte Multiplikationen durch Bitshifting ersetzen kann.


ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.