Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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
.net 如何在Oxygene中设置动态数组大小(SetLength不起作用)_.net_Delphi_Oxygene - Fatal编程技术网

.net 如何在Oxygene中设置动态数组大小(SetLength不起作用)

.net 如何在Oxygene中设置动态数组大小(SetLength不起作用),.net,delphi,oxygene,.net,Delphi,Oxygene,使用Oxygene与SetLength的等效值是多少?我正在尝试调整整数数组的大小 var listIndexes: array of integer; begin setLength(listIndexes,5); // doesn't work end; Bill,函数Setlength在中不存在(您可以使用命名空间ShineOn.Rtl,其中包含Setlength函数的部分实现) 在delphi prism中,您可以试试这个 type IntegerArray = array

使用Oxygene与SetLength的等效值是多少?我正在尝试调整整数数组的大小

var listIndexes: array of integer;
begin
     setLength(listIndexes,5);  // doesn't work
end;

Bill,函数Setlength在中不存在(您可以使用命名空间ShineOn.Rtl,其中包含Setlength函数的部分实现)

在delphi prism中,您可以试试这个

type
IntegerArray = array of integer;

var listIndexes: IntegerArray;
listIndexes:=New IntegerArray(5);

更新

此外,您还可以编写自己的SetLength

method SetLength(var myArray: Array of Integer; NewSize: Integer);
var 
ActualLength: Integer;
begin
  var DummyArray: &Array := &Array.CreateInstance(typeOf(Integer), NewSize);
  if assigned(myArray) then
  begin
    ActualLength:= iif(myArray.Length > NewSize, NewSize, myArray.Length);
    &Array.Copy(myArray, DummyArray, ActualLength);
  end;
  myArray := array of integer(DummyArray);
end;
[编辑更新] 您可以使用似乎只适用于.NET Framework 3.5应用程序的方法。等效的C代码如下所示:

    // Create and initialize a new string array.
    String[] myArr = {"The", "quick", "brown", "fox", "jumps", 
        "over", "the", "lazy", "dog"};

    // Display the values of the array.
    Console.WriteLine( 
        "The string array initially contains the following values:");
    PrintIndexAndValues(myArr);

    // Resize the array to a bigger size (five elements larger).
    Array.Resize(ref myArr, myArr.Length + 5); 

但是,如果您的目标是.NET Framework的早期版本,或者需要对列表进行频繁的调整大小更改,那么我建议您使用.NET或.NET中的其他版本,这可能会使您的代码更加简单,并允许您使用框架的新功能,例如Linq。

这只是一个快速更新

RemObjects添加了一个很酷的新VCL框架,可用于.net及其新的本机目标之上。这也会影响字符串

net或VCL之外的字符串是不可变的。这就是为什么它们只能被缩小(String.Substring),这就是您在问题中遇到的情况

但是,创建自己的“setlength()”方法相当容易。 它看起来并不漂亮,而且非常老派,但为了立即解决问题,它确实起到了作用

我使用一个查找表,这样我们可以将字符串增长16倍。提醒(小于16)同样使用查找表。LLVM积极地优化这样的代码。它可能很难看,但它是有效的。希望这有帮助。只需根据需要重命名:

var str_growth_LUT: array[1..16] of String
= [' ',
   '  ',
   '   ',
   '    ',
   '     ',
   '      ',
   '       ',
   '        ',
   '         ',
   '          ',
   '           ',
   '            ',
   '             ',
   '              ',
   '               ',
   '                '];

class procedure QTXString.SetLength(var Text: String; NewLength: Integer);
begin
  var lCurrent := length(Text);
  if NewLength < lCurrent then
    Text := Text.Substring(1, NewLength)
  else  
    if NewLength > lCurrent then
    begin
      var diff := NewLength - lCurrent;
      var temp: String;

      // Calculate parts of 16
      var major := diff mod 16;
      var minor := diff - (major * 16);      

      // grow by chunks of 16
      while major > 0 do
      begin
        temp := temp + str_growth_LUT[16];
        dec(major);
      end;

      // Add reminder (less than 16)
      if minor > 0 then
        temp := temp + str_growth_LUT[minor];

      Text := temp;
    end;
end;
var str\u growth\u LUT:字符串的数组[1..16]
= [' ',
'  ',
'   ',
'    ',
'     ',
'      ',
'       ',
'        ',
'         ',
'          ',
'           ',
'            ',
'             ',
'              ',
'               ',
'                '];
类过程QTXString.SetLength(变量文本:String;NewLength:Integer);
开始
var lCurrent:=长度(文本);
如果NewLengthlCurrent,则
开始
var diff:=新长度-当前值;
var-temp:字符串;
//计算16的部分
主要变量:=diff mod 16;
次要变量:=差异-(主要*16);
//以16块为单位增长
当专业>0时
开始
温度:=temp+str_增长率[16];
12月(主要);
结束;
//添加提醒(少于16)
如果次要>0,则
温度:=temp+str_增长_LUT[小调];
文本:=温度;
结束;
结束;

您能告诉我们“不工作”是如何显示的吗?您是否遇到编译时错误或不正确的运行时行为?
数组。正如jamiei的回答所指出的,调整大小是一种方法。这样每次都会创建一个新数组。不能再调整数组的大小了吗?是的,但只能使用.NET 3.5-现在,集合是处理数组的首选方法。:)
var str_growth_LUT: array[1..16] of String
= [' ',
   '  ',
   '   ',
   '    ',
   '     ',
   '      ',
   '       ',
   '        ',
   '         ',
   '          ',
   '           ',
   '            ',
   '             ',
   '              ',
   '               ',
   '                '];

class procedure QTXString.SetLength(var Text: String; NewLength: Integer);
begin
  var lCurrent := length(Text);
  if NewLength < lCurrent then
    Text := Text.Substring(1, NewLength)
  else  
    if NewLength > lCurrent then
    begin
      var diff := NewLength - lCurrent;
      var temp: String;

      // Calculate parts of 16
      var major := diff mod 16;
      var minor := diff - (major * 16);      

      // grow by chunks of 16
      while major > 0 do
      begin
        temp := temp + str_growth_LUT[16];
        dec(major);
      end;

      // Add reminder (less than 16)
      if minor > 0 then
        temp := temp + str_growth_LUT[minor];

      Text := temp;
    end;
end;