2012-02-15 16 views
0

私はIRトラッキングに関するプロジェクトに取り組んでおり、FreeTrack(www.free-track.net)ソフトウェアを使っています。 FreeTrackは、C、Matlab、およびFreeTrackのデータをこれらの言語のいずれかのあなた自身の書き込みプログラムにインターフェイスするために使用できるデルファイコードでダウンロードしたsdkフォルダを提供します。アクセス違反の読み取り場所0xc3618000

私はMatlabから始めましたが、matlabが問題を起こしたとき、私はMvisualのC++に行きました。これはMatlabでも同じように見える問題を引き起こします。ここで

ものです:私はfreetrackクライアントのDLLからデータを読みたいときに私が使用し、 :それが動作

//declare imported function pointers 
importGetData getData; 
getData = (importGetData)GetProcAddress(hinstLib, "FTGetData"); 

if (getData(pData)) 
printf("Yaw: %f\n", data.yaw); 

まず時間は、データは、それはそれをしない0第二の時間です、Mvisualはエラーを返します。

Unhandled exception at 0xc3618000 in FreeTrack.exe: 0xC0000005: Access violation 
reading location 0xc3618000. 

getDataにはアドレス0xc3618000があります。

これは、FreeTrackが実行されている場合にのみ発生します。そうでなければ、getDataからデータは返されません。

これはどんな考えですか?

オリジナルコード:

#include <windows.h> 
#include <stdio.h> 
#include <conio.h> 

typedef struct 
{ 
    float yaw; 
    float pitch; 
    float roll; 
    float x; 
    float y; 
    float z; 
    int dataID; 
}FreeTrackData; 

// DLL function signatures 
// These match those given in FTTypes.pas 
// WINAPI is macro for __stdcall defined somewhere in the depths of windows.h 
typedef bool (WINAPI *importGetData)(FreeTrackData * data); 
typedef char *(WINAPI *importGetDllVersion)(void); 
typedef void (WINAPI *importReportID)(int name); 
typedef char *(WINAPI *importProvider)(void); 


int main(int argc, char **argv) 
{ 
     /*while(1){ 
     printf("hello"); 
     }*/ 
     //declare imported function pointers 
     importGetData getData; 
     importGetDllVersion getDllVersion; 
     importReportID reportID; 
     importProvider provider; 

     // create variables for exchanging data with the dll 
     FreeTrackData data; 
     FreeTrackData *pData; 
     pData = &data; 
     char *pDllVersion; 
     int name = 453; 
     char *pProvider; 

     //while(1){}; 
     // Load DLL file 
     HINSTANCE hinstLib = LoadLibrary("FreeTrackClient.dll"); 
     if (hinstLib == NULL) { 
       printf("ERROR: unable to load DLL\n"); 
       //return 1; 
       while(1){}; 
     } 
     else 
     { 
      printf("dll loaded\n"); 
     } 
     //while(1){}; 
     // Get function pointers 
     getData = (importGetData)GetProcAddress(hinstLib, "FTGetData"); 
     getDllVersion = (importGetDllVersion)GetProcAddress(hinstLib, "FTGetDllVersion"); 
     //reportID = (importReportID)GetProcAddress(hinstLib, "FTReportID"); 
     reportID = (importReportID)GetProcAddress(hinstLib, "FTReportName"); 
     provider = (importProvider)GetProcAddress(hinstLib, "FTProvider"); 

     // Check they are valid 
     if (getData == NULL) { 
       printf("ERROR: unable to find 'FTGetData' function\n"); 
       FreeLibrary(hinstLib); 
       //return 1; 
     } 
     if (getDllVersion == NULL){ 
       printf("ERROR: unable to find 'FTGetDllVersion' function\n"); 
       FreeLibrary(hinstLib); 
       //return 1; 
     } 
     if (reportID == NULL){ 
       printf("ERROR: unable to find 'FTReportID' function\n"); 
       FreeLibrary(hinstLib); 
       //return 1; 
     } 
     if (reportID == NULL){ 
       printf("ERROR: unable to find 'FTProvider' function\n"); 
       FreeLibrary(hinstLib); 
       //return 1; 
     } 

     // Print the address of each function 
     printf("FTGetData is at address: 0x%x\n",getData); 
     printf("FTGetDllVersion is at address: 0x%x\n",getDllVersion); 
     printf("FTReportID is at address: 0x%x\n",reportID); 
     printf("FTProvider is at address: 0x%x\n",provider); 

     // Call each function and display result 
     pDllVersion = getDllVersion(); 
     printf("Dll Version: %s\n", pDllVersion); 

     pProvider = provider(); 
     printf("Provider: %s\n", pProvider); 

     reportID(name); //not sure what this does - I guess it tells the dll that I am using it. 

     system("pause"); //wait till keyboard is pressed before entering main loop 
     while(kbhit() != 1) 
     { 
      //system("cls"); //clear screen 
      if (getData(pData)) 
      { 
       printf("Provider: %s\n", pProvider); 
       printf("Record ID: %d\n" , data.dataID); 
       printf("Yaw: %5.2f\n" , data.yaw); 
       printf("Pitch: %5.2f\n" , data.pitch); 
       printf("Roll: %5.2f\n" , data.roll); 
       printf("X: %5.2f\n" , data.x); 
       printf("Y: %5.2f\n" , data.y); 
       printf("Z: %5.2f\n" , data.z); 
      } 
      else 
      { 
       printf("Nothing returned from getData\n"); 
       break; 
      } 
     } 

     // Unload DLL file 
     FreeLibrary(hinstLib); 
     return 0; 
} 
+0

「pData」とは何ですか? – valdo

+0

typedef struct {float yaw;フロートピッチ。フロートロール; float x;浮動y; float z; int dataID; } FreeTrackData; FreeTrackDataデータ。 FreeTrackData * pData; – Ezraneut

+0

"9getData(pdata)の場合"にブレークポイントを設定して、それ以上にステップインすると、問題が発生するため、印刷と関連がないと思われます。 – Ezraneut

答えて

0

あなたはyawは、Cスタイルの文字列だったが、それはフロートだとprintfに語りました!

+0

間違いは%f – Ezraneut

+0

でなければなりません。おそらく間違いは 'pData'を' pData = &data; 'のようなもので初期化するのを忘れたことでしょう。そこで、初期化されていない変数の値を 'getData'に渡しました。 –

+0

データの作成直後に* pdata – Ezraneut

0

これは、FreeTrackDataの構造定義に起因する可能性があると思います。 this postから更新されたものが見つかりました。

関連する問題