Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

динамический массив начинается 1 элемента


Страницы:   1 2 3

Тимофей Ю. ©   (2011-06-22 19:35:00) 

всем привет, использую динамические массивы и очень не удобно что у массива созданного динамически, первый элемент начинается с 0,
можно ли создать динамический массив чтобы первый элемент начинался с 1 ?
чтото типо mass:array[1..10] of integer; ?? только для динамического


Leon-Z   (2011-06-22 22:10:00) [41]


> sniknik ©   (22.06.11 21:55) [12]

Столько критики.
Но мое решение более элегантное, чем массив в котором + 1 элемент.


Игорь Шевченко   (2011-06-22 22:03:00) [42]

www.delphilamer.ru


sniknik   (2011-06-22 21:55:00) [43]

> Так зачем лишний раз CPU напрягать ?
вах, и это я слышу от автора вышележащего кода... :)
в for-е "напряг" будет разовый, а у тебя на каждый элемент вычисление.
+ код займет куда больше чем 4 байта под "лишний" элемент.

> Нумерация массива с нуля является общепринятым и наиболее удобным способом нумерации.
а строки? а если нужно "совмещать"? пусть лучше с неправильной нумерацией и лишним элементом но я при нужде, пройдусь по ним за 1 цикл, и без всяких вычислений индексов, усложнении кода.

но в общем да, счет у программистов начинается с 0 (команда на первый второй расчитайсь ставит в тупик...). если не считать 1С-ников, и Base-ников(?) как те кто на VB пишут называются? ну и наверное каких нибудь "скриптовых" программистов. скажем так, у многих, и обычно начинается с 0.


Loginov Dmitry   (2011-06-22 21:39:00) [44]


> можно ли создать динамический массив чтобы первый элемент
> начинался с 1 ?


Нумерация массива с нуля является общепринятым и наиболее удобным способом нумерации. Это с точки зрения программиста. А вот с точки зрения пользователя, который использует вашу программу (готовую), такой подход неприемлем, нумерация с нуля для него - нонсенс, нужна индексация с единицы. Решайте, являетесь ли Вы программистом или пользователем.


Leon-Z   (2011-06-22 21:31:00) [45]


> Тимофей Ю.   (22.06.11 21:26) [9]

Надеюсь в коде разберешься :)  ???


Тимофей Ю.   (2011-06-22 21:26:00) [46]

Leon-Z, вау, как оперативно! Благодарю:)
Сергей М., да не то чтобы напрягает, ведь справлялся както)) не особо удобно для моей задачи, вот и все:)
sniknik, когда много операций с этим массивом порой забывается что с нуля, а не с 1.


Leon-Z   (2011-06-22 21:06:00) [47]


> sniknik ©   (22.06.11 21:02) [7]
> правильно не с 0 а с Low до High

Это правильно когда не знаешь размерности массива.
А здесь ее сам задаешь и в любой момент она извесна.
Так зачем лишний раз CPU напрягать ?


sniknik   (2011-06-22 21:02:00) [48]

> Вот так :)))))
ужас то какой... нет чтобы просто выделить на элемент больше и игнорировать 0-й.

хотя на самом деле правильно не с 0 а с Low до High


Leon-Z   (2011-06-22 20:41:00) [49]

МОЖНО !!!!

program DynMass;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 TIntegerDynMassType = array of Integer;

 TIntegerDynMass = class
 private
   FMass: TIntegerDynMassType;
   FMassSize: Integer;
   function GetMassElem(const AIndex: Integer): Integer;
   procedure SetMassElem(const AIndex, AValue: Integer);
 public
   constructor CreateIt(AMassSize: Integer);
   destructor Destroy; override;
   property Mass[const AIndex: Integer]: Integer read GetMassElem write SetMassElem; default;
 end;

constructor TIntegerDynMass.CreateIt(AMassSize: Integer);
begin
 inherited Create;
 SetLength(FMass, AMassSize);
 FMassSize := AMassSize;
end;

destructor TIntegerDynMass.Destroy;
begin
 SetLength(FMass, 0);
 inherited Destroy;
end;

function TIntegerDynMass.GetMassElem(const AIndex: Integer): Integer;
begin
 Result := 0;
 if (AIndex >= 1) and (AIndex <= FMassSize) then
   Result := FMass[AIndex - 1];
end;

procedure TIntegerDynMass.SetMassElem(const AIndex, AValue: Integer);
begin
 if (AIndex >= 1) and (AIndex <= FMassSize) then
   FMass[AIndex - 1] := AValue;
// при этом для массива из 10 элементов диапазон изменения
// индекса будет 1 - 10,
// а обращение будет к элементам с реальными инд. 0 - 9
end;

// пример использования класса
var
 IntDynMass: TIntegerDynMass;
 i: Integer;
begin
 IntDynMass := TIntegerDynMass.CreateIt(10);
 for i := 1 to 10 do
   IntDynMass.Mass[i] := i;
 for i := 1 to 10 do
   WriteLn(IntDynMass[i]);
// IntDynMass.Mass[i] == IntDynMass[i] т.к. property Mass - объявленно как default
 ReadLn;
 IntDynMass.Free; // Free - внутри вызывает Destroy
end.


Вот так :)))))


Сергей М.   (2011-06-22 20:37:00) [50]


> необычные, но классные ощущения


Ну дык а чем с т.з. "классных ощущений" отличается дин.массив с его индексацией с нуля ?)

Тебя это напрягает ? Расслабься и получи удовольствие !)


Тимофей Ю.   (2011-06-22 20:19:00) [51]

Anatoly Podgoretsky, спасибо вам, так и сделаю!


Тимофей Ю.   (2011-06-22 20:18:00) [52]

Сочувствую что нет возможности рассекать на праворульном тарантасе по дорогам с правосторонним движением - довольно таки необычные, но классные ощущения:)


Anatoly Podgoretsky   (2011-06-22 20:10:00) [53]

> Тимофей Ю.  (22.06.2011 19:35:00)  [0]

Напиши класс и свойство типа массив


Сергей М.   (2011-06-22 19:46:00) [54]


> очень не удобно что у массива созданного динамически, первый
> элемент начинается с 0


Очень неудобно на праворульном тарантасе рассекать по дорогам с правосторонним движением.
Нельзя ли переделать мою праворульную шайтан-арбу в леворульную ?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо