Funktionsverwaltung bei C
minicrispie
- programmiertechnik
0 Multi0 hotti0 Struppi0 minicrispie0 Struppi
0 Christian Seiler
Hallo,
Ich hab jetzt über mehrere wochen ein Programm geschrieben(, welches auch super funktioniert) und dies beinhaltet mehrere unterschiedliche funktionen aus den bereichen Mathematik, Spiel und System.
Da das so ziemlich über 3000 Zeilen wären, hab ich die ganzen Funktionen in einzelne C-Dateien abgelegt, die ich dann über eine include.h einbinde(mit dieser werden alle C-Dateien sowie die Bibliotheken eingebunden).
Im Programm kann man die Funktionen über ein Menü abrufen und ausführen lassen.
Nun zu meiner Frage:
Es kommen in Zukunft noch viele weiteren Funktionen hinzu und deswegen hatte ich die Idee, die Funktionen einzeln in DLL's(?) zu kompilieren und so das Programm nur noch daraus besteht, die Dateien aus dem Ordner auszulesen, das Manü zu generieren und funktionalität reinzubringen.
Kann so etwas funktionieren? Wenn ja, wie?
P.S.: Bei den DLL's bin ich mir nicht sicher, ob diese zu dem zweck da sind ;-)
MfG. Christoph Ludwig
Mahlzeit,
die ich dann über eine include.h einbinde(mit dieser werden alle C-Dateien sowie die Bibliotheken eingebunden).
Nicht so ganz. Header-Dateien sollen keinen eigenen Code erzeugen. Sie stellen auch nur die Funktionoisheader der Libs zur Verfügung.
Normalerweise kompiliert man die zusätzliche Datei als .o und fügt dann alles per Linker zusammen.
Es kommen in Zukunft noch viele weiteren Funktionen hinzu und deswegen hatte ich die Idee, die Funktionen einzeln in DLL's(?)
Da du nicht erwähnst, welches System, kann ich das nicht beantworten.
zu kompilieren und so das Programm nur noch daraus besteht, die Dateien aus dem Ordner auszulesen, das Manü zu generieren und funktionalität reinzubringen.
Bedenke, du musst diese Libs immer mitliefern,. wenn du das Programm irgendwo andersw einsetzen willst.
Bei ein paar tausend Zeilen Code würde ich aber alles statisch kompilieren, weil das Handling einfacher ist.
Kann so etwas funktionieren? Wenn ja, wie?
Können schon, mit deiner gegebenen Info ist aber alles andere pure Spekulation.
P.S.: Bei den DLL's bin ich mir nicht sicher, ob diese zu dem zweck da sind ;-)
Dann lies doch einfach mal nach, was DLLs sind.
Hallo,
P.S.: Bei den DLL's bin ich mir nicht sicher, ob diese zu dem zweck da sind
Guck mal: Libs in c vorkompilieren, am Ende des Artikels,
Hotte
P.S.: Bei den DLL's bin ich mir nicht sicher, ob diese zu dem zweck da sind
Guck mal: Libs in c vorkompilieren, am Ende des Artikels,
Ich glaube er möchte zur Laufzeit verlinken nicht beim kompilieren
Struppi.
Hallo,
Ich glaube er möchte zur Laufzeit verlinken nicht beim kompilieren
richtig. Ich arbeite mit Dev C++ von Blodshet.
Ziel: Alle funktionen werden seperat kompiliert und gespeichert(nicht als exe). Sobald der User das Hauptprogramm öffnet, dann sucht sich dieses sich aus vordefinierten Ordnern die Funktionalitäten und stellt diese Bereit.
Hab ich das ordentlich erklärt oder gibts noch fragen?
MfG. Christoph Ludwig
Hab ich das ordentlich erklärt oder gibts noch fragen?
Von meiner Seite aus nicht, meine C Kenntnisse sind zu eingestaubt, mit Perl geht sowas einfach.
Struppi.
Hallo,
Von meiner Seite aus nicht, meine C Kenntnisse sind zu eingestaubt, mit Perl geht sowas einfach.
ja mit PERL arbeite ich aber nicht ;)
MfG. Christoph Ludwig
Hallo,
Es kommen in Zukunft noch viele weiteren Funktionen hinzu und deswegen hatte ich die Idee, die Funktionen einzeln in DLL's(?) zu kompilieren und so das Programm nur noch daraus besteht, die Dateien aus dem Ordner auszulesen, das Manü zu generieren und funktionalität reinzubringen.
Kann so etwas funktionieren? Wenn ja, wie?
Naja, wenn Du unter Windows arbeitest, dann kannst Du DLLs dynamisch nachladen und dann funktionen aus diesen DLLs aufrufen. Dazu gibt es unter Windows die Funktionen LoadLibrary und GetProcAddress.
Im folgenden mal ein ungetestetes Codebeispiel, sollte aber funktionieren:
DLL-Code:
int __declspec(dllexport) meineTolleFunktion (int a, double b) {
// mach was tolles
}
Ausführbarer Code:
// Zeiger auf die Funktion definieren
int (*referenz)(int, double);
const char *dllDatei = "meinedll.dll";
HMODULE dllReferenz;
int resultat;
dllReferenz = LoadLibrary(dllDatei);
if (!dllReferenz) {
// Fehler, nutze GetLastError(), um die Ursache zu finden
return ...;
}
referenz = (int (*)(int, double)) GetProcAddress(dllReferenz, "meineTolleFunktion");
if (!referenz) {
// Fehler!
// DLL entladen
FreeLibrary(dllReferenz);
// Fehler mit getLastError() bestimmen, behandeln
return ...;
}
// Funktion aufrufen mit ein paar werten
resultat = referenz (1, 2.0);
// DLL entladen
FreeLibrary(dllReferenz);
// Fertig.
Das sollte das Grundprinzip erklären, ich hoffe, das hilft weiter. Du kannst die DLL natürlich auch nur ganz am Anfang des Programms laden, dann geladen lassen und am Ende des Programms erst entladen oder so etwas.
Viele Grüße,
Christian