macOS下使用SDL2无法可视化排序算法执行过程求助
SDL2排序可视化问题修复方案
初始事件循环问题修复
原代码在每次排序步骤后嵌套了while(!quit)循环,该循环会持续阻塞直到用户关闭窗口,导致排序流程无法推进——要么卡死在第一步,要么关闭窗口后直接结束,完全看不到排序过程。
修复要点:
- 删除外层
while(!quit)循环,仅保留单次事件队列处理逻辑,避免阻塞排序流程。 - 事件处理后添加
SDL_Delay()控制每步显示时长,让状态变化可见。 - 通过
goto或标志位处理退出逻辑,跳出嵌套循环。
draw_state函数问题修复
更新后的draw_state存在多处问题,导致无法正确展示排序状态:
- 变量重名覆盖:函数内的
for(int i = 0; ...)覆盖了参数unsigned int i,无法用参数标记当前排序的关键位置。 - 绘制高度错误:用循环变量
i作为线条高度,而非数组元素v[i]的实际值,导致绘制内容与数组状态无关。 - 视觉辨识度低:线条仅1像素宽,且未区分当前正在比较的元素,难以观察排序动态。
修复后的draw_state示例:
void draw_state(std::vector<int>& v, SDL_Renderer* renderer, unsigned int current_i, unsigned int current_j){ const int BAR_WIDTH = 5; const int WINDOW_HEIGHT = 400; int x = 0; for(unsigned int idx = 0; idx < v.size(); idx++){ // 给不同状态的元素设置不同颜色 if(idx == current_i){ SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // 当前i位置标红色 } else if(idx == current_j){ SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); // 当前j位置标绿色 } else { SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 其余元素白色 } // 绘制柱子(从窗口底部到对应元素高度的位置) int bar_height = v[idx]; for(int w = 0; w < BAR_WIDTH; w++){ SDL_RenderDrawLine(renderer, x + w, WINDOW_HEIGHT, x + w, WINDOW_HEIGHT - bar_height); } x += BAR_WIDTH + 1; // 柱子间留1像素间隔 } }
同时注意:
- 创建窗口时设置合适的高度(比如400),确保柱子能完整显示。
- 调整
SDL_Delay(200)的数值控制动画速度,数值越大动画越慢。
内容的提问来源于stack exchange,提问作者PwnsKing
相关产品推荐
相关产品推荐

