#delphi
#delphi
Вопрос:
Я конвертирую некоторый код C в Delphi. В коде C есть функция чтения / записи для преобразования из 2D (x, y) индекса в одномерный индекс.
Когда я пытаюсь сделать то же самое в Delphi, я получаю сообщение об ошибке «Левая сторона не может быть назначена».
Вот самый простой код, который я мог бы создать, чтобы показать ошибку. Извините за длину. Ее можно скопировать / вставить полностью в новую форму с помощью одной кнопки, чтобы показать проблему.
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type ClassA=class(TObject)
private
type DoubleArray=array of double;
var _src:DoubleArray;
_w,_h:integer;
public
constructor Create(w,h:integer);
destructor Destroy; reintroduce;
function at(x,y:integer):double;
end;
type ClassB=class(TObject)
private
type DoubleArray=array of double;
var _d:ClassA;
//width and height
_w,_h:integer;
public
constructor Create(w,h:integer);
destructor Destroy; reintroduce;
procedure CauseError;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor ClassA.Create(w,h:integer);
begin
_w:=w;
_h:=h;
setlength(_src,_w*_h);
end;
destructor ClassA.Destroy;
begin
setlength(_src,0);
end;
function ClassA.at(x,y:integer):double;
begin
at:=_src[x y*_w];
end;
constructor ClassB.create(w,h:integer);
begin
_w:=w;
_h:=h;
_d:=ClassA.create(_w,_h);
end;
destructor ClassB.Destroy;
begin
_d.free;
end;
procedure ClassB.CauseError;
begin
_d.at(10,10):=_d.at(10,10) 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var CB:ClassB;
begin
CB:=ClassB.create(100,100);
CB.free;
end;
end.
Кто-нибудь может помочь с тем, какой синтаксис мне нужно использовать, чтобы функция «at» работала?
Я не так много работал с классами, поэтому у меня возникли проблемы здесь.
Компилятор жалуется на эту строку
_d.at(10,10):=_d.at(10,10) 1;
Хорошо, это код на C. У нее есть версии как для чтения, так и для записи. Как мне заставить Delphi сделать это?
Функции C заключаются в следующем
/* Read-only and read-write access to grid cells */
double at(int x, int y) const {
return _src[x y*_w];
}
double amp;at(int x, int y) {
return _src[x y*_w];
}
Комментарии:
1. Функция работает, возвращая значение, вы не присваиваете значение функции. Это как писать
Sum(2, 3):=15
, это не сработает, это функция, которая определит сумму.2. Кроме того, вы
reintroduce
используете деструкторы, но не вызываете их. На самом деле вы хотите написатьoverride
.3. Хорошо, я добавил функции C, чтобы показать, как я хочу, чтобы Delphi работал. Могу ли я каким-либо образом перевести это, чтобы компилятор был доволен и все работало должным образом?
4. Смотрите документацию по свойствам массива
5.В коде C неконстантная версия
at()
возвращает ссылку наdouble
, вот почему компилятор разрешает присваивать возвращаемое значение. Но в коде Delphiat()
не возвращает ссылку, из-за чего вы получаете ошибку компилятора при попытке присвоить возвращаемое значение. Delphi НЕ поддерживает функцию, возвращающую ссылку, только значение или указатель. Поэтому вам нужно немного подправить код при переводе на Delphi. Либо верните указатель и разыменуйте его при присвоении нового значения, либо создайте отдельные методы получения и установки