Funktionen abspeichern (Vorsicht, freakig)



  • Hi!

    k.A. ob das jetzt mehr C, C++ oder Asm ist. Poste das einfach mal hier.

    Ich wollte ursprünglich meine Script-Engine aufmotzen bis ich auf
    die Idee gekommen bin C/C++-Source zur Laufzeit in mein Programm
    einzufügen. Ursprünglich habe ich das mit dem TCC (Tiny C Compiler)
    gemacht der extra solche Optionen bietet. Damit ließe sich das Schreiben
    von Functions-Files noch wesentlich vereinfachen.

    Hier ist das Exporter-Proggie:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    typedef unsigned char uchar;
    typedef unsigned int uint;
    typedef const string cstring;
    
    float power(float a)
    {
    	float b = a*a;
    	return b;
    }
    
    void WriteFunction(cstring& filename, void* ptr)
    {
    	ofstream out(filename.c_str(),ios::binary);
    
    	uint size = 1;
    
    	for(uchar* p=(uchar*)ptr; (*p) != 0xC3; ++p)
    		size++;
    
    	out.write((char*)ptr,size);
    }
    
    int main(void)
    {
    	WriteFunction("power.bin",(void*)&power);
    	return 0;
    }
    

    Die Funktion kann jetzt von einem anderen Programm importiert und genutzt werden:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    typedef float (*FUNC)(float);
    
    typedef unsigned char uchar;
    
    int main(void)
    {
    	ifstream in("power.bin",ios::binary);
    
    	in.seekg(0,ios::end);
    	uint size = in.tellg();
    	in.seekg(0,ios::beg);
    
    	uchar* exec = new uchar[size];
    
    	in.read((char*)exec,size);
    
    	FUNC callme = (FUNC)exec;
    	cout << callme(32.0f) << endl;
    
    	delete[] exec;
    
    	return 0;
    }
    

    Funzt unter Linux (ja, der Kernel ist stable ;)) ohne Probleme.
    Einzig das benutzen von Funktionen/Variablen des Importer-Programms
    die nicht der importierten Funktion als Parameter übergeben werden macht mir Probleme. Vorschläge?

    Ach ja und ich weiß das es dlls und so -Files gibt 😉


Anmelden zum Antworten