Code übersichtlicher und einfacher machen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
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

Beitrag von NicTheQuick »

Du musst nicht mein ganzes Post zitieren, wenn es direkt vor deinem steht.

Ersetz einfach 'StrukturvonWas' durch 'Kanone_Sprite'. Dann sollte es
funktionieren. Was war daran schwer zu verstehen?
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Das funktioniert nicht. Compiler gibt immer einen Syntax-Error aus. Keine Ahnung wieso.

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)
Benutzeravatar
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

Beitrag von NicTheQuick »

Da ich den ganzen Code nicht habe, kann ich das gerade nicht
nachvollziehen. Und ich welcher Zeile der Debugger meckert, hast du auch
nicht gesagt.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Du versuchst, ein Array zu übergeben. Das funktioniert allerdings nicht, Du kannst nur die Objekte einzeln übergeben, z.B. über einen Pointer.

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
Und dann der Aufruf z.B. so:

Code: Alles auswählen

For i = 1 to AnzWas
    Sprite_setzen(Was(i), 1, 2)
Next i
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.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
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

Beitrag von NicTheQuick »

@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.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Ich sende euch mal die definitionen.

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   

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: Alles auswählen

Procedure Sprite_setzen(AnzWas.l, Was(1).Kanone_sprite, SpriteNr1.l, SpriteNr2.l)
[/code]
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

da muss auch

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.
Benutzeravatar
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

Beitrag von NicTheQuick »

Ja, ich seh's grad.

So ist es richtig:

Code: Alles auswählen

Procedure Sprite_setzen(AnzWas.l, Was.Kanone_sprite(1), SpriteNr1.l, SpriteNr2.l)
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.
obar
Beiträge: 111
Registriert: 22.11.2007 19:47

Beitrag von obar »

Ok, jetzt läufts. Sorry

Aber sehe ich das richtig, dass ich die 3 Schlaufen gar nicht vernünftig in eine Procedure packen kann?
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

@ 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.
Bild     Bild

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