c++ 0x0130393b에 처리되지 않은 예외가 있습니다. 0xC0000005: 0xfdfdfdfd 위치를 기록하는 동안 액세스 위반이 발생했습니다. 이오류좀..ㅠㅠ
안녕하세요 다름이 아니라 c++코드 중에 자꾸 "0x0130393b에 처리되지 않은 예외가 있습니다. 0xC0000005: 0xfdfdfdfd 위치를 기록하는 동안 액세스 위반이 발생했습니다. 이메세지가 뜨는데 이유를 당최 못찾겠어요 ...null주소값이 아닌데...일단 첨부소스 올립니다...
#include "StdAfx.h"
#include "DCT.h"
#include "math.h"
CDCT::CDCT(void)
{
}
CDCT::~CDCT(void)
{
}
void CDCT::DCT_Transform(CDib& dib_Y , CDib& dib_Cb , CDib& dib_Cr, CDib& DCT_Y_img,CDib& DCT_Cb_img, CDib& DCT_Cr_img, double **DCT_Y,double **DCT_Cb, double **DCT_Cr)
{
int width = dib_Y.GetWidth();
int height = dib_Y.GetHeight();
BYTE** ptr_Y = dib_Y.GetPtr();
BYTE** ptr_Cb = dib_Cb.GetPtr();
BYTE** ptr_Cr = dib_Cr.GetPtr();
BYTE** ptr_DCT_Y = DCT_Y_img.GetPtr();
BYTE** ptr_DCT_Cb = DCT_Cb_img.GetPtr();
BYTE** ptr_DCT_Cr = DCT_Cr_img.GetPtr();
int i,j,u,v,x,y;
float dct_coeff[8][8] =
{
+1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f,
+0.9808f, +0.8315f, +0.5556f, +0.1951f, -0.1951f, -0.5556f, -0.8315f, -0.9808f,
+0.9239f, +0.3827f, -0.3827f, -0.9239f, -0.9239f, -0.3827f, +0.3827f, +0.9239f,
+0.8315f, -0.1951f, -0.9808f, -0.5556f, +0.5556f, +0.9808f, +0.1951f, -0.8315f,
+0.7071f, -0.7071f, -0.7071f, +0.7071f, +0.7071f, -0.7071f, -0.7071f, +0.7071f,
+0.5556f, -0.9808f, +0.1951f, +0.8315f, -0.8315f, -0.1951f, +0.9808f, -0.5556f,
+0.3827f, -0.9239f, +0.9239f, -0.3827f, -0.3827f, +0.9239f, -0.9239f, +0.3827f,
+0.1951f, -0.5556f, +0.8315f, -0.9808f, +0.9808f, -0.8315f, +0.5556f, -0.1951f
};
float Cu,Cv;
float Sum_Y, Sum_Cb, Sum_Cr;
double Y,Cb,Cr;
double PI = 3.14;
//---------------------------------------------------------------------------------
// Y, Cb, Cr 각각의 채널을 8X8 Block 단위로 DCT
//---------------------------------------------------------------------------------
// DCT-Y
for(i=0 ;i
{
for(j=0; j
{
for(v=0; v<8; v++)
{
for(u=0; u<8; u++) //(u,v)는 나눈 블락안의 DCT계수를 찾기 위해 사용되는 주파수 도메인 {
Sum_Y=0; //값을 초기화한다.
for(y=0; y<8; y++)
{
for(x=0; x<8; x++) //(x, y)는 YCbCr값을 이루는 공간도메인
{
Y=ptr_Y[i+x][j+y];
//각 블록안의 Y값을 Y라고 코딩하기 쉽게 문자로 정의함
Sum_Y += Y*dct_coeff[u][x]*dct_coeff[v][y];
//64개의 (x,y)값으로 코사인 테이블을 이용하여 계산
//Sum_Y += *cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16);
}
}
if(u==0) Cu=0.707;
else Cu=1;
if(v==0) Cv=0.707;
else Cv=1; //
DCT_Y[i+u][j+v]=(Cu*Cv*Sum_Y/4);
//루프를 돌릴수록 생성되는 DCT 계수
}
}
}
for(i=0 ;i
{
for(j=0; j
{
for(v=0; v<8; v++)
{
for(u=0; u<8; u++) //(u,v)는 나눈 블락안의 DCT계수를 찾기 위해 사용되는 주파수 도메인
{
Sum_Cr=0;
Sum_Cb=0; //값을 초기화한다.
for(y=0; y<8; y++)
{
for(x=0; x<8; x++)//(x, y)는 YCbCr값을 이루는 공간도메인
{
Cb=ptr_Cb[i+x][j+y];
Cr=ptr_Cr[i+x][j+y];
//각 블록안의 Cb, Cr값을 코딩하기 쉽게 문자로 정의함
Sum_Cb += (Cb*dct_coeff[u][x]*dct_coeff[v][y]);
Sum_Cr += (Cr*dct_coeff[u][x]*dct_coeff[v][y]);
//64개의 (x,y)값으로 계산할 코사인 값들을 미리 정의 해놓은 테이블을 이용하여 계산량 줄임
}
}
if(u==0) Cu=0.707;
else Cu=1;
if(v==0) Cv=0.707;
else Cv=1;
DCT_Cb[i+u][j+v]=(Cu*Cv*Sum_Cb/4);
DCT_Cr[i+u][j+v]=(Cu*Cv*Sum_Cr/4);
}
}
}
}
//Sum_Y += Y*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16);
// DCT-Cb,Cr
//---------------------------------------------------------------------------------
// 계산된 double 형 배열을 이미지에 출력할 수 있게 이미지화(Normalization)
//---------------------------------------------------------------------------------
// Log scale로 변환하기 위해 새로운 이중포인터배열(임시) 생성
double **log_Y;
double **log_Cb;
double **log_Cr;
log_Y = new double*[height];
log_Cb = new double*[height/2];
log_Cr = new double*[height/2];
for(int i=0 ; i
{
log_Y[i] = new double[width];
memset(log_Y[i], 0, sizeof(double)*width);
}
for(int i=0 ; i
{
log_Cb[i] = new double[width/2];
log_Cr[i] = new double[width/2];
memset(log_Cb[i], 0, sizeof(double)*width/2);
memset(log_Cr[i], 0, sizeof(double)*width/2);
}
// Y, Cb, Cr 배열을 절대값을 취한 후 Log scale로 변환
// 원본 배열(DCT_Y,Cb,CR)은 IDCT에서 사용해야함으로 임시배열(log_Y,Cb,Cr) 사용
for(int i=0 ; i
{
for(int j=0 ; j
{
log_Y[i][j] = log(abs(DCT_Y[i][j])+1);
}
}
for(int i=0 ; i
{
for(int j=0 ; j
{
log_Cb[i][j] = log(abs(DCT_Cb[i][j])+1);
log_Cr[i][j] = log(abs(DCT_Cr[i][j])+1);
}
}
// Maximum 값 찾기
double max_Y = 0, max_Cb = 0, max_Cr = 0;
for(v=0 ; v
{
for(u=0 ; u
{
if(log_Y[v][u] > max_Y)
max_Y = log_Y[v][u];
}
}
for(v=0 ; v
{
for(u=0 ; u
{
if(log_Cb[v][u] > max_Cb)
max_Cb = log_Cb[v][u];
if(log_Cr[v][u] > max_Cr)
max_Cr = log_Cr[v][u];
}
}
// Normalization 0~255 (이미지화)
for(v=0 ; v
{
for(u=0 ; u
{
ptr_DCT_Y[v][u] = (BYTE)limit(log_Y[v][u] * 255 / max_Y);
}
}
for(v=0 ; v
{
for(u=0 ; u
{
ptr_DCT_Cb[v][u] = (BYTE)limit(log_Cb[v][u] * 255 / max_Cb);
ptr_DCT_Cr[v][u] = (BYTE)limit(log_Cr[v][u] * 255 / max_Cr);
}
}
//---------------------------------------------------------------------------------
// Normalization에 사용된 임시 배열 해체
//---------------------------------------------------------------------------------
for(int i=0 ; i
{
delete [] log_Y[i];
}
delete [] log_Y;
for(int i=0 ; i
{
delete [] log_Cb[i];
delete [] log_Cr[i];
}
delete [] log_Cb;
delete [] log_Cr;
}
void CDCT::IDCT_Transform(double** DCT_Y, double** DCT_Cb, double** DCT_Cr, CDib& IDCT_Y_img, CDib& IDCT_Cb_img, CDib& IDCT_Cr_img)
{
int width = IDCT_Y_img.GetWidth();
int height = IDCT_Y_img.GetHeight();
BYTE** ptr_IDCT_Y = IDCT_Y_img.GetPtr();
BYTE** ptr_IDCT_Cb = IDCT_Cb_img.GetPtr();
BYTE** ptr_IDCT_Cr = IDCT_Cr_img.GetPtr();
float dct_coeff[8][8] =
{
+1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f, +1.0f,
+0.9808f, +0.8315f, +0.5556f, +0.1951f, -0.1951f, -0.5556f, -0.8315f, -0.9808f,
+0.9239f, +0.3827f, -0.3827f, -0.9239f, -0.9239f, -0.3827f, +0.3827f, +0.9239f,
+0.8315f, -0.1951f, -0.9808f, -0.5556f, +0.5556f, +0.9808f, +0.1951f, -0.8315f,
+0.7071f, -0.7071f, -0.7071f, +0.7071f, +0.7071f, -0.7071f, -0.7071f, +0.7071f,
+0.5556f, -0.9808f, +0.1951f, +0.8315f, -0.8315f, -0.1951f, +0.9808f, -0.5556f,
+0.3827f, -0.9239f, +0.9239f, -0.3827f, -0.3827f, +0.9239f, -0.9239f, +0.3827f,
+0.1951f, -0.5556f, +0.8315f, -0.9808f, +0.9808f, -0.8315f, +0.5556f, -0.1951f
};
int i,j,u,v,x,y;
float Cu,Cv;
float Sum_Y, Sum_Cb, Sum_Cr;
double Y_coeff,Cb_coeff,Cr_coeff;
double PI = 3.14;
//---------------------------------------------------------------------------------
// Y, Cb, Cr 각각의 배열을 8X8 Block 단위로 IDCT
//---------------------------------------------------------------------------------
// IDCT-Y
//Sum_Y += Cu*Cv*Y_coeff*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16);
// IDCT-Cb,Cr
//Sum_Cb += Cu*Cv*Cb_coeff*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16);
//Sum_Cr += Cu*Cv*Cr_coeff*cos((2*x+1)*u*PI/16)*cos((2*y+1)*v*PI/16);
}
에고 표시를 안했네요!
DCT_Y[i+u][j+v]=(Cu*Cv*Sum_Y/4);
//루프를 돌릴수록 생성되는 DCT 계수
이부분입니다 죄송합니다!
코드가 와장창 깨져서 올라왔는데요.
코드가 와장창 깨져서 올라왔는데요.
그저 보기 불편한 정도가 아니라 아예 해석이 안됩니다. for 조건문 뚝 잘려서 올라온 것 좀 보세요.
분명 글 올릴 때 코드는 <code> 블럭으로 감싸서 올려달라고 placeholder text에 걸려 있을 텐데,
안 보이는 건지 보고도 모른 척하는 건지 진짜 모를 노릇입니다. 어느 쪽인가요?
======
각설하고, 잘 보이지도 않는 코드에 대충 추측하자면 DCT_Y[i+u][j+v]의 배열 접근 인덱스가 할당된 메모리 밖으로 넘어갔을 가능성이 큽니다. 그 쪽부터 살펴보시길.
확실한 답변을 드리기에는 코드가 너무 조각나있어서 뭘 알 수 있는 게 없네요.
2012년 11월 질문글이군요. 난데없이 끌어올려져서
2012년 11월 질문글이군요. 난데없이 끌어올려져서 낚였네요 -ㅇ-
사실 눈 뜬 봉사는 저였던 것입니다 ㅎㅎ.
예나 지금이나 이런 글 올라오는 건 똑같군요.
루프 iterator 제대로 안적어서
루프 iterator변수 써야하는데 그렇게 안해서 ...
댓글 달기