float zu void* casten?



  • Hallo!

    Ich stehe gerade vor einem nervigen Problem, dass ich selbst leider nicht in den Griff bekomme.

    Ich habe eine Klasse, die in der Lage sein soll, unterschiedliche Datentypen zu lagern. Sicher ginge das nun auch über Klassen-Templates, aber ich präferiere in dem Falle aufgrund einiger Besonderheiten eine andere Vorgehensweise. Und nun zu meiner eigentlichen Frage:

    Wahrscheinlich recht einfach, aber wie kann ich einen void*-Pointer mit einem float-Wert füllen?

    Ich hab's schon auf so ziemlich jede (mir) erdenkliche Art und Weise versucht:

    malloc()/memcpy()
    static_cast
    oder auch mit einem new Operator

    Aber leider kein Erfolg.

    Ich komm nicht so recht weiter, also bin ich für jede Hilfe dankbar!



  • naja einem Zeiger kannst du keinen Wert zuweisen ...

    const float value(3.5f);
    void* ptr_void(new float(value));
    
    delete static_cast<float*>(ptr_void);
    

    ...wobei das mit void* immer so ne Sache ist ... vllt. reicht dir auch eher sowas:

    namespace interface
    {
        struct Destroyer 
        {
            virtual ~Destroyer() {}
              virtual void destroy() = 0;
        };};
    
    template <typename destroy_type>
    struct Destroyer : public interface::Destroyer
    {
        void destroy(void* ptr) { delete static_cast<destroy_type>(ptr); }
    };
    

    Dann zu jedem void-Zeiger einen interface::Destroyer-Zeiger dazu speichern, den du mit dem entsprechenden Destroyer initialisierst... z.B. bei float dann

    struct item
    {
        interface::Destroyer* ptr_destructor;
        void* ptr_data;
        ~item()
        { ptr_destructor->destroy(); delete ptr_destructor; }
    } sample;
    
    sample.ptr_destructor = new Destroyer<float>();
    sample.ptr_data = new float(10.0f);
    


  • Wow super, hat funktioniert, vielen Dank!

    Ich hab außerdem gesehn, dass ich die Variable bei printf falsch angegeben hab, denn anstatt:

    printf("%f", data_ptr);
    

    hätte es eigentlich

    printf("%f", *(float*)data_ptr);
    

    heißen müssen.

    Bin ich aber ersts dank Deiner Hilfe drauf gekommen, also nochmals danke!!!

    Was man so alles verlernt, wenn berufsbedingt PHP das Höchste der Gefühle ist, was das Programmieren angeht 🙂


Anmelden zum Antworten