Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Указатель на константу массив


Автор: lucas 26.5.2006, 14:44
Здравствуйте. Кто знает возможно ли то что я пытаюсь реализовать. У меня несколько констант массивов, как мне работать с ними не обращаясь на прямую. Т.е функция getConst должна возвращать определенный масив примерно так: Caption:= getConst(0)[0].s;    {='Кино'},
                         Caption:= getConst(1)[2].s;    {='Морковь'},
 

type
  TTemp = record
    s:String;
    b:Integer;
  end;

  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    function getConst(Index:Integer)://какой установить тип для получения константы
    { Public declarations }
  end;

const
  OneArray:Array[0..1] of TTemp = (
     (s: 'Кино'; b: 15),
     (s: 'Видио';   b: 25)
     );

  TwoArray:Array[0..2] of TTemp = (
     (s: 'Прокат'; b: 15),
     (s: 'Сок';   b: 25),
     (s: 'Морковь';   b: 25)
     );

var
  Form1: TForm1;

implementation

{$R *.dfm}

function getConst(Index:Integer)://какой установить тип для получения константы
begin
  case Index of
    0:   Result:= OneArray;
    1:   Result:= TwoArray;
  end;
end;  
 

Автор: Romikgy 26.5.2006, 15:00
Код

type
ATTemp = Array of TTemp;

function getConst(Index:Integer): ATTemp ;

только введи в эти константы размеры массивов, а то имхо тяжко потом будет 

Автор: Dynamic 26.5.2006, 15:04
константу ты так не вернешь. Надо создать тип данных, который ты хочешь получать из getConst, типа
Код

type
  PMyArr = ^TMyArr;
  TMyArr = array of TTemp;

и передавать указатель на него, либо передавать переменную с массивом как var M: TMyArr в параметрах. 

Автор: lucas 26.5.2006, 15:22
Спасибо Dynamic Вам большое. Вы очень мне помогли. Действительно теперь все работает, но последний вопрос почему при такой схеме функция High для полученного массива возвращает не корректное значение

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  TTemp = record
    s:String;
    b:Integer;
  end;

  PMyArr = ^TMyArr;
  TMyArr = array of TTemp;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure getConst(Index:Integer; var M: TMyArr);//какой установить тип для получения константы
    { Public declarations }
  end;

const
  OneArray:Array[0..1] of TTemp = (
     (s: 'Кино'; b: 15),
     (s: 'Видио';   b: 25)
     );

  TwoArray:Array[0..2] of TTemp = (
     (s: 'Прокат'; b: 15),
     (s: 'Сок';   b: 25),
     (s: 'Морковь';   b: 25)
     );

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.getConst(Index:Integer; var M: TMyArr );//какой установить тип для получения константы
begin
  case Index of
    0:   M:= @OneArray;
    1:   M:= @TwoArray;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  M: TMyArr;
begin
  getConst(1, M);
  caption:= InTToStr(High(M)); //Возвращает 24, а должно 2
end;

end.
  

Автор: AriX 26.5.2006, 16:59
Нужно установить длину для M массива:
Код

procedure TForm1.getConst(Index:Integer; var M: TMyArr );//какой установить тип для получения константы
begin
  case Index of    
    0: begin
      M := @OneArray;
      SetLength(M, Length(OneArray));
    end;
    1: begin
      M := @TwoArray;
      SetLength(M, Length(TwoArray));
    end;
  end;
end;
  

Автор: lucas 26.5.2006, 17:44
Всем большое спасибо. Вопрос полностью разрешен. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)