2013-07-07 3 views
2

저는 C로 ASCII 게임 엔진을 만들고 C++로 프로그램을 작성하여 연습 한 자습서를 통해 작업하고 있습니다. 저는 현재 Image 구조체의 형태로 힙에 이미지 데이터를 할당하는 작업을하고 있습니다 (int 너비, int 높이 및 char 배열을 보유하고있는 힙의 위치에 대한 두 개의 char 포인터 포함 [width * height]). 크기) ... 그러나 새로운 연산자를 호출하는 데 문제가 있습니다. 내가 구조체 자체뿐만 아니라 문자와 컬러 데이터에 대한 메모리를 할당하고있어 기능은 다음과 같습니다new operator (C++)를 호출 할 때 프로그램이 충돌 함

(이 함수를 두 번 호출되는) 주요 기능 자체는 다음과 같습니다
Image *allocateImage(int width, int height) { 

Image *image; 
image = new Image; 

if (image == NULL) 
    return NULL; 

image->width = width; 
image->height = height; 
image->chars = new CHAR[width * height]; 
image->colours = new COL[width * height]; 

//image->colours = (CHAR*) PtrAdd(image->chars, sizeof(CHAR) + width * height); 

for (int i = 0; i < width * height; ++i) { //initializes transparent image 
    *(&image->chars + i) = 0; 
    *(&image->colours + i) = 0; 
} 
return image; 
} 

: 실제로는 allocateImage에 두 번째 호출에 충돌로 기능 곳의 지점에, 전에, 조금 - 사람이 필요 느낀다, 그러나 프로그램은이 지점에 도달하면

int main() { 
int x, y, offsetx, offsety; 

DWORD i; 

srand(time(0)); 

bool write = FALSE; 

INPUT_RECORD *eventBuffer; 

COLORREF palette[16] = 
    { 
     0x00000000, 0x00800000, 0x00008000, 0x00808000, 
     0x00000080, 0x00800080, 0x00008080, 0x00c0c0c0, 
     0x00808080, 0x00ff0000, 0x0000ff00, 0x00ffff00, 
     0x000000ff, 0x00ff00ff, 0x0000ffff, 0x00ffffff 
    }; 

COORD bufferSize = {WIDTH, HEIGHT}; 

DWORD num_events_read = 0; 

SMALL_RECT windowSize = {0, 0, WIDTH - 1, HEIGHT - 1}; 

COORD characterBufferSize = {WIDTH, HEIGHT}; 
COORD characterPosition = {0, 0}; 
SMALL_RECT consoleWriteArea = {0, 0, WIDTH - 1, HEIGHT - 1}; 

wHnd = GetStdHandle(STD_OUTPUT_HANDLE); 
rHnd = GetStdHandle(STD_INPUT_HANDLE); 

SetConsoleTitle("Title!"); 
SetConsolePalette(palette, 8, 8, L"Sunkure Font"); 

SetConsoleScreenBufferSize(wHnd, bufferSize); 
SetConsoleWindowInfo(wHnd, TRUE, &windowSize); 

for (y = 0; y < HEIGHT; ++y) { 
    for (x = 0; x < WIDTH; ++x) { 
     consoleBuffer[x + WIDTH * y].Char.AsciiChar = (unsigned char)219; 
     consoleBuffer[x + WIDTH * y].Attributes = FOREGROUND_BLUE; 
    } 
} 

write = TRUE; 

Image *sun_image = allocateImage(SUNW, SUNH); 
Image *cloud_image = allocateImage(CLOUDW, CLOUDH); 
setImage(sun_image, SUN.chars, SUN.colors); 
setImage(cloud_image, Cloud.chars, Cloud.colours); 

나는 더 많은 코드를 게시 할 수 있습니다 새 연산자가 호출됩니다. 프로그램은이 시점까지는 잘 작동했습니다. 최근에는 힙 (이미지 크기 변경이 가능한 이미지 생성 용)뿐만 아니라 할당 해제 (이 프로그램에서는 도달하지 못함)에 이미지 데이터를 할당하는 기능이 새로 추가되었습니다. . 에서 배우고있는 프로그램이 C로 작성 되었기 때문에 소스 코드를 보는 것이 도움이되지 않는 곳이기도합니다. Google도 그다지 도움이되지 않았습니다. 누가 잘못 될지 가르쳐 줄 수 있습니까? image 이미 포인터이기 때문에

+0

이미지 * 이미지 = 새 이미지(); (괄호 추가) - COL이 기본 유형이 아니라면 초기화 로직도 모호하게 보입니다. – holtavolt

+0

매개 변수가없는 경우 괄호는 선택 사항입니다. – Gary

+0

죄송합니다. 정의를 추가해야합니다. CHAR과 COL은 모두 부호없는 문자로 정의됩니다. –

답변

5

이 라인

*(&image->chars + i) = 0; 
*(&image->colours + i) = 0; 

는 의심이다. 포인터를 가리키는 포인터는 여기에서 의미가 없습니다. &을 삭제하면됩니다.

실제 코드가 Joe Random Address에 쓰여 지므로 어떤 일이 발생할 수 있습니다. 따라서 메모리 하위 시스템을 방해하고 따라서 다음 번 new 호출을 방해하는 것은 드문 일이 아닙니다.

+1

더 명확하게, 다른 곳에서하고있는 것처럼 배열 표기법을 바꾸는 것입니다. image-> chars [i] = 0; – holtavolt

+0

일해 줘서 고마워! 나는 왜 내가 거기에 있었는지 100 % 확신하지 못한다. 내가 그것을 보자 마자, 무엇이 잘못되었지만, 스스로를보고있을 때 그것을 보지 못했다. =/ –

+0

@CommanderCorianderSalamander : 느낀다. 이 대답을 자유롭게 받아들이십시오 :-) –

관련 문제