2013-08-29 58 views
0

我做的一個項目中,我定義的數據類型,如下面QMAP內存錯誤

typedef QVector<double> QFilterDataMap1D; 

typedef QMap<double, QFilterDataMap1D> QFilterDataMap2D; 

再有就是一個類中,我有這個變量

QFilterMap2D valid_filters; 



mono_data Scan_data // Class 
的mono_data的名字

現在我正在讀取.mat文件中的一個變量,並試圖將其保存到「valid_filters」QMap上方。

的Qt代碼:切換視圖

for(int i=0;i<1;i++) 
    { 
     for(int j=0;j<1;j++) 
     { 
      Scan_Data.valid_filters[i][j]=valid_filters[i][j]; 
      printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]); 
     } 
    } 

轉移成功完成,但隨後給出了運行時錯誤

Windows已經引發了SpectralDataCollector.exe一個斷點。

這可能是由於堆損壞引起的,並且在 SpectralDataCollector.exe或它已加載的任何DLL中指示了一個錯誤。

輸出窗口可能有更多的診斷信息,解決這個問題

誰能幫助。這對我很有幫助。

感謝

回答

0

不同的問題在這裏:

1.採用雙層關鍵型的QMAP

使用QMap<double, Foo>是一個非常糟糕的主意。原因是這是一個容器,允許您訪問Foo給定的double。例如:

map[0.45] = foo1; 
map[15.74] = foo2; 

這是有問題的,因爲那樣的話,檢索包含在map[key]的數據,你要測試是否key或者是等於,小於或大於地圖其他按鍵更大。在你的情況下,密鑰是double,並測試兩個double是否等於is not a "safe" operation

2.使用一個int鍵,同時將它定義爲雙

這裏:

Scan_Data.valid_filters[i][j]=valid_filters[i][j]; 

i是一個整數,你說應該是一個雙。

3。您僅環的(I,J)=(0,0)測試

您是否知道

for(int i=0;i<1;i++) 
{ 
    for(int j=0;j<1;j++) 
    { 
     Scan_Data.valid_filters[i][j]=valid_filters[i][j]; 
     printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]); 
    } 
} 

等同於:

Scan_Data.valid_filters[0][0]=valid_filters[0][0]; 
printf("\nValid_filters=%f",Scan_Data.valid_filters[0][0]); 

4.訪問與operator []的載體是不是安全

當你這樣做:

Scan_Data.valid_filters[i][j] 

你做實際上:

QFilterDataMap1D & v = Scan_Data.valid_filters[i]; // call QMap::operator[](double) 
double    d = v[j];      // call QVector::operator[](int) 

第一個是安全的,如果不存在則創建條目。第二個是不安全的,你矢量中的第j個元素必須已經存在,否則它會崩潰。

解決方案

看來你是想要雙(即矩陣)的二維數組。要做到這一點,使用:

typedef QVector<double> QFilterDataMap1D; 
typedef QVector<QFilterDataMap1D> QFilterDataMap2D; 

然後,當你要轉移一個在另一個,只需使用:

Scan_Data.valid_filters = valid_filters; 

或者,如果你想自己做:

Scan_Data.valid_filters.clear(); 
for(int i=0;i<n;i++) 
{ 
    Scan_Data.valid_filters << QFilterDataMap1D(); 
    for(int j=0;j<m;j++) 
    { 
     Scan_Data.valid_filters[i] << valid_filters[i][j]; 
     printf("\nValid_filters=%f",Scan_Data.valid_filters[i][j]); 
    } 
} 

如果你想要一個3D矩陣,你可以使用:

typedef QVector<QFilterDataMap2D> QFilterDataMap3D; 
+0

首先謝謝很多回復。對於第三部分,是的,我知道它們是等價的。實際上我的矩陣大小是1 * 900 ..我只是用1 * 1來檢查它。對於解決方案部分,我修改它很少,它的工作很好。你能給我一些建議,我可以怎麼寫3d代碼? typedef QVector \t QFilterDataMap1D; typedef QMap QFilterDataMap2D; \t typedef QMap QFilterDataMap3D; –

+0

@Saad好的,很高興它幫助:-)是的,你提出的是好的。如果您需要更高的效率,您可能實際上需要使用尺寸爲size * sizeY * sizeZ的1D矢量,並使用myEmulated3DArray [i * sizeY * sizeZ + j * sizeZ + k]訪問元素。這種後來的方法更好的原因是各種各樣,但我現在不用擔心它,用最簡單的方法:) – Boris

+0

@Saad。哦,不,我剛剛意識到你再次使用了QMap。沒有!忘掉QMap,你被名字誤導,這真的不是你需要的。 :)對於3D矩陣,使用:'QVector >>' – Boris