![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамический массив начинается 1 элемента
Тимофей Ю. © (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
Очень неудобно на праворульном тарантасе рассекать по дорогам с правосторонним движением.
Нельзя ли переделать мою праворульную шайтан-арбу в леворульную ?