Einer Referenz eine direkt Adresse zuweisen



  • Hallo zusammen.

    Ich weiß, dass der folgende Code (mal wieder) nicht sonderlich schön ist, aber das Ziel ist vorgegeben: Ich möchte einer Referenz auf eine bestimmte Adresse zeigen lassen, die als Integer angegeben wird.

    Beispiel:

    WeatherMgrClass*& TheWeatherMgr = *(WeatherMgrClass**) 0x089AB800;
    

    Unter MSVC funktioniert das auch wunderbar (&TheWeatherMgr ist 0x089AB800), aber unter g++ wird die Adresse leider dereferenziert (&TheWeatherMgr ist *0x089AB800).
    Kennt irgendjemand eine möglichst einfache alternative Möglichkeit, einer Referenz direkt einen Wert zu geben? Vielleicht durch irgendwelche Casts oder besondere g++-Funktionen? Es reicht, wenn der Code im g++-Compiler funktioniert.

    Grüße,
    Neku

    PS: Bitte nicht ins Compilerforum schieben, sonst liest den Thread kaum einer.



  • Hallo,
    eine nicht-konstante Referenz kann nur mit einem lvalue initialisiert werden. Einen solchen hast du aber nicht.

    Du hast zwei Möglichkeiten:
    a) du verwendest eine Referenz auf const:

    WeatherMgrClass*const& TheWeatherMgr = (WeatherMgrClass*) 0x089AB800;
    

    b)
    du erzeugst ein lvalue und bindest die Referenz an daran.

    WeatherMgrClass* theWatchMgr = (WeatherMgrClass*) 0x089AB800;
    WeatherMgrClass*& refTheWatchMgr = theWatchMgr;
    


  • HumeSikkins schrieb:

    Hallo,
    eine nicht-konstante Referenz kann nur mit einem lvalue initialisiert werden. Einen solchen hast du aber nicht.

    Du hast zwei Möglichkeiten:
    a) du verwendest eine Referenz auf const:

    WeatherMgrClass*const& TheWeatherMgr = (WeatherMgrClass*) 0x089AB800;
    

    b)
    du erzeugst ein lvalue und bindest die Referenz an daran.

    WeatherMgrClass* theWatchMgr = (WeatherMgrClass*) 0x089AB800;
    WeatherMgrClass*& refTheWatchMgr = theWatchMgr;
    

    Danke erstmal für deine Antwort. Das 'const' vor dem '&' bedeutet, dass die Referenz konstant ist, nicht das referenzierte Objekt, oder?
    Variante b) hat leider den gleichen seltsamen Effekt wie meine Variante. gdb gibt folgende Daten aus:

    TheWeatherMgr = kann nicht ausgewertet werden
    &TheWeatherMgr = 0
    & &TheWeatherMgr = 0x089AB800
    

    Richtig wäre aber:

    TheWeatherMgr = 0
    &TheWeatherMgr = 0x089AB800
    & &TheWeatherMgr = Speicheradresse der Referenzvariable
    

    Sehr merkwürdig. Ich versuche derzeit herauszufinden, ob es sich um einen Fehler in gdb handelt oder das einfach ein sehr seltsames Verhalten ist.



  • Referenzen sind immer "konstant" (sie zeigen immer auf das selbe Objekt). Ein const zusätzlich bedeutet, dass dieses Objekt konstant ist. Hier heißt das, dass du den Zeiger nicht mehr "umlenken" kannst, das bezeigte Objekt kannst du aber immernoch verändern (denn der Zeiger ist nicht const).



  • Dann kommt die Lösung mit dem const leider nicht in Frage 😞



  • Dann kommen Referenzen nicht in Frage.


  • Mod

    HumeSikkins schrieb:

    Hallo,
    eine nicht-konstante Referenz kann nur mit einem lvalue initialisiert werden. Einen solchen hast du aber nicht.

    Neku schrieb:

    *(WeatherMgrClass**) 0x089AB800;
    

    sieht für mich wie ein lvalue aus.



  • typedef class WeatherMgrClass;
    int main()
    {
        WeatherMgrClass*& TheWeatherMgr = *(WeatherMgrClass**) 0x089AB800;
        return 0;
    }
    

    Compiler : GNU GCC Compiler (called directly)
    Switching to target: default
    Compiling: main.cpp
    main.cpp: In function `int main()':
    main.cpp:18: warning: unused variable 'TheWeatherMgr'
    Linking console executable: C:\INC\deque\deque\console2.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 1 warnings



  • Neku schrieb:

    Beispiel:

    WeatherMgrClass*& TheWeatherMgr = *(WeatherMgrClass**) 0x089AB800;
    

    .. aber unter g++ wird die Adresse leider dereferenziert (&TheWeatherMgr ist *0x089AB800).
    Kennt irgendjemand eine möglichst einfache alternative Möglichkeit, einer Referenz direkt einen Wert zu geben? Vielleicht durch irgendwelche Casts oder besondere g++-Funktionen? Es reicht, wenn der Code im g++-Compiler funktioniert.

    Das müsste funktionieren:

    WeatherMgrClass*& TheWeatherMgr = *(WeatherMgrClass**) &TheWeatherMgr;
        TheWeatherMgr = (WeatherMgrClass*)0x089AB800;
    

    mfg 🙂



  • camper schrieb:

    HumeSikkins schrieb:

    Hallo,
    eine nicht-konstante Referenz kann nur mit einem lvalue initialisiert werden. Einen solchen hast du aber nicht.

    Neku schrieb:

    *(WeatherMgrClass**) 0x089AB800;
    

    sieht für mich wie ein lvalue aus.

    Ja, hast recht. Logisch richtig ist der Code aber nicht.


Anmelden zum Antworten