2016-03-02 114 views
-3

我正在計算從一個向量中添加一些值並將它們保存在一個新的向量中。我正在做for循環。在開始的代碼工作正常,但後來我開始越來越acces違規錯誤。從我讀的內容來看,當嘗試使用一個未初始化的指針時,你通常會得到這個錯誤。但是我使用的指針已經單元化了。我很抱歉這個草率的代碼,因爲我還在學習。任何暗示什麼可能導致錯誤將非常感謝。未處理的異常訪問C++中的循環衝突

下面是代碼:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

#include <ctime> 
#include <stdio.h> 
#include <iostream> 
#include <math.h> 

using namespace std; 


void MulCPU(int *c, const int *a, const int NDim, const int templateSize){ 
    for (int i = 0; i < NDim; i++){ 
     for (int k = 0; k < NDim; k++){ 
      c[i - 1 + (k - 1)*NDim] = a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - a[i - 1 + (k)*NDim + k*(templateSize - 1)] - a[i + templateSize - 2 + (k - 2)*NDim] + a[i - 2 + (k - 2)*NDim]; 

     } 
    } 
} 


int main() 
{ 

    srand(time(NULL)); 
    int N = 500; 
    int SIZE = N*N; 

    int *h_b = new int[SIZE]; 
    int *h_e = new int[SIZE]; 
    int templateSize = 3; 

// ... 
// Code for defining h_b 
// ... 

    int StartTime = clock(); 
    MulCPU(h_e, h_b, N, templateSize); 
    int StopTime = clock(); 

delete[] h_a, h_b, h_c, h_d, h_e; 

我想這一定是某種方式食堂的事情了循環。早期我遇到了堆異常...

調試器給我: SecondTest.exe中0x011B996B未處理的異常:0xC0000005:訪問衝突讀取地址0x0199C0A4。

+0

你的調試器告訴你什麼? –

+0

你觀察調試你的代碼是什麼。 –

+0

對不起,忘了發佈實際問題:在SecondTest.exe 0x011B996B未處理的異常:0xC0000005:訪問衝突讀取位置0x0199C0A4。 – LukaK

回答

0

你有許多問題:

  c[i - 1 + (k - 1)*NDim] = 
        a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - 
        a[i - 1 + (k)*NDim + k*(templateSize - 1)] - 
        a[i + templateSize - 2 + (k - 2)*NDim] + 
        a[i - 2 + (k - 2)*NDim]; 

ik都爲0,你會寫信給C [-501]。這不太可能結束。 (特別是你可能會覆蓋該是內部堆指針,當你釋放內存會導致各種混亂的。)

此外,當ik都是NDIM-1,那麼第一個索引a

i + templateSize - 1 + (k)*NDim + k*(templateSize - 1) 

它是:

它是:

(NDim*NDim)-1 + NDim*(templateSize-1) 

它在陣列末端運行良好。

編輯:固定偏移錯誤。

0
for (int i = 0; i < NDim; i++){ 
    for (int k = 0; k < NDim; k++){ 
     c[i - 1 + (k - 1)*NDim] = a[i + templateSize - 1 + (k)*NDim + k*(templateSize - 1)] - a[i - 1 + (k)*NDim + k*(templateSize - 1)] - a[i + templateSize - 2 + (k - 2)*NDim] + a[i - 2 + (k - 2)*NDim]; 
    } 
} 

ik都開始在0,所以在第一次迭代本身時i=k=0,您試圖訪問c[0-1+(0-1)*NDim],這是c[-NDim-1]。所以基本上你在計算你想要訪問的元素的索引時做了一些無效計算。您可以通過執行修正的第一個錯誤:

c[i + k*NDim] = /*your remaining expression*/

因爲我不知道你想以後達到什麼指標,你需要弄清楚自己。但是,這是錯誤的,正在擾亂你。

相關問題