c++ 0x0130393b에 처리되지 않은 예외가 있습니다. 0xC0000005: 0xfdfdfdfd 위치를 기록하는 동안 액세스 위반이 발생했습니다. 이오류좀..ㅠㅠ

dbsclgh의 이미지

안녕하세요 다름이 아니라 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);








}

dbsclgh의 이미지

DCT_Y[i+u][j+v]=(Cu*Cv*Sum_Y/4);
//루프를 돌릴수록 생성되는 DCT 계수

이부분입니다 죄송합니다!

익명 사용자의 이미지

코드가 와장창 깨져서 올라왔는데요.

그저 보기 불편한 정도가 아니라 아예 해석이 안됩니다. for 조건문 뚝 잘려서 올라온 것 좀 보세요.

분명 글 올릴 때 코드는 <code> 블럭으로 감싸서 올려달라고 placeholder text에 걸려 있을 텐데,

안 보이는 건지 보고도 모른 척하는 건지 진짜 모를 노릇입니다. 어느 쪽인가요?

======

각설하고, 잘 보이지도 않는 코드에 대충 추측하자면 DCT_Y[i+u][j+v]의 배열 접근 인덱스가 할당된 메모리 밖으로 넘어갔을 가능성이 큽니다. 그 쪽부터 살펴보시길.

확실한 답변을 드리기에는 코드가 너무 조각나있어서 뭘 알 수 있는 게 없네요.

익명 사용자의 이미지

2012년 11월 질문글이군요. 난데없이 끌어올려져서 낚였네요 -ㅇ-

사실 눈 뜬 봉사는 저였던 것입니다 ㅎㅎ.

예나 지금이나 이런 글 올라오는 건 똑같군요.

저도의 이미지

루프 iterator변수 써야하는데 그렇게 안해서 ...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.