Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何查找我的错误(delphi)_Delphi_Error Handling_Filereference - Fatal编程技术网

如何查找我的错误(delphi)

如何查找我的错误(delphi),delphi,error-handling,filereference,Delphi,Error Handling,Filereference,我得到一个i/o 998错误,我的任务是将数字从文件重写到数组,并找到最大值和最小值。我做错了什么 implementation var f2: file of Real; m: array of Real; procedure TForm1.Button1Click(Sender: TObject); var f: Real; max, min: Real; i, j: Integer; begin AssignFile(F2, 'test3.dat'); R

我得到一个i/o 998错误,我的任务是将数字从文件重写到数组,并找到最大值和最小值。我做错了什么

implementation

var
  f2: file of Real;
  m: array of Real;

procedure TForm1.Button1Click(Sender: TObject);
var 
  f: Real;
  max, min: Real;
  i, j: Integer;
begin
  AssignFile(F2, 'test3.dat');
  Rewrite(f2);

  for i := 1 to 50 do
  begin
    f := RandomRange(-100, 100);
    Randomize;
    Write(f2, f);
  end;

  CloseFile(f2);

  i := 0;

  Reset(f2);

  while not Eof(f2) do
  begin
    SetLength(m, i);
    Read(f2, m[i]);
    Inc(i);
  end;

  CloseFile(f2);

  max := m[1];
  min := m[1];

  for j := 1 to i do
    if m[j] > max then
      max := m[j]
    else 
    if m[j] < min then
      min := m[i];

许多错误,请参见代码中的注释

应在程序启动时调用一次随机化。 动态数组的起始索引为0。 CloseFile释放文件句柄 在循环之前定义动态数组的长度,否则将出现i/O错误。 Highm将获得动态数组的最大索引。 分配最小值的索引变量为j。
许多错误,请参见代码中的注释

应在程序启动时调用一次随机化。 动态数组的起始索引为0。 CloseFile释放文件句柄 在循环之前定义动态数组的长度,否则将出现i/O错误。 Highm将获得动态数组的最大索引。 分配最小值的索引变量为j。 上面的代码将动态数组的长度设置为0i,并尝试读入其不存在的元素。这会导致RTL向ReadFile api传递无效的缓冲区。操作系统返回“0”,表示函数失败,并将最后一个错误设置为“998”-这是错误\u NOACCESS。RTL设置输入/输出错误代码并引发它

至于答案,请使用调试器。当调试器引发异常时中断。在下一次运行时,在faulting语句上放置一个断点,然后在本例中跟踪到代码RTL中。此外,如果在编译器选项中启用了“范围检查”,则会出现范围检查错误,而不是I/O错误,在这种情况下,您可能会很快看到错误

上面的代码将动态数组的长度设置为0i,并尝试读入其不存在的元素。这会导致RTL向ReadFile api传递无效的缓冲区。操作系统返回“0”,表示函数失败,并将最后一个错误设置为“998”-这是错误\u NOACCESS。RTL设置输入/输出错误代码并引发它


至于答案,请使用调试器。当调试器引发异常时中断。在下一次运行时,在faulting语句上放置一个断点,然后在本例中跟踪到代码RTL中。此外,如果在编译器选项中启用了“范围检查”,则会出现范围检查错误,而不是I/O错误,在这种情况下,您可能会很快看到错误。

不发布所有代码。每次循环调用Randomise都会破坏你的随机性。帕斯卡输入输出?为什么?超出范围的数组访问无法提供帮助。最小/最大循环上的索引错误也是个坏消息。坦率地说,这段代码是一场灾难。您应该初始化i:=1而不是i:=0,否则当您执行setLength时,您的数组1元素总是比您需要的小。在第一次迭代中,您可能会通过执行setLength,0相当于m:=nil{!!}来专门取消dynarray的设置。这就是导致I/O错误的原因。忽略关于标准Pascal I/O的抱怨,这些抱怨都是胡说八道。这里的真实类型是什么?是双倍还是真的?这个文件由什么组成,Real48还是double?在Delphi中没有真正的类型,只有一个存根,它可以连接到不同的实际类型。不要发布所有代码。每次循环调用Randomise都会破坏你的随机性。帕斯卡输入输出?为什么?超出范围的数组访问无法提供帮助。最小/最大循环上的索引错误也是个坏消息。坦率地说,这段代码是一场灾难。您应该初始化i:=1而不是i:=0,否则当您执行setLength时,您的数组1元素总是比您需要的小。在第一次迭代中,您可能会通过执行setLength,0相当于m:=nil{!!}来专门取消dynarray的设置。这就是导致I/O错误的原因。忽略关于标准Pascal I/O的抱怨,这些抱怨都是胡说八道。这里的真实类型是什么?是双倍还是真的?这个文件由什么组成,Real48还是double?在Delphi中没有真正的类型,只有一个存根,它可以连接到不同的实际类型。i+1有什么问题?@ALZ-我不理解你的问题。@SertacAkyuz,在以前删除的评论中,你已经写信给@TLama说i+1是自毁性评论-或者我理解错了。这里的IMHO应该是i+1,因为第一次i:=0,您将长度设置为0,然后尝试将red转换为数组0-length@ALZ-你搞错了。我要求特拉马不要删除他的评论,因为我打算停留在问题的边界内。我也对他的评论投了赞成票。@SertacAkyuz,好的,很抱歉误解了。谢谢i+1有什么问题?@ALZ-我不明白你的问题。@SertacAkyuz,在之前删除的评论中,你已经写信给@TLama说i+1是自毁性的评论-或者我理解错了。这里的IMHO应该是i+1,因为第一次i:=0,您将长度设置为0,然后尝试将red转换为数组0-length@ALZ-你搞错了。我要求特拉马不要删除他的评论,因为我打算停留在问题的边界内。我也对他的评论投了赞成票。@SertacAkyuz,好的,很抱歉误解了。ThanksCloseFile不是一个
n完全错误,只是一个冗余呼叫。CloseFile释放以前获取的只写句柄。如果没有CloseFile,则随后的重置将在获取读写句柄之前执行相同的操作。@FreeConsulting,文档说明CloseFile终止文件变量和磁盘文件之间的关联。此外:与F关联的外部文件将被完全更新,然后关闭,释放文件句柄以供重用。因此,内部重置关闭文件并切换到读写模式这一事实被视为实现细节,这里的最佳实践是遵守文档给出的规则。然后,确保外部文件完全更新的最正确方法是回调,而不是依赖所描述的重置行为,对吗?@FreeConsulting,当然不是。为什么要依赖已从文件中分离的文件变量?然后您需要根据记录的行为再次调用AssignFile。为了避免所有特定于实现的内容,您需要完全关闭更新并拆除W/O句柄关联和名称关联,然后分配回绑定文件名并最终重置acquire R/W handle。CloseFile根本不是一个错误,只是一个冗余调用。CloseFile释放以前获取的只写句柄。如果没有CloseFile,则随后的重置将在获取读写句柄之前执行相同的操作。@FreeConsulting,文档说明CloseFile终止文件变量和磁盘文件之间的关联。此外:与F关联的外部文件将被完全更新,然后关闭,释放文件句柄以供重用。因此,内部重置关闭文件并切换到读写模式这一事实被视为实现细节,这里的最佳实践是遵守文档给出的规则。然后,确保外部文件完全更新的最正确方法是回调,而不是依赖所描述的重置行为,对吗?@FreeConsulting,当然不是。为什么要依赖已从文件中分离的文件变量?然后您需要根据记录的行为再次调用AssignFile。为了避免所有特定于实现的内容,您需要完全关闭更新并拆除W/O句柄关联和名称关联,然后分配回绑定文件名,最后重置acquire R/W句柄。
implementation

var
  f2: file of Real;
  m: array of Real;

procedure TForm1.Button1Click(Sender: TObject);
var 
  f: Real;
  max, min: Real;
  i, j: Integer;
begin
  AssignFile(F2, 'test3.dat');
  Rewrite(f2);

  for i := 1 to 50 do
  begin
    f := RandomRange(-100, 100);
    //Randomize;  <-- Call this once at program start
    Write(f2, f);
  end;

  //CloseFile(f2); <-- Don't close yet.

  Reset(f2);
  SetLength(m, 50);  // <-- Define length of dynamic array
  i := 0;
  while not Eof(f2) do
  begin
    // SetLength(m, i); // <-- Moved to before while loop, or use SetLength(m,i+1);
    Read(f2, m[i]);
    Inc(i);
  end;

  CloseFile(f2);

  max := m[0];  // <-- Dynamic arrays start with index 0
  min := m[0];  // <-- Dynamic arrays start with index 0

  for j := 1 to High(m) do // <- Max index
    if m[j] > max then
      max := m[j]
    else 
    if m[j] < min then
      min := m[j]; // <-- j is correct index variable
  i := 0;

  Reset(f2);

  while not Eof(f2) do
  begin
    SetLength(m, i);
    Read(f2, m[i]);
    Inc(i);
  end;