Beispiele zu neuen Funktionen PB5.10

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von Franky »

Ein Beispiel zum Punkt
- Added: autocast of numeric values when string are involved, allowing to concatenate string and numeric in constants

Code: Alles auswählen

#Text1=" The value is : "
#Text2_1=" is 2 times "
#Text3= " is half of "

Global a.l
Global b.f

For a=0 To 5
  b=a/2
  
  ;1.)Doesn't work
  ;MessageRequester("Info",#Text1+a+#Text2_1+ a/2)
  
  ;2.)Works
  ;MessageRequester("Info", #Text1+a+#Text2_1+ b)
  
  ;3.)Doesn't work
  ;MessageRequester("Info", b+#Text3 +a)
  
  ;Works
  ;MessageRequester("Info", ""+b+#Text3 +a)
Next
An sich ein schönes Feature, es scheint mir aber nicht ganz sauber durchdacht. In der momentanen Form birgt es IMHO einfach nur eine Menge Verwirrungspotenzial.

Gruß

Franky
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von ts-soft »

Hier noch die ersten Hinweise zu Align()

Das Keyword ist nur bei der Strukturedefinition hinter dem Structurenamen gültig und kann wie folgt angewendet
werden: ACCEL mit PB_Alignment.b[1] und mit Align()

Code: Alles auswählen

Structure ACCEL_1
  fVirt.b
  PB_Alignment.b[1]
  key.w
  cmd.w
EndStructure

Debug OffsetOf(ACCEL_1\key)

Structure ACCEL_2 Align 2
  fVirt.b
  key.w
  cmd.w
EndStructure

Debug OffsetOf(ACCEL_2\key)
Jetzt noch ein Beispiel, für eine x86 / x64 kompatible Strukture COPYDATASTRUCT:

Code: Alles auswählen

 ; PBVersion für x64
; Structure COPYDATASTRUCT
;   dwData.i
;   cbData.l
;   PB_Alignment.b[4]
;   *lpData
; EndStructure
; PBVersion für x86
; Structure COPYDATASTRUCT
;   dwData.i
;   cbData.l
;   *lpData
; EndStructure


CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  #MyAlign = 8
CompilerElse
  #MyAlign = 0
CompilerEndIf

Structure MyCOPYDATASTRUCT Align #MyAlign
  dwData.i
  cbData.l
  *lpData
EndStructure

Debug OffsetOf(MyCOPYDATASTRUCT\lpData)
Debug OffsetOf(COPYDATASTRUCT\lpData) 
Noch einfacher scheint es mit der Konstanten #PB_Structure_AlignC

Code: Alles auswählen

Structure MyCOPYDATASTRUCT Align #PB_Structure_AlignC
  dwData.i
  cbData.l
  *lpData
EndStructure

Debug OffsetOf(MyCOPYDATASTRUCT\lpData)
Debug OffsetOf(COPYDATASTRUCT\lpData) 
PS: Bei den letzen beiden Beispielen sollte unter x86 8 rauskommen und unter x64 16

// edit
Änderung: Align benötigt keine Klammern.
Konstante #PB_Structure_AlignC ist seit Beta 2 definiert.
Zuletzt geändert von ts-soft am 30.12.2012 09:08, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von NicTheQuick »

Kann mir jemand ein Beispiel zu folgenden Punkt machen?

Code: Alles auswählen

Added: TypeOf() for variable, structure and fields
Was bringt ein 'TypeOf()' für feste Typdeklarationen ohne die Möglichkeit von Templates oder Generischen Typen?
Benutzeravatar
CSHW89
Beiträge: 489
Registriert: 14.12.2008 12:22

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von CSHW89 »

Naja an einer Stelle könnte ich mir das schon vorstellen, SortStructured(List/Array):

Code: Alles auswählen

Structure struc
  a.w
  b.b
  c.l
EndStructure

Dim arr.struc(9)

For i = 0 To 9
  arr(i)\c = Random(10)
Next

; SortStructuredArray(arr(), #PB_Sort_Ascending, OffsetOf(struc\c), #PB_Long)
SortStructuredArray(arr(), #PB_Sort_Ascending, OffsetOf(struc\c), TypeOf(struc\c))

For i = 0 To 9
  Debug arr(i)\c
Next
Kann man natürlich streiten, ob das nun besser ist mit TypeOf. Aber OffsetOf gehört ja in die gleiche Kategorie: Dort könnte man genauso gut 3 schreiben. Wenn man die Structure dann ändert, könnte die 3 wieder falsch sein. Naja, dass man den Type ändert, passiert wohl nicht so häufig, aber mit TypeOf ists auf jeden Fall sicherer.

lg Kevin
Bild Bild Bild
http://www.jasik.de - Windows Hilfe Seite
padawan hat geschrieben:Ich liebe diese von hinten über die Brust ins Auge Lösungen
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von Pelagio »

Bezüglich Autocast: Numerischer Werte wird ohne Konvertierungsbefehl übernommen

Code: Alles auswählen

Define.i a = 2, b = 5
Text.s = #NULL$ + a + " mal " + b
Debug Text 
bin ich anderer Ansicht als Franky
Franky hat geschrieben:An sich ein schönes Feature, es scheint mir aber nicht ganz sauber durchdacht. In der momentanen Form birgt es IMHO einfach nur eine Menge Verwirrungspotenzial.
Ich erkenne eine klare Logik im ganzen.
Man darf nur Variablen miteinander verbinden und zwar so, das am Beginn grundsätzlich eine Stringvariable ("Inhalt" in Anführungszeichen ist erlaubt) steht. Ich finde das es eine Erleichterung ist und werde es sicherlich GUT nutzen.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von ts-soft »

Ist aber noch verbugt:

Code: Alles auswählen

Define.i a = 2, b = 5
Text.s = #NULL$ + a + " mal " + 5
Debug Text 
Text.s = #NULL$ + 2 + " mal " + 5
Debug Text
Würde ich also noch mit warten :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Pelagio
Beiträge: 424
Registriert: 11.11.2004 17:52
Computerausstattung: AMD Ryzen 5 7600 6-Core Prozessor 3.80 GHz
16,0 GB Arbeitsspeicher
Windows 11 Pro Betriebssystem
Wohnort: Bremen

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von Pelagio »

Frohe Weihnacht ts-soft,

ich habe damit keine Probleme.
Wenn ich eine feste Zahl mit vorgebe, kann ich diese auch in Ausführungszeichen setzen. Was für mich in dieser Situation wichtiger ist, ist die Tatsache das ich eine numerische Variable, die sich ja im laufe des Programms ändern kann ohne zusätzliche Konvertierung mit einfügen kann. Wobei Du natürlich in dem Punkt recht hast, wenn die letzte Fixzahl angenommen wird, sollten auch alle anderen Fixzahlen angenommen werden.
Ohne Zeit kein Fleiß
Auf neustem Stand zu sein ist eine Kunst die nicht jeder perfektioniert [Win11Pro; PB6.20 LTS]. :allright:
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von Josh »

STARGÅTE hat geschrieben:Mit dem neuen Schlüsselwort UndefineMacro, sollte man nun Macros in einem Include am Ende auch immer wieder freigeben, sodass es nicht zu kollisionen kommt
Allerdings muss man aufpassen, wo man seine Icludes setzt:

Test.pb

Code: Alles auswählen

Macro Unique
  "pb"
EndMacro

XIncludeFile "Test.pbi"

Debug Unique

UndefineMacro Unique
Test.pbi

Code: Alles auswählen

Macro Unique
  "pbi"
EndMacro

Debug Unique

UndefineMacro Unique
RehW
Beiträge: 15
Registriert: 03.03.2012 11:23

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von RehW »

Ich habe mich gerade mit den Packerplugin beschäftigt und hier mein Beispiel zum entpacken der Dateien auf Festplatte. Der erste Abschnitt stammt von ts-soft. Von mir ist nur der Teil unter Datei entpacken und speichern. Der Code soll nur ein Beispiel sein, also keine Fehlerprüfung ob die Datei oder das Verzeichnis vorhanden ist.

Code: Alles auswählen

UseZipPacker(); Packerplugin bestimmen

;Datei packen
CreatePack(0, GetTemporaryDirectory() + "myzip.zip") ; Archiv erstellen
AddPackFile(0, #PB_Compiler_Home + "SDK\CompilerInterface.txt", "SubDir1\SubDir2\CompilerInterface.txt") ; Datei hinzufügen
ClosePack(0) ; Archiv schliessen.

;Datei entpacken und speichern

;ZIP-Datei öffnen
OpenPack(0, GetTemporaryDirectory() + "myzip.zip")

If ExaminePack(0)
  While NextPackEntry(0)
    DateiName = PackEntryName(0) ;         <- Name der Datei mit Pfad!
    ;DateiLaenge = PackEntrySize(0, 1)  ;  <- gibt die Grösse der gpackten Datei zurück
    DateiLaenge = PackEntrySize(0) ;       <- Grösse der entpackten Datei
    DateiTyp = PackEntryType(0) ;          <- Ergebnis 0 wenn es eine Datei ist und 1 bei einem Verzeichnis

    If DateiType = 1 ;                     <- Verzeichnis erstellen
      CreateDirectory(DateiName) ;         <- vorher Testen, bzw. Unterverzeichnisse erstellen (SubDir1\SubDir2\)
    ElseIf DateiType = 0 ;                 <- Datei speichern, DateiNameEntpackt ist der Dateiname entpackt auf HD
      UncompressPackFile(0, DateiNameEntpackt, DateiName)
    EndIf
  Wend
EndIf

ClosePack(0); Archiv schliessen
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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

Re: Beispiele zu neuen Funktionen PB5.10

Beitrag von NicTheQuick »

Ich hätte da auch noch was für TypeOf():

Leider hab ich noch keine Möglichkeit gefunden wie man auf diese Weise noch Rückgabewerte hinzufügen könnte.

Code: Alles auswählen

EnableExplicit

Procedure TypEgal_Long(a.l)
	Debug "Das war ein Long: " + a
EndProcedure

Procedure TypEgal_Integer(a.l)
	Debug "Das war ein Integer: " + a
EndProcedure

Procedure TypEgal_Float(a.f)
	Debug "Das war ein Float: " + a
EndProcedure

Procedure TypEgal_Quad(a.q)
	Debug "Das war ein Quad: " + a
EndProcedure

Procedure TypEgal_String(a.s)
	Debug "Das war ein String: " + a
EndProcedure

Procedure TypEgal_Simple(a.i)
	Debug "Das war ein fester Wert, interpretiert als Integer: " + a
EndProcedure

Macro TypEgal(a)
	CompilerIf Defined(a, #PB_Variable)
		CompilerSelect TypeOf(a)
			CompilerCase #PB_Long
				TypEgal_Long(a)
			CompilerCase #PB_Integer
				TypEgal_Integer(a)
			CompilerCase #PB_Float
				TypEgal_Float(a)
			CompilerCase #PB_Quad
				TypEgal_Quad(a)
			CompilerCase #PB_String
				TypEgal_String(a)
		CompilerEndSelect
	CompilerElse
		TypEgal_Simple(a)
	CompilerEndIf
EndMacro

Define l.l, i.i, f.f, q.q, s.s
l = 1234
i = 5678
f = 0.1234
q = 12345678901234
s = "Test"

TypEgal(l)
TypEgal(i)
TypEgal(f)
TypEgal(q)
TypEgal(s)
TypEgal(123)
;TypEgal("asdf")   ;geht leider nicht bzw. ich wüsste noch nicht wie.
Und hier noch ein etwas praktischeres Beispiel mit angetäuschter Operatorüberladung mittels Makros. ;)
Wundert euch nicht über dieses 'EndMacro' nach jedem 'VectorOp()'. Irgendwie ging es nicht anders... :?

Code: Alles auswählen

EnableExplicit

Structure Vector
	x.f
	y.f
	z.f
EndStructure

Macro MacroRo
	ro
EndMacro

Macro VectorOp(op, opName)
	Procedure Vector#opName#Vector(*a.Vector, *b.Vector)
		*a\x op *b\x
		*a\y op *b\y
		*a\z op *b\z
	EndProcedure
	
	Procedure Vector#opName#Skalar(*a.Vector, b.f)
		*a\x op b
		*a\y op b
		*a\z op b
	EndProcedure
	Mac#MacroRo Vector#opName(a, b)
		CompilerIf Defined(a, #PB_Variable)	;Ist a eine Variable?
			CompilerIf Defined(b, #PB_Variable) ;Ist b eine Variable?
				CompilerIf TypeOf(b) = #PB_Structure
					CompilerIf TypeOf(a) = #PB_Structure
						Vector#opName#Vector(a, b)	;a und b sind vom Typ Vector
					CompilerElse
						Vector#opName#Skalar(b, a)	;b ist vom Typ Vector und a eine normale Variable
					CompilerEndIf
				CompilerElse
					CompilerIf TypeOf(a) = #PB_Structure
						Vector#opName#Skalar(a, b)	;a ist vom Typ Vector und b eine normale Variable
					CompilerElse
						CompilerError "VectorMul(Float, Float): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
					CompilerEndIf
				CompilerEndIf
			CompilerElse
				CompilerIf TypeOf(a) = #PB_Structure
					Vector#opName#Skalar(a, b)	;a ist vom Typ Vector und b ein fester Wert
				CompilerElse
					CompilerError "VectorMul(Float, Constant): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
				CompilerEndIf
			CompilerEndIf
		CompilerElse
			CompilerIf Defined(b, #PB_Variable) ;Ist b eine Variable?
				CompilerIf TypeOf(b) = #PB_Structure
					Vector#opName#Skalar(b, a)		;b ist vom Tyo Vector und a ein fester Wert
				CompilerElse
					CompilerError "VectorMul(Constant, Float): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
				CompilerEndIf
			CompilerElse ;a und b sind keine Variablen -> Fehler
				CompilerError "VectorMul(Constant, Constant): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
			CompilerEndIf
		CompilerEndIf
;	EndMac#MacroRo
EndMacro

VectorOp(*, Mul)
EndMacro
VectorOp(+, Add)
EndMacro
VectorOp(/, Div)
EndMacro
VectorOp(-, Sub)
EndMacro

; Ab hier gibt es jetzt folgende Procedures:
; - VectorMulVector(*a.Vector, *b.Vector)
; - VectorMulSkalar(*a.Vector, b.f)
; - VectorAddVector(*a.Vector, *b.Vector)
; - VectorAddSkalar(*a.Vector, b.f)
; - VectorDivVector(*a.Vector, *b.Vector)
; - VectorDivSkalar(*a.Vector, b.f)
; - VectorSubVector(*a.Vector, *b.Vector)
; - VectorSubSkalar(*a.Vector, b.f)
;
; Dank den folgenden vier weiteren Makros, braucht man sich um diese Procedures aber nicht mehr zu kümmern:
; - VectorMul(a, b)
; - VectorAdd(a, b)
; - VectorDiv(a, b)
; - VectorSub(a, b)

Define a.Vector, b.Vector, c.f
a\x = 1 : a\y = 2 : a\z = 3
b\x = 1 : b\y = 2 : b\z = 3
c = 4

Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
Debug "b = (" + b\x + ", " + b\y + ", " + b\z + ")"
Debug "c = " + c

VectorAdd(a, b)	;Vector + Vector
Debug "a + b"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"

VectorMul(c, a) ;Skalar * Vector
Debug "c * a"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"

VectorDiv(a, c) ;Vector / Skalar
Debug "a / c"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"

VectorSub(a, b) ;Vector - Vector
Debug "a - b"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"

VectorMul(a, 4) ;Vector * 4    ;Leider gehen hier wieder keine Fließkommazahlen, sehr wohl aber Ganzzahlen
Debug "a * 4"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"

;Hier noch ein paar Fehlermeldungen, auskommentieren zum Testen
;VectorAdd(3, 4)
;VectorAdd(c, c)
;VectorAdd(c, 2)
Antworten