Typename und Stringausgabe durch Adresse

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

kog

Betreff: Typename und Stringausgabe durch Adresse

BeitragMo, Nov 26, 2012 21:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag Zusammen, vor langem habe ich mal einen Code erstellt. Welchen den Typename anhand einer Adresse ausgeben kann, mithilfe von Pointern.
Zusätzlich kann man, wenn es sich um einen String handelt, diese somit auch auslesen:

BlitzMax: [AUSKLAPPEN]
SuperStrict

Framework brl.blitz
Import brl.standardio
Import brl.retro

Local s:String="Hallo, das ist ein Test~nLOL"


Type TTest
End Type
Local t:TTest=New TTest

'StringTest
Local Stringaddr:Byte Ptr=Varptr(s)
Print "Typ: "+GetTypeName(Stringaddr)
Print "Inhalt des Strings: "+ReadMemString(Stringaddr)

Print "~n"
'TypeTest
Local Typeaddr:Byte Ptr=Varptr(t)
Print "Typ: "+GetTypeName(Typeaddr)
Print "Inhalt des Strings: "+ReadMemString(Typeaddr)

Function ReadMemString:String(addr:Byte Ptr)
'TMPFunc
Extern
Function __CheckString()="bbStringFind"
End Extern

'Checken ob String: = AddrOf----bbStringFind
If Not ((Byte Ptr(Int Ptr(Int Ptr(Int Ptr(addr)[0])[0])[12]))=Byte Ptr(__CheckString)) Return "Es ist kein String"
'
Local l:Int=Int Ptr(Int Ptr(addr)[0])[2]
Local sp:Byte Ptr=Byte Ptr(Int Ptr(addr)[0])
Local str:String=""
For Local i:Short=0 Until l*2 Step 2
str:+Chr(sp[12+i]+sp[12+(i+1)])
Next
Return str
End Function

Function GetTypeName:String(addr:Byte Ptr)
Local p:Int Ptr=Int Ptr(Int Ptr(addr)[0])

Rem

struct BBString{
BBClass* clas; -> 0
int refs; -> 1
int length; -> 2
BBChar buf[]; -> 3+...
};
end rem


Local clas:Int Ptr=Int Ptr(Byte Ptr(p[0]))


Rem
struct BBClass{
//extends BBGCPool
BBClass* super;
void (*free)( BBObject *o );

BBDebugScope*debug_scope; -> 2

int instance_size;

void (*ctor)( BBObject *o );
void (*dtor)( BBObject *o );

BBString* (*ToString)( BBObject *x );
int (*Compare)( BBObject *x,BBObject *y );
BBObject* (*SendMessage)( BBObject *m,BBObject *s );
void (*_reserved1_)();
void (*_reserved2_)();
void (*_reserved3_)();

void* vfns[32];
};
end rem


Local debug:Int Ptr=Int Ptr(Byte Ptr(clas[2]))

Rem
struct BBDebugScope{
int kind;
const char *name;
BBDebugDecl decls[1];
};
end rem


Return String.fromcstring(Byte Ptr(debug[1]))
End Function


Vielleicht kann es jemand brauchen...

*Achtung*
Int, Byte usw. werden natürlich nicht unterstützt, da Native vorhanden.
Windows 7 Home Premium 64bit
CPU: Intel Core i5 3450 Ivy Bridge
GPU: HIS HD 4870 1GB GDDR5
RAM: 4x 4GB DDR3-SDRAM Dual Channel
  • Zuletzt bearbeitet von kog am Mo, Dez 03, 2012 12:00, insgesamt einmal bearbeitet

BtbN

BeitragMo, Nov 26, 2012 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Und warum machst du das nicht einfach über das Reflection modul?

klin

BeitragMo, Dez 03, 2012 10:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Weil das hier kürzer, knapper und einfacher, für andere Leute, zu lernen ist? Rolling Eyes
Man kann doch an den Kommentaren lesen, was die meisten Zahlen bedeuten. Ich finde es zum Verstehen nicht schlecht.

Man kann aber auch natürlich in einem Modul rumwühlen und danach evtl. Bahnhof verstehen.

Klin

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group