Seite 1 von 1

DJ's Fragen.

Verfasst: 22.03.2012 09:24
von D.J.Peters
Array (member einer structure) an procedure übergeben ?

Ich kann "normale" Arrays an Proceduren übergeben.
Verstehe aber leider nicht die Syntax wenn das Array "[]" ein Member einer Structure ist.

Ale drei Versuche die mir als erstes logisch erscheinen sind leider falsch.
Ich möchte nicht die Structure selbst (als Pointer) übergeben sondern nur das Array der Structure.

Danke für den richtigen Tip.

DJ

Code: Alles auswählen

Structure TEST
  a.f[2]
EndStructure

Procedure Test_Array(Array a.f(1))
  a(0)=1
  a(1)=2
  a(1)=3
EndProcedure

t.TEST
; Alles falsch !
Test_Array(t\a)
Test_Array(t\a[])
Test_Array(t\a())

Re: Array (member einer structure) an procedure übergeben ?

Verfasst: 22.03.2012 11:03
von Bisonte
ähem... in deiner Struktur ist kein Array.

In einer Struktur wird deinem Fall das Array so angegeben.

Code: Alles auswählen

Structure test_struct
  Array a.f(1)
EndStructure
Dann hast du ein Array. Das mit den eckigen Klammer ist was anderes (mir fällt der Name grad nicht ein... ja das Alter ;) )

dann sähe das ganze so aus

Code: Alles auswählen

Structure test_struct
  Array a.f(1)
EndStructure

Procedure Test_Array(Array a.f(1))
  a(0)=1
  a(1)=2
  a(1)=3
EndProcedure

Define t.test_struct

Dim t\a(1) ; <- array dimensionieren

Test_Array(t\a())

Debug t\a(1)

Re: Array (member einer structure) an procedure übergeben ?

Verfasst: 22.03.2012 14:47
von D.J.Peters
Soll wohl heißen:
Eine Deklaration mit "()" ist nur ein Zeiger auf dynamisches Array welches daher noch dimensioniert werden muss.
Eine Deklaration mit "[]" ist ein reservierter Speicherbereich innerhalb der Strukture
welche "nur" als Zeiger an eine Procedure übergeben werden kann.

Das macht Sinn Danke.

DJ

Re: DJ's Fragen.

Verfasst: 22.03.2012 14:53
von D.J.Peters
Noch etwas.
Wie kann man einen literalen Stringvergleich als bedingte "numerische" Kompelierung auswerten.

Danke

DJ

Code: Alles auswählen

#EXT = "png"

CompilerIf (#EXT = "png")
  UsePNGImageDecoder()
CompilerElse
  UseJPGImageDecoder()
CompilerEndIf

Re: DJ's Fragen.

Verfasst: 22.03.2012 15:46
von ts-soft
Das geht nicht, ist IMHO auch nicht nötig:

Code: Alles auswählen

Enumeration ; Bildformate
  #img_PNG
  #img_BMP
  #img_JPG
EndEnumeration

#EXT = #img_PNG

CompilerIf #EXT = #img_PNG
  UsePNGImageDecoder()
CompilerElse
  UseJPGImageDecoder()
CompilerEndIf

Re: DJ's Fragen.

Verfasst: 22.03.2012 16:12
von D.J.Peters
ts-soft hat geschrieben:Das geht nicht, ist IMHO auch nicht nötig:
Ob nötig oder nicht das sei mal dahin gestellt.
#EXT = "png" wird für die Bildung von Verzeichnis- und Dateinamen benutzt.

File = #EXT + "/" + Name + "." + #EXT

Das erlaubt mir zwischen verschiedenen Formaten und vor allem Verzeichnissen zu wecheln.

#EXT = "png"
;#EXT = "jpg"

Bei der bedingten Kompelierung geht es ja letzendlich um numerische Ausdrücke
und ein literaler Stringvergleich müste ja #True oder #False ergeben.

Geht halt nicht mit PB Boardmitteln und man muss halt noch extra eine weitere numerische Konstante definieren.

Aber auch nicht so tragisch und nochmals Danke.

DJ

Re: DJ's Fragen.

Verfasst: 14.04.2012 16:43
von Josef Sniatecki
Ich persönlich würde den fehlschlagenden Vergleich von literalen Strings innerhalb der Compilerzeit als Makel ansehen (komischer Satz), ist aber in der Tat nicht so tragisch.

Du kannst beispielsweise weiterhin die Methode von TS-soft verwenden und daraus die Extension bestimmen, ebenfalls innerhalb der Compilerzeit:

Code: Alles auswählen

Enumeration ;Bildformate
  #img_PNG
  #img_BMP
  #img_JPG
EndEnumeration

#imgFormat = #img_PNG

CompilerSelect #imgFormat
  CompilerCase #img_PNG
    #EXT = "png"
  CompilerCase #img_BMP
    #EXT = "bmp"
  CompilerCase #img_JPG
    #EXT = "jpg"
CompilerEndSelect
Numerische Konstanten und textbasierte Konstanten macht es gleich noch praktischer, falls du z.B. bevorzugst, die Namen der Formate der Lesbarkeit halber auszuschreiben, aber die daraus resultierenden Extensionen dennoch beizubehalten. Somit vergleichst du dann nur noch die Wahl deines Formates, nicht die Datei-Erweiterungen.

Gruß Josef