Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Вниз

Универсальное объявление типа переменной.   Найти похожие ветки 

 
Начинающий_1   (2006-08-18 09:38) [0]

Допустим, есть следующие типы:
type
PArray2 = ^TArray2;
TArray2 = array[0..1] of integer;

PArray3 = ^TArray3;
TArray3 = array[0..2] of integer;

и функция:

function TestFunction(pArr: PArray2): integer;
var
i: integer;
begin
Result:=0;
for i:=Low(pArr) to High(pArr) do Result:=Result + pArr[i];
end;

Как бы сделать так, чтобы TestFunction могла принимать
в качестве параметра и PArray2 и PArray3 ?


 
zdm ©   (2006-08-18 09:42) [1]

в функции function TestFunction(pArr: PArray2): integer;
по моему по барабану само название "PArray2" кидай туда хоть qqq


 
Loginov Dmitry_   (2006-08-18 09:42) [2]


> Как бы сделать так, чтобы TestFunction могла принимать
> в качестве параметра и PArray2 и PArray3 ?


Тогда цикл  for i:=Low(pArr) to High(pArr)  работать не сможет.

Примерно следующее

function TestFunction(pArr: PIntegerArray, Size: Integer): integer;
var
  i: integer;
begin
  Result:=0;
  for i:=0 to Size - 1 do Result:=Result + pArr[i];
end;


 
clickmaker ©   (2006-08-18 09:44) [3]


> for i:=Low(pArr) to High(pArr)

у тебя это даже не скомпилится.
Представляешь себе, что такое указатель? И какой у него может быть Low и High?


 
zdm ©   (2006-08-18 09:46) [4]

я имею ввиду что при обращении к функции ты пишешь примерно следующее
begin
TestFunction(PArray2)
end;
или
begin
TestFunction(PArray3)
end;
что подставишь то и будет,,,,а в самой функции лучше так одназанчо не определять, что это PArray2, чтобы не заблуждаться,,, если я туплю не ругайтесь.


 
evvcom ©   (2006-08-18 10:38) [5]

См. как сделаны API-функции. Везде указатель и размер (как в [2]).


 
Сергей М. ©   (2006-08-18 10:46) [6]

IMHO, проблема высосана из пальца.
Если предполагается, что массивы будут отличаться только размерностью, то нет никакого резона заводить кучу деклараций таких массивов.

Достаточно объявить один-единственный массив

PMyArray = ^TMyArray;
TMyArray = array[0..0] of SomeType;

и в опциях компилятора отключить проверку контроля границ массива.


 
Elen ©   (2006-08-18 10:55) [7]


> Сергей М.

А не проще воспользоваться типом Variant? или array of integer


 
Сергей М. ©   (2006-08-18 11:01) [8]


> Elen ©   (18.08.06 10:55) [7]


Не только проще, но и желательно и удобно)

Впрочем, variant всем хорош только если в программе нет ограничений на применение типов данных с упр.временем жизни. В противном случае можно поизвращаться, например, вот так:


type
 PMyIntArray = ^TMyIntArray;
 TMyIntArray = array[0..0] of Integer;

 PMyDblArray = ^TMyDblArray;
 TMyDblArray = array[0..0] of Double;

 PMyStrArray = ^TMyStrArray;
 TMyStrArray = array[0..0] of String;

 PMyBoolArray = ^TMyBoolArray;
 TMyBoolArray = array[0..0] of Boolean;

 PArrayItem = pointer;

 function GetArrayItem(ItemType: Pointer; var MyArray; ItemIndex: Integer): PArrayItem;
 begin
   if ItemType = TypeInfo(Integer) then
     Result := @PMyIntArray(@MyArray)[ItemIndex]
   else if ItemType = TypeInfo(Double) then
     Result := @PMyDblArray(@MyArray)[ItemIndex]
   else if ItemType = TypeInfo(String) then
     Result := @PMyStrArray(@MyArray)[ItemIndex]
   else if ItemType = TypeInfo(Boolean) then
     Result := @PMyBoolArray(@MyArray)[ItemIndex]
 end;


Хотя иначе чем извращение это не назовешь)


 
Сергей М. ©   (2006-08-18 11:04) [9]

Это я для случая, если массивы различаются еще и типом элементов.
При этом  "изврат" работает лишь для стандартных базовых типов)


 
Начинающий_1   (2006-08-19 05:50) [10]

Так будет правильно ?
type
PArray1 = ^TArray1;
TArray1 = array[0..0] of Double;

PArray637 = ^TArray637;
TArray637 = array[0..636] of Double;

procedure Test(const ArrLen: Word; const pDist, pSour: Pointer);
var
i: integer;
begin
for i:=0 to ArrLen - 1 do PArray1(pDist)[i]:=PArray1(pSour)[i];
end;

procedure TMainForm.ToolButton21Click(Sender: TObject);
var
Dist, Sour : TArray637;
begin
Test(637, @Dist, @Sour);
end;


 
Elen ©   (2006-08-19 08:17) [11]

А может проще так :
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   ListBox1: TListBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
type
PArray1 = ^TArray1;
TArray1 = array[0..0] of Double;

PArray637 = ^TArray637;
TArray637 = array[0..636] of Double;
var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var Dist, Sour : TArray637;
begin
move (sour,dist,sizeof(double)*637);
end;

end.


P.S. Просьба жестоко не пинать


 
Начинающий_1   (2006-08-19 08:36) [12]

>Elen ©   (19.08.06 08:17) [11]
Неа. Не годится :))  CopyMemory тоже не годится. :)


 
Elen ©   (2006-08-19 08:42) [13]


> Начинающий_1

Почему?


 
Начинающий_1   (2006-08-19 09:00) [14]

Elen ©   (19.08.06 08:42) [13]
> Почему?
А вдруг я захочу изменить функцию Test так:
procedure Test(const ArrLen: Word; const pDist, pSour: Pointer);
var
i: integer;
begin
for i:=0 to ArrLen - 1 do
 if PArray1(pSour)[i] < pi
  then PArray1(pDist)[i]:=PArray1(pSour)[i]
  else PArray1(pDist)[i]:=47645;
end;



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.09.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
15-1155424712
Баер
2006-08-13 03:18
2006.09.10
Какой монитор(ы) купить на 600 долларов?


3-1151578931
Ak_vovan
2006-06-29 15:02
2006.09.10
Как очистить таблицу


3-1152081560
Konrads
2006-07-05 10:39
2006.09.10
Ошибка при попытке открыть базу Access


2-1155816088
fast2
2006-08-17 16:01
2006.09.10
Как сделать, чтоб при нажатии на Enter, не зависимо от того, где


3-1151855425
bva
2006-07-02 19:50
2006.09.10
AS 400





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский