You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pascal实现Connect4游戏时调用SetLength()触发Access Violation错误

Connect4默认运行触发EAccessViolation的原因分析

核心错误:局部变量未初始化

你的代码在无参数运行(默认6×7棋盘)的分支中,存在未初始化的局部变量,这是触发访问违规的直接原因。

看PlayGame过程的else分支代码:

else
begin
  SetLength(Board, Rows);
  for g := 0 to rows-1 do
    SetLength(Board[g], cols);
  WinSize := 4;
end;

这里的rows和cols是PlayGame内定义的局部变量,在默认分支中没有被赋值,它们的初始值是内存中的随机垃圾数据。当用这个不可控的垃圾值作为循环边界(rows-1)或数组长度参数时,会导致数组越界访问,直接触发EAccessViolation错误。

修复方案

在默认分支中先给rows和cols赋值为全局常量Rows和Columns:

else
begin
  rows := Rows;
  cols := Columns;
  SetLength(Board, rows);
  for g := 0 to rows-1 do
    SetLength(Board[g], cols);
  WinSize := 4;
end;

关于Mac环境的影响

这个错误本质是代码逻辑问题,和Mac环境没有直接关联。不过不同操作系统下,FreePascal对未初始化局部变量的内存填充值可能存在差异:某些系统中垃圾值可能刚好不会触发明显崩溃,但Mac下的垃圾值直接导致了数组越界。但核心问题始终是未初始化变量,和操作系统无关。

内容的提问来源于stack exchange,提问作者Don Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:07:38