2014-09-20 2 views
1

Я пишу программу, которая должна создавать случайные ячейки в случайном месте в окне 640x480. Когда я запускаю следующий код, возникает ошибка сегментации. Проблема заключается в двух циклах for. Segfault обычно встречается во вложенном цикле «for» с startx. Я подозреваю, что переполнение буфера, но не знаю, как сделать менее громоздкий код.Сегментация Fault 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

Что такое 'width' и' height'? Похоже, вы можете создать поле с 'starty == height-1' и' endy == starty + randEnd', width 'randEnd> 0', что приведет к записи за пределами буфера. –

ответ

1

Как посмотреть на этих проблемах предположат randStartX был установлен в 639 и randStartY на 479. Теперь вы говорите, найти случайное число, чтобы определить размер коробки (макс 100). Если вы начинаете с нижнего правого угла, вы не можете создать любое поле за пределами границ массива. ваш код randEnd должен учитывать поля, превышающие границы при добавлении к randStartX и randStartY. randEnd нужно ограничить или в ваших циклах 2 вам нужно убедиться, что вы ограничиваете запись за пределами области отображения (pixmap).

Лучший способ ограничить endx и endy. Вы можете сделать это и исправить ошибку, заменив

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

с:

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

Используйте функцию min, чтобы ограничить поле, так что не выходит за пределы края width и height (вычесть 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? Похоже, вы можете что-то сказать, tho. – 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

Смежные вопросы