Top-Themen

Aktuelle Themen (A bis Z)

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, 1029 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 ..
Ähnliche Inhalte
Windows Tools
Software um "3rd Party" Programme im Netzwerk zu (de)installieren
Frage von TeWutzWindows Tools2 Kommentare

Hallo, wir benötigen eine Software mit grafischer Oberfläche (am Liebsten in deutsch), mit der wir Software im Netzwerk verteilen ...

Festplatten, SSD, Raid
3rd Party SSD für HP DL380 Gen9
gelöst Frage von RicolahFestplatten, SSD, Raid9 Kommentare

Hallo, hat jemand Erfahrung damit, eine 3rd Party SSD in einem HP Gen9 laufen zu lassen? Da die HP ...

Webbrowser
Google Chrome blockt neuerdings 3rd party extensions - wie überstimmen?
gelöst Frage von DerWoWussteWebbrowser9 Kommentare

Hallo Kollegen! Ich rede von Kann man Chrome "überreden", diese geblockten wieder zu unblocken?

Batch & Shell
Ausgabe vom 3rd Party Tool durchsuchen und vergleichen per Powershell
gelöst Frage von NetzwerkDudeBatch & Shell3 Kommentare

Moin, der Lizenzserver von Autodesk lässt sich per Kommandozeile abfragen und liefert ergebnisse in folgender form: Das ist ein ...

Neue Wissensbeiträge
Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 7 StundenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 7 StundenSicherheit7 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 8 StundenSicherheit6 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Sicherheit

Meltdown und Spectre: Die machen uns alle was vor

Information von Frank vor 8 StundenSicherheit12 Kommentare

Aktuell sieht es in den Medien so aus, als hätten die Hersteller wie Intel, Microsoft und Co den aktuellen ...

Heiß diskutierte Inhalte
Windows 10
Netbook erkennt Soundkarte nicht - keinerlei Info zum Hersteller und Modell vom Netbook und Hardware bekannt
Frage von 92943Windows 1031 Kommentare

Guten Tag, meine Schwester reist in einigen Wochen für ein paar Monate ins Ausland und hat sich dafür ein ...

Batch & Shell
Anmeldevorgang für Informatikraum (Schule) unter Windows
gelöst Frage von IngenieursBatch & Shell29 Kommentare

Hey zusammen, ich werde in naher Zukunft den Informatik Raum meiner jetzigen Schule von dem aktuellen Betreiber übernehmen (Vertrag ...

Netzwerkgrundlagen
Welches Modem für VDSL 50000 der T-Com
Frage von Windows10GegnerNetzwerkgrundlagen20 Kommentare

Hallo, ein Kollege von mir will sich VDSL50000 von der T-Com holen, um daran einen Server zu betreiben. Ich ...

Batch & Shell
AD-Abfrage in Batchdatei und Ergebnis als Variable verarbeiten
gelöst Frage von Winfried-HHBatch & Shell19 Kommentare

Hallo in die Runde! Ich habe eine Ergänzungsfrage zu einem alten Thread von mir. Ausgangslage ist die Batchdatei, die ...