2010-07-25 55 views
2

我正在使用OpenEXR庫加載圖像。有時當我顛倒數組時遇到EXEC_BAD_ACCESS(訪問衝突)

這工作正常,除了圖像加載旋轉180度。我使用下面顯示的循環來反轉數組,但有時程序將退出,xcode會給我一個EXEC_BAD_ACCESS錯誤(我認爲它與msvc中的訪問衝突相同)。它不會每次發生,每5-10次就發生一次。

理想情況下,我想扭轉陣列的位置,雖然每次都會導致錯誤,但使用memcpy會失敗,但不會導致錯誤,只是一個空白圖像。我想知道是什麼原因導致這個問題。

這裏是我使用的代碼:(RGBA是4 「半」 S R,G,B的結構體,以及,在OpenEXR的定義)預先

Rgba* readRgba(const char filename[], int& width, int& height){ 
    Rgba* pixelBuffer = new Rgba[width * height]; 
    Rgba* temp = new Rgba[width * height]; 

    // ....EXR Loading code.... 

    // TODO: *Sometimes* the following code results in a bad memory access error. No idea why. 
    // Flip the image to conform with OpenGL coordinates. 
    for (int i = 0; i < height; i++){ 
     for(int j = 0; j < width; j++){ 
      temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j]; 
     } 
    } 

     delete pixelBuffer; 

     return temp; 
} 

謝謝!

回答

1

這裏是你如何能優化這個代碼,以節省內存和循環:

Rgba* readRgba(const char filename[], int& width, int& height) 
{ 
    Rgba* pixelBuffer = new Rgba[width * height]; 
    Rgba tempPixel; 

    // ....EXR Loading code.... 

    // Flip the image to conform with OpenGL coordinates. 
    for (int i = 0; i <= height/2; i++) 
     for(int j = 0; j < width && (i*width + j) <= (height*width/2); j++) 
     { 
     tempPixel = pixelBuffer[i*width + j]; 
     pixelBuffer[i*width + j] = pixelBuffer[height*width - (i*width + j) -1]; 
     pixelBuffer[height*width - (i*width + j) -1] = tempPixel; 
     } 

    return pixelBuffer; 
} 

請注意,最佳(從內存使用最佳實踐的角度來看)將傳遞pixelBuffer *作爲參數並已分配。在同一段代碼中分配和釋放內存是一種很好的做法。

+0

謝謝,我試圖扭轉一半陣列因各種原因失敗。這個錯誤似乎現在消失了,但它仍然不能解釋爲什麼它只是偶爾發生,所以我想我會讓問題持續一段時間。 我注意到你正在做我*高度現在(而不是我*寬度)。這是因爲我讀錯了順序或性能原因的圖像元素?謝謝。 – usm 2010-07-26 10:07:46

+0

做我*身高是一個錯誤:)抱歉。我將更正代碼。在我的測試中,我將高度等於寬度的矩陣顛倒過來,因此我沒有這個問題。但是現在,如果您使用帶* i *高度代碼而不是i *寬度的代碼,那麼如果高度<>寬度,將會出現問題。我將更正代碼片段。感謝您指出我的錯誤:) – 2010-07-26 10:35:31

+0

我使用加載的文件作爲OpenGL紋理,這(通常)意味着高度=寬度,這可能是爲什麼代碼爲我工作得很好。很遺憾,我沒有回答爲什麼我有時只會遇到錯誤,但由於您的代碼正常工作並且有我原本計劃使用的方法,因此我會接受您的答案。 – usm 2010-07-27 18:53:16

4

變化:

 temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j]; 

到:

 temp[(i*width)+j] = pixelBuffer[(width*height)-(i*width)+j - 1]; 

(提示:想想會發生什麼當i = 0和j = 0!)

+0

哦,是的,我畫了一個逆轉如何工作的圖表,花了一段時間仔細計算並忘記-1!謝謝。 儘管我仍然有同樣的問題,每5-10次運行。 – usm 2010-07-25 15:31:33

相關問題