C++ Code in PureBasic-Code übersetzten?

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

C++ Code in PureBasic-Code übersetzten?

Beitrag von Programie »

Hi,

Ich hab in einem Forum von GTA ein Code zum auslesen des Zielortes in GTA San Andreas gefunden. Aber der Code ist in C++ geschrieben und ich weiß nicht, wie ich ihn übersetzen soll. :(

Code: Alles auswählen

unsigned short usMarkerId = (* (unsigned short *) 0xBA6774) & 0xFFFF;
unsigned short usMarkerFlag = (* (unsigned short *) 0xBA6774) >> 16;

float fSelectionX = * (float *) 0xBA86F8 + 40 * usMarkerId;
float fSelectionY = * (float *) 0xBA86FC + 40 * usMarkerId;
Ich habe schon versucht den Code zu übersetzten, aber der funktioniert nicht so, wie er soll:

Code: Alles auswählen

usMarkerID=ReadProcessValue($BA6774&$FFFF,#Word)
usMarkerFlag=ReadProcessValue($BA6774>>16,#Word)

x.f=ReadProcessFloat($BA86F8+40*usMarkerID)
y.f=ReadProcessFloat($BA86FC+40*usMarkerID)

Debug x
Debug y
Hat jemand eine Idee, was ich das falsch mache?

PS: Hier ist der Thread in dem Forum


Thx :allright:
BildBildBildBild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Woher hast du ReadProcessValue und ReadProcessFloat? Das steht in dem C Code auch nirgends.

So wären die 2 Zeilen in PureBasic:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Aber absolute Adressierung ist nunmal beim Protected Mode nicht so einfach. Ich denke dafür hast du auch das ReadProcessValue genommen und das ReadProcessFloat, oder?

Da es aber kein unsigned short in PureBasic gibt würde ich noch ein & $FFFF dranhängen:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) & $FFFF >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Allerdings muss man da auf den Endian aufpassen. Desshalb ist das & $FFFF nicht ganz ok.

[EDIT]
Statt dem PeekF/PeekW musst du dann ja deine ReadProcess... Funktionen benutzen ;-) .
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

@DarkDragon:

Die ReadProcessX()-Funktionen hab ich selbst erstellt.
Hab über dem Code noch "IncludeFile". :wink:

Wegen dem PeekX(): Das oll ja nicht aus dem eigenen Speicher, sondern aus dem Speicher von GTA San Andreas ausgelesen werden. :allright:

Aber da kommt nie raus, was eigentlich rauskommen sollte. :(

Beispiel:
Ich setzte den Zielort in GTA San Andreas ganz nach links oben, aber er gibt mir nicht irgendwelche Koordinaten aus dem Bereich aus, sondern was ganz anderes, was es eigentlich nicht sein könnte.
In der Mitte von der GTA San Andreas Karte ist ja die Position 0 x 0. Aber wenn ich da den Zielort hinsetze, kommen auch ganz andere Werte raus. :cry:

PS: Ich kann auch gern mal die "Common.pbi" posten (Die Datei, die ich über dem Code mit "IncludeFile" einfüge). <)
BildBildBildBild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Programie hat geschrieben:@DarkDragon:

Die ReadProcessX()-Funktionen hab ich selbst erstellt.
Hab über dem Code noch "IncludeFile". :wink:

Wegen dem PeekX(): Das oll ja nicht aus dem eigenen Speicher, sondern aus dem Speicher von GTA San Andreas ausgelesen werden. :allright:

Aber da kommt nie raus, was eigentlich rauskommen sollte. :(

Beispiel:
Ich setzte den Zielort in GTA San Andreas ganz nach links oben, aber er gibt mir nicht irgendwelche Koordinaten aus dem Bereich aus, sondern was ganz anderes, was es eigentlich nicht sein könnte.
In der Mitte von der GTA San Andreas Karte ist ja die Position 0 x 0. Aber wenn ich da den Zielort hinsetze, kommen auch ganz andere Werte raus. :cry:

PS: Ich kann auch gern mal die "Common.pbi" posten (Die Datei, die ich über dem Code mit "IncludeFile" einfüge). <)
Bringt eh nichts, ich kanns nicht testen. Hast du denn den Code von mir getestet (Natürlich mit deinen Read... Funktionen statt den Peeks)? Das sollte eigentlich so stimmen wenn deine ReadProcess... Funktionen korrekt sind.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Programie
Beiträge: 1280
Registriert: 06.08.2005 22:56
Computerausstattung: https://www.sysprofile.de/id160800
Wohnort: Gernsbach
Kontaktdaten:

Beitrag von Programie »

DarkDragon hat geschrieben:

Code: Alles auswählen

usMarkerId.l = PeekW($BA6774) & $FFFF
usMarkerFlag.l = PeekW($BA6774) & $FFFF >> 16;

fSelectionX.f = PeekF($BA86F8) + 40 * usMarkerId
fSelectionY.f = PeekF($BA86FC) + 40 * usMarkerId
Das funktioniert! :allright:

Thx
BildBildBildBild
Antworten