C++ Klassenproblem mit BlitzMax

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

klin

Betreff: C++ Klassenproblem mit BlitzMax

BeitragMi, Dez 18, 2013 2:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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: [AUSKLAPPEN]
Import "timer.cpp"

SuperStrict

Extern

Type CStopWatch
Method _pad1()
Method _pad2()

Method startTimer()
Method StopTimer()
Method getElapsedTime:Double()
End Type

Function newTimer:CStopWatch()

End Extern

Local c:CStopWatch = newTimer()
c.startTimer() ' <- Absturtz!

c.StopTimer()


timer.cpp
Code: [AUSKLAPPEN]

#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: [AUSKLAPPEN]
 #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: [AUSKLAPPEN]
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: [AUSKLAPPEN]
void CStopWatch::startTimer( ){
   stopWatch *newtimer = new stopWatch;
   QueryPerformanceCounter(&newtimer->start);
}
dann funktioniert der Code (abgesehen vom Stoppen).
ich habe auch schon
Code: [AUSKLAPPEN]
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

BeitragMi, Dez 18, 2013 11:50
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Dez 19, 2013 11:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group