Pointer auf Arrays als Prozedur-Rückgabewert
Verfasst: 26.06.2014 22:50
Hallo,
ich habe eine Prozedur Lff geschrieben, die die Erstellung von Fenstern mit Listenfeldern (ListView) automatisieren soll. Genauer: Die Prozedur erstellt ein Fenster mit einem Listenfeld , befüllt es und plaziert Bildschaltflächen darunter, was dann in etwa so aussieht: https://www.dropbox.com/s/c31ozj4nt4pg9 ... nhalte.jpg
Die Nummern für Fenster, Listenfeld und Bildschaltflächen werden in der Prozedur mit #PB_Any generiert und in einem Array (zur späteren Verwendung in der Repeat-Ereignisschleife) abgelegt.
Nun kann eine Prozedur bedauerlicherweise keine Arrays zurückliefern. Ich konnte mich aber noch dunkel an eine Bemerkung in Gary Willoughbys Buch erinnern, daß man diese Einschränkung umgehen kann: *K ist ein Zeiger auf ein Array mit insgesamt 10 Elementen. Es ist problemlos möglich, die Werte der Element explizit Variablen zuzuordnen (so wie es Willoughby auf S. 278 beschreibt):
usw., oder auch einem Array des Main-Quellkodes:Der Offset ist ein Vielfaches von 8 (und nicht wie bei Willoughby von 4), weil ich auf einem 64-Bit-System programmiere. Sowohl die Zuweisung an die Variablen als auch an das Array funktioniert problemlos. Die Verfolgung im Beobachtungsfenster des Debuggers zeigt, daß die von #PB_Any in der Prozedur generierten 8stelligen Nummern dieselben sind, wie die von PeekI den Variablen/Array-Elementen zugewiesenen.
Und nun ein Effekt, den ich mir nicht erklären kann. Wenn ich diese umständliche explizite Wertezuweisung durch eine For-Next-Schleife automatisieren will (zumal ja auch die Gefahr besteht, sich bei längeren Arrays beim Offset zu verrechnen):so funktioniert das nicht mehr, die von PeekI in der For-Next-Schleife zugewiesen Werte stimmen nicht mehr mit denen in der Prozedur Lff überein.
Hat von Euch jemand eine Idee, woran das liegt?
Vielen Dank
ich habe eine Prozedur Lff geschrieben, die die Erstellung von Fenstern mit Listenfeldern (ListView) automatisieren soll. Genauer: Die Prozedur erstellt ein Fenster mit einem Listenfeld , befüllt es und plaziert Bildschaltflächen darunter, was dann in etwa so aussieht: https://www.dropbox.com/s/c31ozj4nt4pg9 ... nhalte.jpg
Die Nummern für Fenster, Listenfeld und Bildschaltflächen werden in der Prozedur mit #PB_Any generiert und in einem Array (zur späteren Verwendung in der Repeat-Ereignisschleife) abgelegt.
Nun kann eine Prozedur bedauerlicherweise keine Arrays zurückliefern. Ich konnte mich aber noch dunkel an eine Bemerkung in Gary Willoughbys Buch erinnern, daß man diese Einschränkung umgehen kann:
(S. 92 unten). Meine Prozedur gibt also kein Array, sondern den Zeiger auf das Array mit den Nummern zurück: ProcedureReturn @K(). Der Aufruf der Prozedur sieht dann so aus:It is however possible to get around these limitations, by returning a pointer.
Code: Alles auswählen
Define *K=Lff("Lerninhalte", 375, "Helios", 10, 20, I(), BuHt(), 1)Code: Alles auswählen
Define Fe_H=PeekI(*K), Zs_Lf=PeekI(*K+8), Lf_Li=PeekI(*K+16)Code: Alles auswählen
Dim K(9)
K(0)=PeekI(*K)
K(1)=PeekI(*K+8)
K(2)=PeekI(*K+16)
K(3)=PeekI(*K+24)
K(4)=PeekI(*K+32)
K(5)=PeekI(*K+40)
K(6)=PeekI(*K+48)
K(7)=PeekI(*K+56)
K(8)=PeekI(*K+64)
K(9)=PeekI(*K+72)Und nun ein Effekt, den ich mir nicht erklären kann. Wenn ich diese umständliche explizite Wertezuweisung durch eine For-Next-Schleife automatisieren will (zumal ja auch die Gefahr besteht, sich bei längeren Arrays beim Offset zu verrechnen):
Code: Alles auswählen
Dim K(9)
For Ix=0 To ArraySize(K())
K(Ix)=PeekI(*K+Ix*8)
NextHat von Euch jemand eine Idee, woran das liegt?
Vielen Dank