- Freienspeicher finden
- In diesen die länge des Stringes schreiben
- Adresse+4 den String schreiben
- In register ECX die Speicher adresse speichern.
Ich weiß einfach nicht wie ich eine Speicheradresse finde die Frei wäre, zu dem wenn ich einen String hineinschreibe über :
std::string AccName = "test";
__asm{
MOV esi, AccName
MOV EDX, 0x06EF5150
MOV [EDX], esi
}
Steht nachher nur misst drinnen und nicht "test".
std::string ist eine Klasse und eine Instanz ist damit nicht nur die "reine Zeichenkette". Die wird intern wohl als char-Array oder vergleichbares gespeichert. Also versuch es mit einem char Array anstatt std::string.
std::string ist eine Klasse und eine Instanz ist damit nicht nur die "reine Zeichenkette". Die wird intern wohl als char-Array oder vergleichbares gespeichert. Also versuch es mit einem char Array anstatt std::string.
Code:
char Str_[6] = "hallo";
...
MOV [ECX], Str_
kommt der Fehler: error C2415: Ungültiger Operandentyp
-----
Ich mache dies derzeit alles in nem Spiel, wo ich scheinbar eine freie speicheradresse zufällig gefunden habe.
Nun will ich den ASM teil zum testen in einem test Programm machen, doch wie räume ich mir eine "dynamische" stelle im Speicher ein?
Damit ich mit dieser arbeiten kann.
std::string ist zero-terminated. D.h. die reservierte Größe muss nicht die tatsächliche des Strings darstellen (und das tut sie in der Regel auch nicht).
Beispiel:
Code:
std::string foo = "123";
auto size = foo.capacity();
auto length = foo.length();
size beinhaltet (VS10) nun den Werten 15 und length 3.
Schauen wir uns das Ganze im Arbeitsspeicher an:
Code:
0xDEADBEEF+00: '1'
0xDEADBEEF+01: '2'
0xDEADBEEF+02: '3'
0xDEADBEEF+03: '\0'
0xDEADBEEF+04: '#' //Hier kann alles mögliche drinnen stehen
0xDEADBEEF+05: '#'
...
0xDEADBEEF+15: '#'
Wie du sehen kannst ist foo[length+1] == '\0', also NULL. Hier hört der String auf und der Rest ist, zumindest in dem Beispiel, unnötig und kann überschrieben werden.
Ich denke jetzt sollte auch klar sein wie du das machen kannst.
Quote:
Originally Posted by xNopex
std::string ist eine Klasse und eine Instanz ist damit nicht nur die "reine Zeichenkette". Die wird intern wohl als char-Array oder vergleichbares gespeichert. Also versuch es mit einem char Array anstatt std::string.
Quatsch, du kannst an die Adresse des char-Arrays kommen, indem du einfach folgendes machst:
Code:
auto addr = &foo[0];
Quote:
Nun will ich den ASM teil zum testen in einem test Programm machen, doch wie räume ich mir eine "dynamische" stelle im Speicher ein?
Geht es dir nur um den Platz im Speicher? Den kannst du dir auch mit reservieren.
Ich meinte damit den Overhead der Klasse. Es wird ja nicht nur die Zeichenkette gespeichert, sondern auch Kapazität, Länge des String, und evtl. ref-counter. Dass man so an den Puffer kommt, habe ich nie bestritten.
EDIT: AFAIK ist das btw auch compilerabhängig, wie std::string implementiert wird. Also dürfte dein Code auch keine allgemein gültige Lösung sein.
@Nightblizard
Vielen dank, klappt super
Auch wenn das game abstürzt, muss mal gucken was das ist ^^
Aber das Problem hat sich schon erledigt, danke dir
EDIT: AFAIK ist das btw auch compilerabhängig, wie std::string implementiert wird. Also dürfte dein Code auch keine allgemein gültige Lösung sein.
Ich habe jetzt nicht wirklich Lust im Standard nachzuschauen, aber ich bin mir sicher, dass ziemlich genau auf die Klassen und wie sie auszusehen haben eingegangen wird. Das würde ja dem Sinn der Standardisierung wiedersprechen, wenn std::string unter Windows etwas anderes ist als unter Linux.
Aber Details wie z.B. wie viel extra Speicher reserviert wird sind implementationsabhängig, weshalb ich auch in Klammern VS10 schrieb. Das sollte zeigen, dass diese Werte aus einem mit VS10 erstellten Programm stammen und bei anderen Compilern anders aussehen können.
Also prinzipiel sollte das da schon überall funktionieren (vorrausgesetzt es wird mehr Speicher als benötigt reserviert, was es eigentlich tun sollte, wenn da nicht irgendwie der Optimierer reinfingert).
Quote:
Originally Posted by xNopex
Ich meinte damit den Overhead der Klasse. Es wird ja nicht nur die Zeichenkette gespeichert, sondern auch Kapazität, Länge des String, und evtl. ref-counter. Dass man so an den Puffer kommt, habe ich nie bestritten.
Oh, habe deine Aussage falsch ausgelegt. Habe mir nochmal seinen Code angesehen und jetzt wurde mir klar worauf du hinaus wolltest.
Dann vergess das zuvor von mir geschriebene einfach.
Aber Details wie z.B. wie viel extra Speicher reserviert wird sind implementationsabhängig, weshalb ich auch in Klammern VS10 schrieb. Das sollte zeigen, dass diese Werte aus einem mit VS10 erstellten Programm stammen und bei anderen Compilern anders aussehen können.
Exakt das habe ich gemeint. Ich meine auchmal gelesen zu haben, dass es Umsetzungsideen gibt, bei denen die Zeichenkette nicht nacheinander im Speicher abgespeichert wird, sondern wild im Speicher, wo grad Platz ist, verstreut liegt. Ka wie relevant das ist, ob das wirklich so teilweise umgesetzt wird oder ob es bei der Theorie geblieben ist.
Exakt das habe ich gemeint. Ich meine auchmal gelesen zu haben, dass es Umsetzungsideen gibt, bei denen die Zeichenkette nicht nacheinander im Speicher abgespeichert wird, sondern wild im Speicher, wo grad Platz ist, verstreut liegt. Ka wie relevant das ist, ob das wirklich so teilweise umgesetzt wird oder ob es bei der Theorie geblieben ist.
Du weißt nicht zufällig wo du das gelesen hast, oder? Das klingt spontan ersteinmal ein gutes Stück langsamer als ein char-Array zu allokieren und später einfach an einer anderen Stelle neu zu allokieren. Abgesehen vom Platzersparnis sehe ich da gerade keinen Vorteil und das würde dem Gedanken von C++ widersprechen.
Puh keine Ahnung. Das ist schon etwas länger her. Ein gutes Jahr bestimmt. Habs auch schon vergessen gehabt, aber das Thema hier hat mich wieder daran erinnert. Das war ein kleiner Blogeintrag soweit ich mich erinnere, in dem verschiedene "Speichermethoden" kurz vorgestellt wurden. Eine davon war diese.
Wie genau funktioniert denn da c_str()? oO
Muss dann nicht jedes Mal ein C-String daraus gebildet werden?
Ich versteh es jetzt richtig, dass du im Prinzip eine Linked List meinst?
Zumindest Insert/Replace/etc sollten da ja wesentlich schneller gehen.
Wie genau funktioniert denn da c_str()? oO
Muss dann nicht jedes Mal ein C-String daraus gebildet werden?
Vllt. gibt es intelligente Lösungen von unglaublichen schlauen Menschen. Aber mir wärs dann auch nur so eingefallen, dass man für den ganzen String neuen Speicher anfordert und dann die Adresse zurückgibt. Das ist aber natürlich dann der totale Fail, weil dann der ganze Mist davor unsinnig ist. Auch der Overhead der gespeichert werden muss.. Irgendwie muss ja die Teilzeichenkette wissen, wo im Speicher die nächste Teilzeichenkette liegt. Deswegen zweifle ich ja auch daran, dass diese Art zur Implementierung irgendeine praktische Relevanz hat.
[VB08]String in String mit mehreren Funden 08/08/2011 - .NET Languages - 6 Replies Hey,
bin gerade auf ein Problem gestoßen, an dem ich mir seit 3 Stunden die Zähne ausbeiße.
Ich will eine Funktion schreiben, die der _StringBetween Funktion von AutoIt gleich ist. _StringBetween gibt in einem Array alle Strings zwischen zwei SubStrings und dem ganzen String aus. Die Ausgabe bei
_StringBetween("<h1>test1</h1>&l t;h1>test2</h1>", "<h1>", "</h1>") wäre also idealer Weiße ein Array (x = "test1", x = "test2")...
da man in VB08 kein Array returnen kann, komme ich aber einfach...
[VB.Net] String between??? 03/17/2011 - .NET Languages - 5 Replies Hi,
gibts nen befehl in VB.Net für Stringbetween????
also z.B
ich geb in eine Textbox ein
<createGroup>TestName</createGroup>
(brauch ich für ein Programm)
das liest dann den text zwischen
<createGroup> und </createGroup> aus
also in dem fall "TestName"
ich hatte an irgendwas mit
[C++] string zwischen string 11/11/2010 - C/C++ - 6 Replies tag gibts direkt ne funktion, mit der man einen passenden string zwischen dem string suchen kann?
also meine net .find() sondern sowas ähnliches, die in diesem beispiel "mein string sucht"
Bsp:
"<span id=\"lalala\">"+string mein_string+"</span>"
understanden? :-)
[C++]Dev C++ string to int 08/06/2010 - C/C++ - 25 Replies Schonwieder ich :P
Also ich versuchs ma gut zu beschreiben.
Ich habe nen string in dem steht 1 und bevor einer fragt warum ich nicht direkt int benutzte es würde dan nicht funktioniern.
Also ich möchte den string in dem 1 steht in eine int variable umwandeln und danach irgendwan wieder zurück wie schaffe ich das? mit atoi habe ich es nicht hingekriegt und auch nicht mit strtoint
C# String zum Key 05/05/2010 - .NET Languages - 7 Replies Hallo liebe User,
Ich habe seit langer Zeit ein Problem das mich ne Weile beschäftigt.
Es geht um Hotkeys und Strings..
Was ich machen will:
Ich habe jetzt diesen Code: