Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.10.16;
Скачать: CL | DM;

Вниз

динамический массив начинается 1 элемента   Найти похожие ветки 

 
Тимофей Ю.   (2011-06-22 19:35) [0]

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


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


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


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


 
Anatoly Podgoretsky ©   (2011-06-22 20:10) [2]

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

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


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

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


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

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


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


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


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

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


 
Leon-Z ©   (2011-06-22 20:41) [6]

МОЖНО !!!!

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.


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


 
sniknik ©   (2011-06-22 21:02) [7]

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

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


 
Leon-Z ©   (2011-06-22 21:06) [8]


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

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


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

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


 
Leon-Z ©   (2011-06-22 21:31) [10]


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

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


 
Loginov Dmitry ©   (2011-06-22 21:39) [11]


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


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


 
sniknik ©   (2011-06-22 21:55) [12]

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

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

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


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

www.delphilamer.ru


 
Leon-Z ©   (2011-06-22 22:10) [14]


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

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


 
sniknik ©   (2011-06-22 22:58) [15]

> Но мое решение более элегантное
ну, что сказать... разные у нас понятия об элегантности... ты кстати с громоздкостью не путаешь?

program DynMass;

{$APPTYPE CONSOLE}

uses
 SysUtils;

const
 MAX_LEN = 10;
var
 Mass: array of integer;
 i: integer;
begin
 SetLength(Mass, MAX_LEN + 1);
 for i:= 1 to MAX_LEN do
   Mass[i]:= i;

 for i:= 1 to MAX_LEN do
   WriteLn(Mass[i]);

 ReadLn;
end.


 
Anatoly Podgoretsky ©   (2011-06-22 23:17) [16]

> Игорь Шевченко  (22.06.2011 22:03:13)  [13]

В дауне


 
Rouse_ ©   (2011-06-23 00:33) [17]


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

Чем именно не удобно?


 
Юрий Зотов ©   (2011-06-23 00:48) [18]


> Тимофей Ю.   (22.06.11 19:35)  
> очень не удобно что у массива созданного динамически,
> первый элемент начинается с 0

Просто непривычно. А на самом деле очень удобно, надо только привыкнуть.


 
KilkennyCat ©   (2011-06-23 01:21) [19]

не работали вы с массивами в ActionScript... вот там охреневаешь после делфи.


 
Полвторого   (2011-06-23 02:22) [20]

А, кстати, чем не устраивает вот такой подход:

program dynarr;
{$R-}

type
 arr = array [1..1] of longint;

var
 N, I: integer;
 A: ^arr;

begin
 read(N);
 getmem(A, N*sizeof(longint));

 for I := 1 to N do A^[I] := 1; // что-то делаем с массивом

 freemem(A);
end.


Правда, сложновато будет инициализировать и освобождать многомерные массивы, но о них речь вроде как и не шла.


 
Германн ©   (2011-06-23 02:38) [21]


> А, кстати, чем не устраивает вот такой подход:

Современную "молодеж" не устраивают методы прошлого века. :)
Они их просто не знают. Они вообще почти ничего не знают о способах работы с динамически выделяемой памятью.


 
Anatoly Podgoretsky ©   (2011-06-23 09:17) [22]

> Rouse_  (23.06.2011 00:33:17)  [17]

Классики обяснили на примере, сам Вирт

Array [1900..2000] of Integer
и
Array [0..100] of Integer
Это постоянное приведение 0 к 1900 и обратно


 
Очень злой   (2011-06-23 09:20) [23]


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


Ну так используй его, как будто первый элемент начинается с индекса 1.
Потерями памяти на неиспользуемый элемент с индексом 0 думаю можно пренебречь...


 
Anatoly Podgoretsky ©   (2011-06-23 09:20) [24]

> Полвторого  (23.06.2011 02:22:20)  [20]

Не надо нам вражеских методов, привнесеных с СИ [1..1].
Этим много вреда нанесли.
Вирт создавал язык как учебный, а не как средство издевательства.


 
Омлет ©   (2011-06-23 09:38) [25]

Вот string начинается с 1 - это вызывает дискомфорт.
Тут, видимо, обратная проблема )


 
Palladin ©   (2011-06-23 10:28) [26]

то что string начинается с 1 - не вызывает никаких дискомфортов, у тех кто достаточно долго работает с паскалем


 
Плохиш ©   (2011-06-23 11:24) [27]


> sniknik ©   (22.06.11 21:55) [12]
> > Нумерация массива с нуля является общепринятым и наиболее
> удобным способом нумерации.
> а строки? а если нужно "совмещать"? пусть лучше с неправильной
> нумерацией и лишним элементом но я при нужде, пройдусь по
> ним за 1 цикл, и без всяких вычислений индексов, усложнении
> кода.
>
> но в общем да, счет у программистов начинается с 0 (команда
> на первый второй расчитайсь ставит в тупик...). если не
> считать 1С-ников, и Base-ников(?) как те кто на VB пишут
> называются?

В VB строки с 0 начинаются.


 
Leon-Z ©   (2011-06-23 15:25) [28]


> sniknik ©   (22.06.11 22:58) [15]

А где освобождение памяти, выделенной под массив ?
Вот такие методы и порождают тупые ошибки.


 
sniknik ©   (2011-06-23 15:35) [29]

> А где освобождение памяти, выделенной под массив ?
end.


 
sniknik ©   (2011-06-23 15:36) [30]

> Вот такие методы и порождают тупые ошибки.
http://delphimaster.net/view/1-1307429189/


 
Ega23 ©   (2011-06-23 16:27) [31]


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


Это общепринятая практика. Индексация всех массивов, списков и т.п. начинается с нуля и идёт до "количество элементов минус один".
Единственное исключение, которое очень сильно напрягло и реально вывихнуло мне мозг - это то, что в TTreeView.StateImages нумерация реально начиналась с единицы. Точнее, в TTreeNode.StateIndex надо было писать что-то, большее нуля. Тогда картинка отображалась. А в StateImages приходилось добавлять первым пустую картинку.


 
SQLEXPRESS   (2011-06-23 16:38) [32]

а с 0 все это просто объясняется и логично, если думать так:
A: array of type;
первый элемент лежит по адресу А + 0 байт сместиться надо.  A[0]
второй A + размер элемента, т.е. А + 1. A[1]

меня ms excel и word убивает - у них с 1 почти все.
иногда, написав процедурку, вдруг на секунду порываешься "исправить" ошибку..


 
Игорь Шевченко ©   (2011-06-23 16:51) [33]


> Это общепринятая практика. Индексация всех массивов, списков
> и т.п. начинается с нуля и идёт до "количество элементов
> минус один".


еще один сказочник.
Фортран учить до полного и окончательного просветления!


 
sniknik ©   (2011-06-23 17:18) [34]

> В VB строки с 0 начинаются.
ну, на самом VB не пишу, но Jet поддерживает функции VB, т.что сужу по нему...
-
SELECT *, Mid(Name, 1, 1) AS Ch FROM [Action]
дает столбец с 1 буквой имени (строка, VarChar(50))
а SELECT *, Mid(Name, 0, 1) AS Ch FROM [Action]
дает
EOleException : Поставщик данных или другая служба вернули состояние E_FAIL

после проверяю блоб
SELECT *,Mid(RResp, 1, 1) FROM Resp WHERE ID = 2
< (там xml)
SELECT *,Mid(RResp, 0, 1) FROM Resp WHERE ID = 2
... ну, вы поняли

делаю вывод, что все таки с 1-цы. (и вряд ли меня кто переубедит просто сказав "нет с 0-я!")


 
Ega23 ©   (2011-06-23 17:36) [35]


> еще один сказочник.
> Фортран учить до полного и окончательного просветления!


Игорь, вот скажи мне, сколько строк кода за последние 10 лет ты написал на фортране? А сколько на С, С++, Delphi и т.п.?


 
Плохиш ©   (2011-06-23 17:44) [36]


> > В VB строки с 0 начинаются.
> ну, на самом VB не пишу, но Jet поддерживает функции VB,
>  т.что сужу по нему...
>

Ну, стук в подвале мне обсуждать не интересно.


 
Игорь Шевченко ©   (2011-06-23 17:48) [37]

Ega23 ©   (23.06.11 17:36) [35]

На паскале и на PL/SQL, в которых символы строки нумеруются с 1, и на С, в котором они же, но с нуля, я за последние 10 лет написал дофига строк. Но причем тут это ?

вот что по этому поводу думают маститые:
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html


 
Игорь Шевченко ©   (2011-06-23 17:49) [38]

и еще на ту же тему:
http://forum.oberoncore.ru/viewtopic.php?f=35&t=2595


 
han_malign   (2011-06-23 17:56) [39]

VarArrayCreate([1,N]; varInteger)
- и попутного ветра в вашу горбатую спину...


 
Anatoly Podgoretsky ©   (2011-06-23 19:16) [40]

> SQLEXPRESS  (23.06.2011 16:38:32)  [32]

Микрософты мыслят человечески



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

Текущий архив: 2011.10.16;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.007 c
1-1268905449
istok
2010-03-18 12:44
2011.10.16
миграция функции на D2010...


2-1308838892
eXAAAXe
2011-06-23 18:21
2011.10.16
Соотношение сторон.


15-1308725956
SQLEXPRESS
2011-06-22 10:59
2011.10.16
декомпилировать приложение C#


1-1269026411
Zoom
2010-03-19 22:20
2011.10.16
размер массива через указатель


15-1308930395
Оверклокер
2011-06-24 19:46
2011.10.16
А какой у вас куллер стоит?