2014-09-20 4 views
1

640x480 창의 임의의 위치에 임의의 크기의 녹색 상자를 만들어야하는 프로그램을 작성했습니다. 다음 코드를 실행하면 분할 오류가 발생합니다. 문제는 두 개의 "for"루프에 있습니다. 일반적으로 segfault는 startx가있는 중첩 된 "for"루프에서 발생합니다. 나는 버퍼 오버 플로우를 의심하지만, 덜 부피가 큰 코드를 만드는 방법을 모른다.세그먼트 오류 11 redux

//Globals 
int width, height; 
int endx, endy, starty, startx, randEnd, randStartX, randStartY; 
unsigned char *pixmap; 

void setPixels(){ 

for (int j = 1; j<100; j++) { // j == j-1 # of boxes 

    randStartX = rand() % width; // random # btw 0 and width 
    randStartY = rand() % height; // random # btw 0 and height 
    randEnd = 1 + (rand() % 100); // random # btw 0 - 100, not allowing box > 100. 

    startx = randStartX; 
    starty = randStartY; 
    endx = startx + randEnd; 
    endy = starty + randEnd; 

    for(int y = starty; y < endy; y++) { // first y coordinate of box 
     for(int x = startx; x < endx; x++) { // first x coordinate of box 
      cout << "endx = " << endx << endl; 
      int i = (y * width + x) * 3; // movement upwards for each pixel 
      pixmap[i++] = 0x00; //Increments i by one to move to the next part of pixel. 
      pixmap[i++] = 0xFF; 
      pixmap[i] = 0x00; 
      } 
     } 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    //initialize the global variables 
    srand (time(0)); 
    width = 640; 
    height = 480; 
    pixmap = new unsigned char[width * height * 3]; 

    setPixels(); // write code like ./pr01 red, etc. 

    glutInit(&argc, argv); 
    glutInitWindowPosition(100, 100); // Where the window will display on-screen. 
    glutInitWindowSize(width, height); 
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 
    glutCreateWindow("Assignment 01"); 
    init(); 
    glutReshapeFunc(windowResize); 
    glutDisplayFunc(windowDisplay); 
    glutMouseFunc(handleButton); 
    glutMainLoop(); 

    return 0; 
} 

어떤 원인 일 수 있습니까? 여기에 뻔뻔한 논리 문제가 있습니까? 미리 감사드립니다.

+2

'pixmap'의 선언과 그것을 초기화하는 코드를 보여줄 수 있습니까? –

+0

"부피가 큰 코드"는 버퍼 오버 플로우와 어떤 관련이 있습니까? 그냥'pixmap'에 적당한 공간을 할당했는지 확인하십시오. – Barmar

+1

'너비 및 높이'란 무엇입니까? 'starty == height-1'과'endy == starty + randEnd', 너비'randEnd> 0'을 가진 상자를 만들면 버퍼 밖에 쓸 수있는 것처럼 보입니다. –

답변

1

randStartX가 639로 설정하고 randStartY 479에 지금 당신이 상자 (최대 100)의 크기를 결정하는 임의의 번호를 찾을 수라고 가정이다. 오른쪽 하단부터 시작하면 배열 범위를 벗어나는 상자를 만들 수 없습니다. randEnd 코드는 randStartXrandStartY에 추가 할 때 경계를 초과하는 상자를 고려해야합니다. randEnd를 제한하거나 2 for 루프에서 표시 영역 (pixmap)의 가장자리를 넘어 쓰기를 제한해야합니다.

가장 좋은 방법은 endxendy입니다. 당신은이 작업을 수행과 함께

endx = startx + randEnd; 
endy = starty + randEnd; 

를 교체하여 버그를 수정할 수 있습니다

endx = min(startx + randEnd, width-1); 
endy = min(starty + randEnd, height-1); 

그것이 widthheight의 가장자리를 넘어 확장되지 않도록 상자를 제한 할 min 기능을 사용하여 (1 빼기 우리가 0이기 때문에)

+0

현재이 문제를 해결하려고 노력 중입니다.이 문제를 해결할 수 있는지 알아 보겠습니다. – Autex

+1

고마워요! 그것은 매력처럼 작동합니다. 너무 고마워. – Autex

+1

그것은 제약 된 것들을 괜찮게 만들었지 만 의도하지 않은 방식으로 상자를 만들었을 것입니다. 나는 그것을 게시 한 후에 예외를 알아 차렸다. startx와 starty는 endx와 endy보다 클 수 있습니다. 시작 좌표가 끝 좌표를 초과하지 않고 ** min ** 함수로 모듈로 대체되도록 솔루션을 수정했습니다. –

0

startx/y가 0..width/height-1 범위에 있고 randEnd가 1..100 범위에있을 수 있으면 endx/y가 쉽게 오버플로 될 수 있습니다 (예 : startx = width-30 및 randEnd = 80).

+0

나는 논리 0-1 범위와 1 ~ 100을 이해하지 못하는 것 같군? 네가 뭔가있는 것처럼 들리는 군. – Autex

0

의견에 명시된대로 문제가 있습니다. 아래 코드를 사용하면 버퍼 내부 만 채울 것입니다.

for(int y =0; y < randStartY ; y++) { // first y coordinate of box 
    for(int x = 0; x < randStartX; x++) { // first x coordinate of box 
     //cout << "endx = " << endx << endl; 
     int i = (y * width + x) * 3; // movement upwards for each pixel 
     pixmap[i++] = 0x00; //Increments i by one to move to the next part of pixel. 
     pixmap[i++] = 0xFF; 
     pixmap[i] = 0x00; 
     } 
    } 
} 

여기 색상을 다루기 때문에 나는 이것이 당신이 무엇인지 추측합니다. 텍스처를 복사하려면 일부 오프셋과 물건을 사용하여 조금 다르게해야합니다. :)

모두 도움이 되길 바랍니다. 이 문제를보고하는 방법

건배

+0

"이렇게하면 0,0에있는 색칠 된 픽셀을 그리기 시작합니다. 나는 원하지 않습니다. 상자의 왼쪽 아래 모서리의 시작 x, y 값을 무작위로 배치하고 싶습니다. 말 되네?" – Autex

+0

@Autex 오케이, 그럼 내가 그곳에서 너를보고 싶었다. 나는 당신이 당신의 대답을 얻었으므로 편집하지 않을 것입니다. –

+0

어쨌든 고마워요! 그러나 문제를 이해하는 데 도움이되었습니다. – Autex