C++ Klassenproblem mit BlitzMax
Übersicht

![]() |
klinBetreff: C++ Klassenproblem mit BlitzMax |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
ich versuche nun seit ein paar Tagen eine sehr genaue Zeitdifferenzfunktion hin zu bekommen. Dabei habe ich eine C++-Klasse erstellt, die dann die Funktionen QueryPerformanceFrequency und QueryPerformanceCounter aufruft. Im Normalfall funktioniert es auch wunderbar, jedoch nicht in meinem Code. Hier sind zuerst die Sourcecodes: main.bmx BlitzMax: Import "timer.cpp" timer.cpp Code: #include <windows.h> #include <cstdio> #include "timer.hpp" double CStopWatch::LIToSecs( LARGE_INTEGER & L) { return ((double)L.QuadPart /(double)frequency.QuadPart) ; } CStopWatch::CStopWatch(){ this->timer = new stopWatch; timer->start.QuadPart=0; timer->stop.QuadPart=0; QueryPerformanceFrequency( &frequency ) ; } CStopWatch::~CStopWatch(){ } void CStopWatch::startTimer( ){ QueryPerformanceCounter(&this->timer->start); } void CStopWatch::StopTimer( ) { QueryPerformanceCounter(&this->timer->stop); } double CStopWatch::getElapsedTime(){ LARGE_INTEGER time; time.QuadPart = timer->stop.QuadPart - timer->start.QuadPart; return LIToSecs( time) ; } extern "C"{ CStopWatch *newTimer(){ CStopWatch *l = new CStopWatch; return l; }; }; timer.hpp Code: #ifndef hr_timer
#define hr_timer #include <windows.h> using namespace std; typedef struct{ LARGE_INTEGER start; LARGE_INTEGER stop; }stopWatch; class CStopWatch{ private: stopWatch *timer; LARGE_INTEGER frequency; double LIToSecs(LARGE_INTEGER & L); public: CStopWatch(); virtual ~CStopWatch(); virtual void startTimer(); virtual void StopTimer(); virtual double getElapsedTime(); }; extern "C"{ CStopWatch *newTimer(); } #endif Das Erstellen eines Timers mit Code: Local c:CStopWatch = newTimer() funktioniert.
Jedoch habe ich herausgefunden, dass das Objekt (oder Feld?) stopWatch *timer; immer NULL ist. Wenn ich in void CStopWatch::startTimer( ) bei der QueryPerformanceCounter-Zeile anstatt den erstellten Timer einen neuen Timer erstelle und verwende: Code: void CStopWatch::startTimer( ){
dann funktioniert der Code (abgesehen vom Stoppen).
stopWatch *newtimer = new stopWatch; QueryPerformanceCounter(&newtimer->start); } ich habe auch schon Code: this->timer = new stopWatch; in der selben Methode versucht, jedoch ohne Erfolg.
Ich hoffe es kann mir hier jemand helfen. Der Code ist zwar eigentlich Simpel und ich könnte ihn umgestalten um dem Fehler aus dem Wege zu gehen, jedoch möchte ich Methoden und Klassen von C++ später einmal in einer meiner Projekte verwenden und halte dieses kleine und simple Problem sehr gut zum Fragen. BCC Version: 1.48 FASM Version: 1.70.03 GCC/G++ Version: 4.8.1 Verwendete Quellen: http://cplus.about.com/od/howt...timing.htm https://www.blitzforum.de/foru...hp?t=29719 http://www2.informatik.uni-hal...truct.html Vielen Dank, Klin |
||
![]() |
Thunder |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kann den Absturz an der eingezeichneten Stelle nicht bestätigen. Selbe Versionsnummern (außer fasm: 1.70.02).
Ich bekomme aber einen Absturz (EXCEPTION_ACCESS_VIOLATION), wenn ich getElapsedTime() aufrufe (timer <> NULL). |
||
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Die Fähigkeit C++ klassen zu wrappen ist sehr begrenzt und ungepflegt.
Am besten nur reine C funktionen wrappen, alles andere ist kaum wartbar. So eine kleine klasse in ein paar C funktionen zu wrappen ist ja nun auch kein allzugroßer aufwand. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group