Seite 2 von 3

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 23.12.2012 15:06
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

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 25.12.2012 07:58
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.

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 25.12.2012 11:20
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?

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 25.12.2012 14:20
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

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 26.12.2012 11:22
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.

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 26.12.2012 11:39
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:

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 26.12.2012 11:59
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.

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 30.12.2012 09:12
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

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 10.01.2013 18:03
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

Re: Beispiele zu neuen Funktionen PB5.10

Verfasst: 29.01.2013 03:49
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)