Array auf feste Speicherstelle



  • Hi,

    ich brauche ein array, welches an einer fixen Adressebeginnt.
    Hab mir das wie folgt vorgestellt:

    #define VIDEO (*( uint8 volatile *)(0x0008000))
    
    typedef uint8 volatile ui8arr_10_video_t[10];
     uint8 volatile *test=&VIDEO;
    
    ui8arr_10_video_t &ui8arr_10_video=reinterpret_cast<ui8arr_10_video_t >( &VIDEO );
    

    Leider funktioniert das so nicht in der letzten Zeile....
    Über einen Funktionsaufruf möchte ich eigentlich nicht gehen...

    Gruß Alex


  • Mod

    Wozu meinst du das zu brauchen? Du schreibst nicht an feste Adressen, indem du Datenstrukturen dahin packst (was nicht möglich ist), sondern indem du, nun ja, dahin schreibst. Also über Pointer und so.

    Ich bin mir aber ziemlich sicher, dass es auch damit nicht funktionieren wird, da du einerseits keinen Plan von den Grundlagen zu haben scheinst (tut mir leid, aber ist einfach so, wenn man deinen Versuch ansieht), andererseits aber anscheinend etwas versuchst, was einiges an Expertenwissen voraussetzt, wann und wie das überhaupt geht. Könntest du, ohne in Wikipedia zu gucken, erklären, was protected mode ist?



  • Hi SeppJ,

    🙂 danke für die freundliche Unterstützung *ggg*

    Na ja ich bekomme es schon hin... das ist kein Problem, aber ich suche gerade nach einer schönen Lösung. Ich behandle arrays immer auf die selbe Weise, weil das wenn man sich dran hält superschönen code abgibt.

    Leider funktioniert das auf der hardware nicht, oder ich bekomms grad nicht hin.

    char*       video = (char*) 0xb8000;
    
        // C-Strings haben ein Nullbyte als Abschluss
        for (i = 0; hw[i] != '\0'; i++)
    	{
         .....
            video[i * 2] = hw[i];
    ...
    

    In der Form gehts natürlich, ist aber weniger schön...

    Gruß



  • uhm du weisst schon dass reinterpert_cast einen zeiger zurückgibt und der zieltyp (das templateargument) auch ein zeiger sein soll? das ist ja der "sinn" des reinterpret_casts.



  • ^ ups vergiss das da oben, hab mich verlesen beim eröffnungspost



  • Passt schon, das ist ja ne Diskussionsrunde =)...


  • Mod

    AlexanderKiebler schrieb:

    char*       video = (char*) 0xb8000;
    

    In der Form gehts natürlich, ist aber weniger schön...

    Das ist aber die kanonische Lösung. was stellst du dir schöneres vor? Danach kannst du schließlich mit video (fast) so arbeiten, als wäre es ein Array.



  • Ich hatte gehofft, das es eine Lösung gibt, welche im Typen die info der Array größe hat.

    #define VIDEO (*( uint8 volatile *)(0x0008000))
    
    typedef uint8 volatile ui8arr_10_video_t[10];
    struct test2_t
    {
        uint8 volatile ui8arr_10_video[10];
    };
    
     //uint8 volatile *test=&VIDEO;
    //volatile uint8 (&atest)[10]=reinterpret_cast<volatile uint8 [10]>(test);
    //ui8arr_10_video_t &ui8arr_10_video=reinterpret_cast<ui8arr_10_video_t >( &VIDEO );
    test2_t volatile &test=*reinterpret_cast<test2_t volatile *>( &VIDEO );
    

    Schau grad mal in der ISO nach, ob das so erlaubt ist...



  • AlexanderKiebler schrieb:

    Ich hatte gehofft, das es eine Lösung gibt, welche im Typen die info der Array größe hat.

    Ne, gibts nicht. Darum nutzen wir rohe Arrays ja auch nicht. 🙂



  • AlexanderKiebler schrieb:

    Ich hatte gehofft, das es eine Lösung gibt, welche im Typen die info der Array größe hat.

    Bau dir doch eine, ist doch nicht so schwierig. Du kapselst deinen Pointer in einer Klasse, baust ein paar Komfortfunktionen dazu und fertig.



  • Du kannst doch eine Referenz auf ein Array nehmen.

    uint8_t (&screen)[N] = *(uint8_t (*)[N])0xb8000;
    

    Auch wenn mir der Sinn nicht großartig einleuchtet, ich würde einfach einen Pointer nehmen.



  • cool danke, danach habe ich gesucht.
    Das müßte das Selbe sein wie:

    typedef uint8 ui8arr_10_video_t[10];
    ui8arr_10_video_t &ui8arr_10_video=*reinterpret_cast<ui8arr_10_video_t *>( &VIDEO );
    

Log in to reply