2017-12-07 1 views
0

ich die Erinnerung an ein Spiel zu modifizieren, dafür ich etwas tun, wie folgt aus:Template-Funktion zu manipulieren Speicher

*(float*)0x89635637 = 10.0f; 

Jetzt möchte ich dies in eine Template-Funktion einzuschalten, die mir das lesen und einstellen können Speicher mit nur einmal die Adresse zu schreiben, dachte ich an so etwas wie dieses:

template <typename Variable> Variable GetSetAddress(Variable address, Variable value = NULL) 
{ 
    if (value != NULL) 
     *(Variable*)address = value; 

    return *(Variable*)address; 
} 

Jetzt habe ich versucht, es so nennen:

float value = GetSetAddress<float>(0x89635637, 10.0f); 

Aber es gab mir diesen Fehler:

error C2440: 'type cast' : cannot convert from 'float' to 'float *'

ich mit der Verwendung von Vorlagen ziemlich unerfahren bin, so dass ich wäre dankbar, wenn mir einer von euch in die richtige Richtung zeigen könnte. Danke im Voraus!

+0

Was genau sind Sie mit 'Variablenwert zu tun Planung = NULL'? In Ihrem Fall ist 'Variable'' float', also 'float value = NULL'. Angenommen, Ihr Compiler definiert "NULL" als "nullptr" kann es nicht kompilieren – UnholySheep

+0

Welches Spiel? Auf welcher Plattform? Bietet diese Plattform irgendeine Form von Garantie, dass das Ändern bestimmter Adressen vorhersehbares Verhalten hat? Das ist normalerweise ein No-No, es sei denn, Sie arbeiten an hochspezifischer Hardware. Jedenfalls verletzt dieser Fall die Lebensdauer und die Aliasing-Regeln des Objekts, es sei denn, eine Instanz des angegebenen Typs wurde vorher wirklich dort konstruiert. Ich bin auch neugierig, was es heißt, den gleichen Wert zurückzugeben, der weitergegeben wurde, aber das ist meine geringste Sorge hier. –

+0

@underscore_d Es ist ein Call of Duty Spiel auf Xbox360 und ich hatte keine Probleme mit * (float *) address = value; bis jetzt. Und ich gebe nicht den gleichen Wert zurück, der übergeben wurde, ich gebe den Wert an diesem Punkt im Speicher zurück, also kann ich diese Funktion verwenden, um den Speicher einzustellen und/oder nur seinen aktuellen Wert – SupaDupa

Antwort

1

Es ist nicht sinnvoll, value mit NULL zu vergleichen, da value in diesem Fall eine float ist. Zusätzlich sollte der address Parameter keinen Variable sein, es sollte ein integraler Typ sein, der einen Zeigerwert speichern kann, wie std::uintptr_t

template <typename T> T GetSetAddress(std::uintptr_t address, T value) 
{ 
    *(T*)address = value; 
    return *(T*)address; 
} 

Es ist im Allgemeinen am besten c-Casts und zu vermeiden. Sie könnten ein reinterpret_cast stattdessen verwenden und die Return-Anweisung vereinfachen:

template <typename T> T GetSetAddress(std::uintptr_t address, T value) 
{ 
    *reinterpret_cast<T*>(address) = value; 
    return value; 
} 
+0

Ich denke, Ihre Antwort ist was ich brauchte, aber Sie haben etwas falsch, ich möchte nur den Speicher der Adresse festlegen, wenn ein Wert definiert ist, und die Funktion sollte den Wert der Adresse nicht den Wert Parameter zurückgeben. – SupaDupa