Delphi: левая сторона не может быть назначена

#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 , вот почему компилятор разрешает присваивать возвращаемое значение. Но в коде Delphi at() не возвращает ссылку, из-за чего вы получаете ошибку компилятора при попытке присвоить возвращаемое значение. Delphi НЕ поддерживает функцию, возвращающую ссылку, только значение или указатель. Поэтому вам нужно немного подправить код при переводе на Delphi. Либо верните указатель и разыменуйте его при присвоении нового значения, либо создайте отдельные методы получения и установки