Rückgabe eines Array aus einer Prozedur

Anfängerfragen zum Programmieren mit PureBasic.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Rückgabe eines Array aus einer Prozedur

Beitrag von Rozek »

Hallo!

Und gleich die nächste Anfängerfrage: wie gebe ich ein in einer Prozedure angelegtes Array an das aufrufende Programm zurück - und zwar dergestalt, daß die Feldgrenzenüberwachung noch funktioniert!

Meine Recherchen ergaben ungefähr folgenden Code (bitte jetzt nicht am "static" aufhängen, ich weiß, daß ich so stets dasselbe Array erhalte):

Code: Alles auswählen

structure ByteArray
  Item.l[0]
endstructure

procedure.l getArray()
  static Result.l
  dim Result(5)
  
  static Descriptor.ByteArray
  Descriptor\Item = Result 
  procedurereturn @Descriptor
endprocedure

define *hugo.ByteArray = getArray()

define i.l
for i = 0 to 9
  *hugo\Item[i] = i
next
Der Compiler macht's - und das Programm läuft...was es eigentlich nicht sollte, da ich über die Grenzen des Array hinausschreibe!

Gibt's da einen besseren Weg?
Mit freundlichen Grüßen,

Andreas Rozek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

Rückgabewerte von Proceduren in PB sind immer maximal ein einzelnes Register.

auch strings werden grundsätzlich als pointer gehandhabt, nämlich als pointer auf den stringpool.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Array Groesse kannst du so ermitteln :

Code: Alles auswählen

Macro ArraySize(array)
  PeekL(array-8)
EndMacro
In deinem Fall benutzt du aber gar kein Array, result() und result sind 2 verschiedene Variablen.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag von Rozek »

Hoppla!

Danke für die beiden Tips - wodurch die ganze Sache ja noch schlimmer wird:

Code: Alles auswählen

procedure.l getArray()
  static dim Result(5)
  
  static Descriptor.ByteArray
  Descriptor\Item = @Result(0)
  procedurereturn @Descriptor
endprocedure
Mit freundlichen Grüßen,

Andreas Rozek
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

wozu muss man eigentlich eine procedure schreiben um ein Array zu erzeugen?

mag ja sein dass der coding-stil in anderen programmiersprachen zum guten ton gehört,
aber in PB finde ich es einfach zu aufwendig um nützlich zu sein....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag von Rozek »

Nun,

der genannte Code ist einfach nur die Quintessenz eines größeren Problems, in dessen Verlauf ein Feld (von vorher) unbekannter Größe erstellt und an das aufrufende Programm zurückgegeben wird.

Natürlich werde ich keine Prozedur schreiben, wenn dasselbe sogar in weniger Zeilen direkt notiert werden kann.
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Rozek hat geschrieben:Hoppla!

Danke für die beiden Tips - wodurch die ganze Sache ja noch schlimmer wird:

Code: Alles auswählen

procedure.l getArray()
  static dim Result(5)
  
  static Descriptor.ByteArray
  Descriptor\Item = @Result(0)
  procedurereturn @Descriptor
endprocedure
Was wird da jetzt "schlimmer" ?
Antworten