【问题标题】:Invalid Pointer Operation with Dynamic Array动态数组的无效指针操作
【发布时间】:2015-04-09 19:51:24
【问题描述】:

Heloo 伙计们...一旦我尝试运行此代码,我就会遇到“无效指针操作”错误,这是什么问题?它应该将该文本文件中的这些名称按字母顺序排序(学校项目)。

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes;
var
  names : TextFile;
  count : integer=0;
  array : array of string;
  i : integer;

Procedure Load;
 begin
  Reset(names);
  SetLength(array, count - 1);
  for i := 1 to count do ReadLn(names, array[i]);
 end;

begin
  AssignFile(names, 'names.txt');
  Reset(names);
    While not EoF(names) do
      begin
      ReadLn(names);
      Inc(count);
      end;
   Load;
   for i := 1 to count do WriteLn(array[i]);
   ReadLn;
   CloseFile(names);
   Erase(names);
end.

【问题讨论】:

  • 我知道它还没有设置按字母顺序对这些项目进行排序,因为我还没有完成......只需要先解决这个“错误问题”。
  • 如果有一些“语法错误”,那是因为我是从记忆中写出来的,而不是复制和粘贴它(我还更改了变量的名称,因为我用我的语言命名了它们(斯洛伐克语) ))...我刚刚在这里写了一些非常相似的东西,让您了解我的问题
  • 为什么你的数组计数为 0?你实际上是在打电话给SetLength(Array, 0);
  • 不是……你没仔细阅读
  • 知道了,你正在增加它。仍然不是这样做的正确方法。消除此 Count 变量并改为读取 Length(array)

标签: arrays delphi sorting dynamic pascal


【解决方案1】:

动态数组是从零开始的。您需要将长度设置为count 并从0 迭代到count-1

SetLength(arr, count);
for i := 0 to count-1 do
  ReadLn(names, arr[i]);

显然,所有索引都需要更改为从 0 开始。

我将数组的名称更改为arr,因为array 是关键字。

不要尝试继续使用从 1 开始的索引。这样做会让你头疼不已。

您还应该启用 范围检查 编译器选项。如果您越界访问数组,这样做会在运行时产生信息错误。

【讨论】:

  • 另外,如果 'names' 为空,代码会尝试将 'array' 的长度设置为 -1。
  • 我的意思是我试过但没用,同样的错误消息又出现了
  • 如果我在这里发布一个原始文件你可以吗?
  • 良好的范围检查编译器选项建议和强大的耐心!
猜你喜欢
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2011-01-05
  • 2016-01-22
  • 1970-01-01
相关资源
最近更新 更多