Pointers

Übersicht BlitzBasic DLLs und Userlibs

Neue Antwort erstellen

DAK

Betreff: Pointers

BeitragMi, Jul 09, 2014 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Diese Userlib erlaubt die Verwendung von Int-, Float- und String-Pointern in Blitz, wenn auch leider nur eher rudimentär.

Die folgenden Funktionen werden unterstützt:

Code: [AUSKLAPPEN]
    pointers_getPointer%( obj* )
Hiermit bekommt man einen Pointer auf ein beliebiges Type-Objekt. Das wird benötigt, um den Rest der Befehle verwenden zu können. Der Pointer zeigt auf das erste Feld im Type. Will man einen Pointer haben, der auf das zweite Feld zeigt, muss man diesen Pointer mit 4 addieren. Für jedes weitere Feld muss wieder 4 dazu addiert werden.

    pointers_getInt%( ptr% )
    pointers_getFloat#( ptr% )
    pointers_getString$( ptr% )
Diese Befehle geben den Wert zurück, der sich an der Stelle des gegebenen Pointers befindet.
Achtung: getString ist nicht sicher, das heißt, an der Stelle, wo ptr% hin zeigt, muss sich auch wirklich ein String in dem Type befinden, sonst kann das Programm abstürzen!

    pointers_setInt( ptr%, val% )
    pointers_setFloat( ptr%, val# )
    pointers_setString( ptr%, val$ )
Diese Befehle setzen den Wert der Variable, die sich an der Stelle des gegebenen Pointers befindet, auf den gegebenen Wert.
Achtung: Alle diese Befehle sind nicht sicher, das heißt, an der Stelle wo ptr% hin zeigt, muss sich auch wirklich ein Wert des gegebenen Typs befinden (Int / Float / String), sonst kann das Programm abstürzen!


Wer nicht weis, was Pointer sind, sollte wohl besser die Finger davon lassen, da man sich das Debuggen damit unheimlich schwer machen kann. Für alle anderen: Viel Spaß damit.

Hier noch mal der Source-Code:

pointers.bb
BlitzBasic: [AUSKLAPPEN]
;Author: David Krywult

Type pointers_TStringProxy
Field s$
Field sptr%
End Type

Global pointers_stringProxy.pointers_TStringProxy = New pointers_TStringProxy
Global pointers_stringProxyPointer = pointers_getPointer(pointers_stringProxy)
pointers_stringProxy\s = ""
pointers_stringProxy\sptr = pointers_getInt(pointers_getPointer(pointers_stringProxy))


Function pointers_getString$(ptr%)
rptr% = pointers_stringProxyPointer
pointers_setInt(rptr%, pointers_getInt(ptr))
out$ = pointers_stringProxy\s$
pointers_setInt(rptr%, pointers_stringProxy\sptr%)
Return out$
End Function

Function pointers_setString(ptr%, val$)
rptr% = pointers_stringProxyPointer
tmp% = pointers_getInt(rptr%)
pointers_setInt(rptr%, pointers_getInt(ptr%))
pointers_stringProxy\s$ = val$
pointers_setInt(ptr%, pointers_getInt(rptr%))
pointers_setInt(rptr%, tmp%)
End Function


pointers.decls
Code: [AUSKLAPPEN]
.lib "pointersDll.dll"

pointers_getInt%( ptr% ):"_getIntFromPointer@4"
pointers_getFloat#( ptr% ):"_getFloatFromPointer@4"
pointers_getString$( ptr% )

pointers_setInt( ptr%, val% ):"_setIntFromPointer@8"
pointers_setFloat( ptr%, val# ):"_setFloatFromPointer@8"
pointers_setString( ptr%, val$ )

pointers_getPointer%( obj* ):"_getPointer@4"


pointersDLL.h
Code: [AUSKLAPPEN]

#ifdef POINTERSDLL_EXPORTS
#define POINTERSDLL_API extern "C" __declspec(dllexport)
#else
#define POINTERSDLL_API __declspec(dllimport)
#endif

POINTERSDLL_API int __stdcall getIntFromPointer(int ptr);
POINTERSDLL_API float __stdcall getFloatFromPointer(int ptr);

POINTERSDLL_API void __stdcall setIntFromPointer(int ptr, int val);
POINTERSDLL_API void __stdcall setFloatFromPointer(int ptr, float val);

POINTERSDLL_API int __stdcall getPointer(void* ptr);


pointersDLL.cpp
Code: [AUSKLAPPEN]
#include "stdafx.h"
#include "pointersDll.h"

POINTERSDLL_API int __stdcall getIntFromPointer(int ptr) {
   return *((int*)(ptr));
}
POINTERSDLL_API float __stdcall getFloatFromPointer(int ptr) {
   return *((float*)(ptr));
}

POINTERSDLL_API void __stdcall setIntFromPointer(int ptr, int val) {
   *((int*)ptr) = val;
}
POINTERSDLL_API void __stdcall setFloatFromPointer(int ptr, float val) {
   *((float*)ptr) = val;
}

POINTERSDLL_API int __stdcall getPointer(void* ptr) {
   return (int)ptr;
}


Download

Update 11.07.2014:
-) Memory-Leak entfernt, pointers_purgeStores() ist damit obsolet und wurde entfernt.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht BlitzBasic DLLs und Userlibs

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group