簡體   English   中英

動態數組,從C ++轉換為Delphi

[英]Dynamic array, convert from C++ to Delphi

我不明白為什么Delphi不像C ++那樣工作

float *buffer;
buffer=new float[2];
buffer[0]=0.1;
buffer[1]=0.2;
buffer+=1;
//now buffer[0] has value of buffer[1] and buffer[1] has value 0

德爾福代碼:

buffer: array of Single;
SetLength(buffer,2);
buffer[0]:=0.1;
buffer[1]:=0.2;
buffer:=buffer+1; //doesn't work

您展示的Delphi代碼並不等同於C ++代碼正在做的事情 - 利用指針算法。 以下是更接近的翻譯:

如果您使用的是D2009 +:

{$POINTERMATH ON}

var
  buffer: PSingle;

GetMem(buffer, SizeOf(Single) * 2);
buffer[0] := 0.1;
buffer[1] := 0.2;
buffer := buffer + 1;

如果您使用的是D2007或更早版本,請使用更像這樣的內容:

type
  TSingleArray = packed array[0..(MaxInt div SizeOf(Single))-1] of Single;
  PSingleArray = ^TSingleArray;

var
  buffer: PSingle;

GetMem(buffer, SizeOf(Single) * 2);
PSingleArray(buffer)^[0] := 0.1;
PSingleArray(buffer)^[1] := 0.2;
Inc(buffer);

你得到的許多評論正在發生,因為你的C ++代碼是荒謬的,人們不明白你為什么要這樣做, 在C ++或Delphi中。

指針指向一個內存地址,通常假定它包含一個變量。 但在C(和C ++和類似語言)中,指針也用作數組; 而不是一個明確定義的“數組類型”,你只需要一個指向第一個元素和數組語法的指針。 你的buffer+=1行基本上意味着“將指針移動到它當前所在的變量元素之后。” 你聲稱now buffer[0] has value of buffer[1] and buffer[1] has value 0 ,但它並不那么簡單。 舊緩沖區[0]沒有去任何地方; 你剛剛移動了指針。

你來自:

  | 
  V
-----------------
| 0 | 1 | beyond|
-----------------
|0.1|0.2|???????|
-----------------

至:

      | 
      V
-----------------
| 0 | 1 | beyond|
-----------------
|0.1|0.2|???????|
-----------------

現在看起來緩沖區[0]已經改變了它的值,但是值沒有改變; 你剛剛移動了指針。

我將數組結束后的值保留為標記為?s的原因。 那不是真的0; 這是未定義的 ,它包含在這些字節的內存中發生的任何事情。 它現在可能是0,但如果你再次運行它(或在另一台計算機上運行它),你可以很容易地獲得一些隨機數。 未定義的行為 ”是程序員所說的“以不可預測和難以追蹤的方式出現問題”。 這不是一件好事。 C充滿了它; 德爾福,更不用說了。

您嘗試做的事情在Delphi中不起作用的原因是Delphi具有與指針完全不同的明確定義的數組類型。 動態數組可能看起來像“只是一個數組”,但它實際上是一個包含有關數組元數據的數據結構,並在其末尾粘貼了一個數組。 所以你不能移動指針; 沒有“元素指針”與C代碼的方式。

如果你真的想得到一個指向數組中元素的指針,也許是因為你一次掃描一個元素,你可以聲明一個指針類型的變量(用^運算符)並用@運算符設置它,像這樣:

var
buffer: array of Single;
ptr: ^single;
begin
   SetLength(buffer,2);
   buffer[0]:=0.1;
   buffer[1]:=0.2;
   ptr := @buffer[1];
end;

但同樣,指針不是數組,數組不是指針。 所以你不能說ptr[0] (一些指針類型,例如PChar ,由於它們代表C API字符串,因此它們代表C API字符串,因此它們代表了C API字符串,但是這個規則是例外,因為它們代表C API字符串。

如果您想要做的是掃描數組,那么有更好的方法。 因為數組類型定義良好且Delphi知道它有多長,所以你可以這樣做:

for value in buffer do
   //do whatever

這稱為枚舉器 ,它作為一種特殊的for循環,循環遍歷數組中的每個元素,並將其提供給索引變量。

我希望這有幫助。 如果沒有,請澄清您正在嘗試使用此代碼,我會嘗試更好地解釋。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM