获取实际填充了N x M阵列数据的行数和列数

时间:2010-02-06 12:04:58

标签: delphi arrays pascal

我在Delphi中编写了一些矩阵例程,出现了这个问题。我已经定义了一个真正的矩阵: -

RealArrayNPbyNP =扩展的数组[1..200,1..200];

我用5 x 6矩阵填充了这个数组。

如何在delphi代码中查询数组以获取行数(在本例中为5)和cols数(在本例中为6)。

4 个答案:

答案 0 :(得分:3)

您将矩阵声明为200 x 200.无论您使用多少矩阵,矩阵始终为200 x 200.除了5 x 6范围之外的所有字段都包含至少一些数据,无论是否有用。

也许你应该考虑使用动态数组:

var
  arr: array of array of Extended

使用此功能,您可以使用Setlength根据需要调整阵列尺寸。要获得5x6矩阵,您可以使用此代码(感谢Rob提示)

SetLength(arr, 5, 6);

如您所见,可以使用Length函数查询实际尺寸。长度(arr)获得第一个维度而长度(arr [I]将给出第二个维度。

使用此构造,矩阵的每个“行”可以具有独立数量的“列”。

答案 1 :(得分:2)

如果你不想要一个动态数组,并且没有关于哪些值构成有效值的额外信息(即,如果你不能搜索它们/计算它们),你基本上必须有其他信息。换句话说,您需要在填充数组时设置另外两个变量NRowsNColumns

答案 2 :(得分:0)

如果您可以保证矩阵最初填充了已知值,例如0或某些无效值,那么您可以执行相当于strlen()的操作并简单计算第一行和第一列中的元素数量在标志值之前出现的。然而,这往往效率低下。为什么你不能只根据需要传递当前大小?或者更好的是,将矩阵功能封装在适当的对象中。

答案 3 :(得分:0)

如果我正确理解你的问题,那么你要做的就是拥有一个预先分配的数组,你只需要部分填充,并且想要确定填充的数量。

我将创建一个包含处理此“数组”的所有逻辑的类,并为包含以下逻辑的数组编写属性setter:

Procedure SetArrayValue(X,Y:Extended);
begin
  fInternalArray[x,y] := Extended;
  fInternalArrayMaxX := Max(fInternalArrayMaxX,X);
  fInternalArrayMaxY := Max(fInternalArrayMaxY,Y);
end;

和一个数组初始化/清除函数,如下所示:

Procedure ClearArray;
begin
  FillMemory(@fInternalArray,SizeOf(fInternalArray),0);
  fInternalArrayMaxX := 0;
  fInternalArrayMaxY := 0;
end;

您还可以通过添加另一个与布尔值的边界匹配的数组并相应地修改它来扩展数组元素是否具有值的确定。