Quote:
Originally Posted by Shadow992
Dll:
Gibt mehrere Möglichkeiten, aber prinzipiell gehts easy über:
LoadLibrary + GetProcAddress
bzw. einfach mal googlen.
|
Das ist ja mal wohl das komplette gegenteil von "easy".
- Man muss die DLL manuell laden.
- Man kann sich bei den Funktionsnamen verschreiben, ohne, dass der Compiler meckert.
- Man verliert Typsicherheit.
- Man muss das Ergebnis von GetProcAddress irgendwo speichern.
- Funktioniert natürlich nur auf Windows.
- Man muss eh
Code:
__declspec(dllexport)
auf Windows benutzen, warum dann nicht auch gleich
Code:
__declspec(dllimport)
?
- Für sowas gibt es einen linker.
- Dürfte ziemlich schwer bzw. hässlich werden templates oder Funktionen von Klassen o.ä. zu importieren, falls man sie denn benutzt.
Quote:
Originally Posted by Waller66
wie kann ich die dll per c++ aufrufen, also funktions bezogen und wie ich die dann im projekt zu initialisieren ?
|
Würde dir empfehlen folgendes zu machen:
Wenn du die DLL compilst, definierst du
oder so ähnlich. Dann kannst du in einen Header folgendes packen:
Code:
#ifdef MY_LIBRARY_BUILD
#define MY_LIBRARY_FN __declspec(dllexport)
#else
#define MY_LIBRARY_FN __declspec(dllimport)
#endif
Dann kannst du Funktionen, die du exportieren willst, so deklarieren:
Code:
MY_LIBRARY_FN void abc();
Natürlich machst du das nur auf Windows. Gcc oder Clang exportieren eh alles (glaube ich). Musst dann nur zu deiner DLL linken, von dem Projekt, aus dem du die benutzt.
Generell frage ich mich aber, warum du überhaupt eine dll nutzt ? Warum nicht einfach eine statische Library ? Dann hast du das Problem mit dem exportieren bzw. importieren gar nicht und musst nur zu der Library linken.
Quote:
Originally Posted by Shadow992
Code:
std::tm tm = {};
std::stringstream ss;
ss<<"2014.10.21 12:35:34";
ss >> std::get_time(&tm, "%Y.%m.%d %H:%M:%S");
int d = tm.tm_mday,
m = tm.tm_mon + 1,
y = tm.tm_year + 1900,
s = tm.tm_hour,
min = tm.tm_min,
sek = tm.tm_sec;
std::cout<<sek<<" "<<min<<" "<<y<<std::endl;
|
Man könnte (sollte) auch noch
[Only registered and activated users can see links. Click Here To Register...] benutzen.
Quote:
Originally Posted by Shadow992
Das sind Mikro-Optimierungen, die dir praktisch jeder Compiler abnimmt. So viel wie ich mitbekommen habe macht dir GNU z.B. automatisch (ab o1 glaub ich sogar schon) aus dem:
Code:
for (int i=0;i<100;i++)
{
double d=0;
// mache was mit d
}
Das hier:
Code:
double d;
for (int i=0;i<100;i++)
{
d=0;
// mache was mit d
}
|
Selbst ohne Optimierungen sollte für beide Varianten der gleiche Code generiert werden, oder irre ich mich da ? Ich meine d ist ja nur ein Name für einen Wert auf dem Stack / ein Register und der Stack wird eh am Anfang der Funktion initialisiert.
Quote:
Originally Posted by Waller66
und wenn ich mit zeit rechne wie wandle ich das in int am besten um ?
|
Garnicht. Du benutzt
[Only registered and activated users can see links. Click Here To Register...].
Quote:
Originally Posted by Waller66
int date2time (int *year,int *month ,int *day,int *hour,int *minuten,int *sekunden)
{
// splitten
int years = (*year - 1997) * 31536000 ;//sekundeneinesjahres
int months = months * ???;
int days = *day * 86400 ;
int hours = *hour * 3600 ;
int minuts = *minuten * 60;
int seks = *sekunden;
int time = years + months + hours + minuts + seks;
return(time);
}
|
Warum übergibst du nur Pointer zu ints als Parameter ? Ergibt irgendwie wenig Sinn für mich.