Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Allgmeiner FunctionWrapper für 3rd Party Funktionan

Frage Entwicklung C und C++

Mitglied: 14116

14116 (Level 1)

16.01.2015, aktualisiert 28.01.2015, 978 Aufrufe, 4 Kommentare

Hallo,

wir bekommen hier von einer externen Firma, .c und .h Files zur Verwendung. Diese Dateien werden regelmäßig von dieser Firma gewartet.
Meine Aufgabe ist es momentan, einen Funktionswrapper zu schreiben, welcher diese 3rd Funktionen ansprechen kann.

Unten ein Beispiel wie das Ganze auszusehen hat.

Ich hoffe das Ganze ist selbsterklärend genug.


Frage wie kann ich die va_list vor der Übergabe an die 3rdParty Funktionen so abändern, dass der Funktionspointer NICHT mitübergeben wird?


LG
Günter


---
01.
 
02.
#include <stdio.h> 
03.
#include <stdarg.h> 
04.
 
05.
 
06.
 
07.
// --- Start Example of 3rd Party Functions ---- 
08.
// ---    unmodifyable ------------------------- 
09.
 
10.
 
11.
void f1(void) 
12.
13.
   printf("f1\n"); 
14.
15.
 
16.
void f2(int param1, int param2) 
17.
18.
   printf("f2: %d, %d\n", param1, param2); 
19.
20.
 
21.
void f3(char *text, int param1) 
22.
23.
   printf("f2: %s, %d\n", text, param1); 
24.
25.
 
26.
 
27.
// --- End of 3rd Party Functions -------------- 
28.
 
29.
 
30.
 
31.
 
32.
// 
33.
// 3rd Party Function Wrapper 
34.
// 
35.
void functionwrapper( void(*func)(), ...) 
36.
37.
   va_list argptr; 
38.
 
39.
   (*func)(argptr); 
40.
41.
 
42.
 
43.
 
44.
// 
45.
// Main 
46.
// 
47.
int main(void) 
48.
49.
  functionwrapper(f1);  		// work 
50.
  functionwrapper(f2, 1, 2);  		// did not work 
51.
  functionwrapper(f3, "Text1", 2);	// did not work 
52.
 
53.
  return 0; 
54.
55.
 
Mitglied: rubberman
16.01.2015 um 18:23 Uhr
Hallo Günter,

so wie du dir das vorstellst, funktioniert das gar nicht.
  • Deine 3rd Party Funktionen akzeptieren keinen Parameter vom Typ va_list.
  • Woran sollte dein Programm denn erkennen, welche Funktion aufgerufen werden soll?

C++ (nicht C) würde die Möglichkeit bieten, deine Wrapperfunktion zu überladen. In dem Fall könntest du anhand Anzahl, Typ und Reihenfolge der Parameter unterschiedliche 3rd Party Funktionen aufrufen.

Mir leuchtet dein Konzept allerdings gar nicht ein. So wie du schreibst, werden Header-Dateien mitgeliefert. In denen sollten sich die Prototypendeklarationen der Funktionen finden. Wenn du also die Headerdateien inkludierst, kannst du auch direkt auf die Funktionen zugreifen. Wozu der Wrapper?

Grüße
rubberman
Bitte warten ..
Mitglied: rubberman
19.01.2015 um 17:57 Uhr
Ich hab noch mal etwas überlegt, wie das bei dir in der Realität aussehen könnte.
wir bekommen hier von einer externen Firma, .c und .h Files zur Verwendung. Diese Dateien werden regelmäßig von dieser Firma gewartet.
Könnte das bedeuten, dass die Dateien und Funktionen irgendwie namentlich versioniert sind?
Meine Aufgabe ist es momentan, einen Funktionswrapper zu schreiben, welcher diese 3rd Funktionen ansprechen kann.
Hmm. Am Ende ist das doch dann nichts anderes, als funktionA() in deinem eigenen Quellcode stehen zu haben, dafür aber funktionX() in den 3rd Party Dateien aufzurufen. Ggf. auch functionX_v1() für Version 1, falls diese irgendwie versioniert ist.

Falls das so oder ähnlich ist, dann würde ich das Ganze vom Präprozessor abfackeln lassen. Dieser führt vor dem Kompilieren eine Art von virtueller Textersetzung durch.
Vorteil: Dein Wrapper erzeugt keinen Programmcode, der mit kompiliert wird und letztlich die Performance beeinträchtigt.

Schau dir mal mein Beispiel an. Vielleicht kannst du eine Lösung für dich ableiten. Anderenfalls erkläre noch mal, wie das bei dir aussieht und bring mal ein möglichst realitätsnahes Beispiel von Soll und Ist ...

Grüße
rubberman

thirdparty_v1.c
01.
#include <stdio.h> 
02.
 
03.
void functionX_v1(const char *const szTxt) 
04.
05.
  printf(szTxt); 
06.
07.
 
08.
int functionY_v1(void) 
09.
10.
  return 42; 
11.
12.
 

thirdparty_v1.h
01.
#ifndef THIRDPARTY_H 
02.
#define THIRDPARTY_H 
03.
 
04.
#ifdef __cplusplus 
05.
extern "C" { 
06.
#endif // __cplusplus 
07.
 
08.
// Prototypen der versionierten 3rd Party Funktionen. 
09.
void functionX_v1(const char *const szTxt); 
10.
int  functionY_v1(void); 
11.
 
12.
#ifdef __cplusplus 
13.
14.
#endif // __cplusplus 
15.
 
16.
#endif // THIRDPARTY_H 
17.
 

wrapper.h
01.
#ifndef WRAPPER_H 
02.
#define WRAPPER_H 
03.
 
04.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
05.
/** Die entsprechende Version als Appendix muss einmalig neu definiert werden. (anpassen) */ 
06.
#define VERSION v1 
07.
 
08.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
09.
/** Macros für die Funktionalität des Headerwrappers. */ 
10.
// 3.) In ein Stringliteral überführen. 
11.
#define HEADER_STR(hname) #hname 
12.
// 2.) Verkettung des Headernamens. (ggf. anpassen) 
13.
#define HEADER_CONCAT(ver) HEADER_STR(thirdparty_##ver.h) 
14.
// 1.) Auflösung des VERSION Macros. 
15.
#define HEADER(ver) HEADER_CONCAT(ver) 
16.
 
17.
/** Einbindung des versionierten Headers */ 
18.
#include HEADER(VERSION) 
19.
 
20.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
21.
/** Macros für die Funktionalität des Funktionswrappers. */ 
22.
// 3.) Verkettung des Funktionsnames mit dem Unterstrich und der Version. (ggf. anpassen) 
23.
#define FUNC_CONCAT(func, ver) func##_##ver 
24.
// 2.) Auflösung des VERSION Macros. 
25.
#define FUNC_EVAL(func, ver) FUNC_CONCAT(func, ver) 
26.
// 1.) Übergabe des VERSION Macros. 
27.
#define FUNC(func) FUNC_EVAL(func, VERSION) 
28.
 
29.
/** Macros für jede einzelne nicht-versionierte Funktion müssen definiert werden. (anpassen) */ 
30.
#define functionA FUNC(functionX) 
31.
#define functionB FUNC(functionY) 
32.
 
33.
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ 
34.
#endif // WRAPPER_H 
35.
 

main.c
01.
#include <stdio.h> 
02.
#include "wrapper.h" 
03.
 
04.
int main(void) 
05.
06.
  functionA("Die Antwort auf die Frage nach dem Leben,\ndem Universum und Allem ist "); 
07.
  printf("%d.\n", functionB()); 
08.
 
09.
  return 0; 
10.
11.
 
Bitte warten ..
Mitglied: 14116
20.01.2015 um 18:32 Uhr
Hallo,

Danke für Deine Mühe.


Um mehr Verständnis reinzubringen:

Die C-Funktionen werden und zur Verwendung für Matlab geliefert. Der MEX-Compiler macht daraus "irgendeinen grauslichen" Code (hoffe das Du Matlab kennst).

Um das Ganze einfacher für meine "Ings..." und "Dipl. Ings." zu machen ist die Idee aufgekommen, einen Wrapper zu entwickeln.

Das das Ganze nicht Typensicher ist, sich hier nicht wichtig, bzw. allen bewusst.

Matlab würde hier ein .m Datei für lediglich EINE einzige Funktion erzeugen und nicht für 100erte...


Das wäre für uns ein Vorteil.


BTW: Ich sehe mir Deine Idee morgen/übermorgen im Labor an.


LG
Günter
Bitte warten ..
Mitglied: rubberman
LÖSUNG 21.01.2015, aktualisiert 28.01.2015
Hallo Günter.

(hoffe das Du Matlab kennst)
Nee, leider nur vom Hörensagen.

Matlab würde hier ein .m Datei für lediglich EINE einzige Funktion erzeugen und nicht für 100erte...
Ups, bist du sicher?
Der Code für die jeweils aufgerufenen Funktionen befinden sich in deinen 3rd Party Dateien. Um darauf zugreifen zu können, musst du diese also einbinden und dem Compiler zugänglich machen. Da (zumindest bei C-Compilern) jede Quelldatei in separaten Übersetzungseinheiten kompiliert wird, die anschließend miteinander verlinkt werden, wird wohl auch deine 3rd Party Datei mit den hunderten Funktionen komplett kompiliert werden. Ich mache dir da wenig Hoffnung.

Ich weiß nicht was Matlab dir für Alternativmöglichkeiten bietet. Unter Windows (ich weiß nicht wie das auf anderen Betriebssystemen aussieht) gibt es da beispielsweise dynamisch gelinkte Bibliotheken (*.dll). Diese enthalten Funktionen die einmalig kompiliert wurden. Die unterschiedlichsten Programme können nun zur Laufzeit simultan auf diese vorkompilierten Funktionen zugreifen, ohne dass diese im eigenen Programmcode mit kompiliert werden mussten. Wenn etwas Ähnliches für Matlab existiert, wäre das wohl die einzig sinnvolle Alternative.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Festplatten, SSD, Raid
gelöst 3rd Party SSD für HP DL380 Gen9 (9)

Frage von Ricolah zum Thema Festplatten, SSD, Raid ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...