realbasic-nug.de
[Top] [All Lists]

Shared-Lib Funktionen mit va_args

To: NUG Realbasic German <realbasic-nug dot de at lists dot realsoftware dot com>
Subject: Shared-Lib Funktionen mit va_args
From: Oliver Geisen <oliver dot geisen at kreisbote dot de>
Date: Mon, 7 Aug 2006 08:32:43 +0200
Delivered-to: listarchive at realsoftware dot com
Delivered-to: realbasic-nug dot de at lists dot realsoftware dot com
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




<Prev in Thread] Current Thread [Next in Thread>