[英]How set dynamic array size in Oxygene (SetLength doesn't work)
使用Oxygene的SetLength等效於什么? 我正在嘗試確定整數數組的大小。
var listIndexes: array of integer;
begin
setLength(listIndexes,5); // doesn't work
end;
Bill, Delphi-Prism中不存在Setlength函數(可以使用ShineOn的命名空間ShineOn.Rtl,但其中有Setlength函數的部分實現)。
在delphi棱鏡中,您可以嘗試一下
type
IntegerArray = array of integer;
var listIndexes: IntegerArray;
listIndexes:=New IntegerArray(5);
要么
var listIndexes: Array of Integer;
listIndexes:=New Integer[5];
UPDATE
另外,您可以編寫自己的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;
您可以使用Array.Resize方法,該方法似乎僅適用於.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 ArrayList或.NET中的另一個System.Collections ,這可能會使您的代碼更簡單並允許您使用框架的新功能,例如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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.