Xojo Developer Conference
25/27th April 2018 in Denver.
MBS Xojo Conference
6/7th September 2018 in Munich, Germany.

Shared-Lib Funktionen mit va args (Real Studio network user group Deutschland Mailinglist archive)

Back to the thread list
Previous thread: Wozu dienen die verschiedenen Frameworks ?
Next thread: RB Wiki


Probleme mit String Bearbeitung   -   Markus Schnell
  Shared-Lib Funktionen mit va args   -   Oliver Geisen
   Re: Shared-Lib Funktionen mit va args   -   Oliver Geisen

Shared-Lib Funktionen mit va args
Date: 07.08.06 07:32 (Mon, 7 Aug 2006 08:32:43 +0200)
From: Oliver Geisen
Hallo,

wie kann man in RB eine Funktion mit Declare definieren, wie eine
variable Argumentenliste (so wie z.B. printf) enthält ?

Mein konkretes Problem ist die sehr schöne Funktion
AEBuildAppleEvent, mit der man über eine Stringdefinition AppleEvents
zusammenbauen kann. Dies ist sehr viel angenehmer als der sonst
übliche Weg über Descriptorlisten usw. Die Funktion hat folgenden
Aufruf:

OSStatus AEBuildAppleEvent (
AEEventClass theClass,
AEEventID theID,
DescType addressType,
const void * addressData,
long addressLength,
short returnID,
long transactionID,
AppleEvent * result,
AEBuildError * error,
const char * paramsFmt,
...
);

Diese Funktion ist verfügbar in der Carbon Lib (ab Version 1.1) und
definiert in der Headerdatei "AEHelpers.h". Mein Problem ist das "..."

Eigene Überlegungen (als "Anregung" wenn die Antwort nicht bekannt
ist .-)
---------------------------
Wie werden va_args in C implementiert? (Carbon ist ja eine C-Library)
Mit der Antwort könnte man überlegen wie man das in REALbasic mit
MemoryBlocks hinbekommt.

Überlegung: "Wie werden überhaupt Parameter an eine Funktion
übergeben ?"
Parameter an eine Funktion können sowohl Zeiger auf Werte (komplexe
Datentypen) als auch Werte selbst sein (atomare Datentypen).
Die Funktion mit va_args weiss also nicht was kommen wird, geschweige
denn wie die Daten vorliegen. Es kann diese Information nur aus dem
Formatstring (paramsFmt) ermitteln.

Überlegung: "Liegen die variablen Argumente einfach hintereinander
und wird nur der Zeiger auf den Start dieser Argumentenliste
übergeben ?"
Die Funktion könnte dann ab einer angegebenen Stelle einfach den
jeweils durch den Formatstring erwarteten Datentyp lesen. Die Länge
müsste sich aus dem Datentyp ergeben (z.B. ein Long ist 4 Bytes, ein
Char 1 Byte, usw.).

Überlegung: "Oder handelt es sich bei einem va_arg um einen Zeiger
auf ein Array mit Zeigern auf Werte ?"
Hierbei könnte die Funktion jeweils per Index auf die Zeiger
zugreifen und die entsprechenden Daten lesen.


Mit freundlichen Grüssen,

Oliver Geisen
_____________________________
Systemadministrator
Kreisboten Verlag Mühlfellner KG
82362 Weilheim i. Ob.
Tel. 0881/686-904
Fax 0881/686-74

Re: Shared-Lib Funktionen mit va args
Date: 12.08.06 14:47 (Sat, 12 Aug 2006 15:47:22 +0200)
From: Oliver Geisen
Hallo,

>> wie kann man in RB eine Funktion mit Declare definieren, wie eine
>> variable Argumentenliste (so wie z.B. printf) enthält ?
>
> Soweit ich weiß legt der Compiler beim Aufruf die Anzahl der Argumente
> auf den Stack und dahinter die Argumente.
Meinst Du mit "Stack" dabei den speicherbereich, den ich mittels Ptr
an die Funktion übergeben ?
offset type what
00 long NumberOfArgs
04 any Arg1
xx any Arg2

Hmmm, das wird aber doch schwierig, denn woher soll er wissen was für
Datentypen ihn da erwarten und die richtige Länge ermitteln?
Ich hätte eher gedacht es sind Zeiger, die haben immer die gleiche
Länge, also dann evtl. so:
offset type what
00 long NumberOfArgs
04 long * Arg1
08 long * Arg2

Oder das es einfach so ausschaut:
offset type what
00 long *Arg1
04 long *Arg2
...
xx long *NULL

Also einfach mit einem NULL-Zeiger endet....

Mit freundlichen Grüssen,

Oliver Geisen
_____________________________
Systemadministrator
Kreisboten Verlag Mühlfellner KG
82362 Weilheim i. Ob.
Tel. 0881/686-904
Fax 0881/686-74