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

Вниз

динамический массив начинается 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]

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


 
sniknik ©   (2011-06-23 19:34) [41]

> Ну, стук в подвале мне обсуждать не интересно.
зато ляпнуть что-то глубокомысленное, бездоказательно, видимо очень интересно...

p.s. на VBscript проверил, также с 1-цы.


 
sniknik ©   (2011-06-23 19:37) [42]

p.p.s.
http://msdn.microsoft.com/ru-ru/library/05e63829%28v=vs.90%29.aspx
пример
VS
" Creates text string.
Dim TestString As String = "Mid Function Demo"
" Returns "Mid".
Dim FirstWord As String = Mid(TestString, 1, 3)
" Returns "Demo".
Dim LastWord As String = Mid(TestString, 14, 4)
" Returns "Function Demo".
Dim MidWords As String = Mid(TestString, 5)


 
Игорь Шевченко ©   (2011-06-23 20:42) [43]

sniknik ©   (23.06.11 19:37) [42]

читай и просветляйся:

http://msdn.microsoft.com/ru-ru/library/ms233801(v=vs.90).aspx


 
sniknik ©   (2011-06-23 22:19) [44]

> читай и просветляйся:
мы уже перескочили на .NET Framework?
по ссылке "просвещают" что в VB c 1... и это хорошо, а в ... и т.д с 0, и это тоже хорошо...

и что я должен оттуда вынести? все так как говорил. и то, что в других по другому, и в каких нибудь других версиях может быть тоже по другому не отрицал. но VB то с 1-ци!

если намек на функцию Split которая там тоже описана (и есть волшебные слова с нулем), то обрати внимание что там с нуля начинается массив слов на который разбивается строка, а не индекс в строке, позиция в самой строке там не задается.

а тому кто "ляпнул" в [27] позволяешь прозябать в неведении? :) нда, дельфимастер...


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


> и что я должен оттуда вынести?


"Visual Basic введет индексацию либо с нуля, либо с единицы, в зависимости от функции"


 
sniknik ©   (2011-06-23 23:10) [46]

то что с 0 это про .NET Framework внимания не обращать?


 
sniknik ©   (2011-06-23 23:12) [47]

кстати а вот в D8 как? не приходилось сталкиваться. или Борланд "разрулил"?


 
Плохиш ©   (2011-06-24 00:55) [48]


> sniknik ©   (23.06.11 19:34) [41]

Я как-то совсем недавно брал первый символ из свойства text в tedit, был неприятно удивл&#235;н.
Интересно, много используется vb который не .net?
Вобщем-то, перед тем как что-то "ляпнуть" мне просматривать все языки, имеющие в сво&#235;м названии буквы vb, и параметры функций как-то лень...


 
sniknik ©   (2011-06-24 01:38) [49]

> Интересно, много используется vb который не .net?
любой макрос в офисе/акцесс/ворд/pp/...(а значит и OO, т.к. есть поддержка документов ms где могут быть вставки), тот же jet (access), в вебе скрипты аналог явы, в mssql (olap/обьекты весь на нем)... в общем, думаю, много больше чем который .net.
... в мелкософте же не дураки чтобы все "под нож в угоду новым, пусть своим, веяниям" это они другим оставляют, а сами ничего не переписывают без нужды.

> мне просматривать все языки
можно просто молчать когда не знаешь точно, или добавлять что это твое "имхо" (это что-то типа той части, которую ты в моем посте обрезал -> "скажем так, у многих, и обычно начинается с 0." так, что  получилось, что это я что-то "ляпнул" а ты меня "одернул"/опроверг)


 
Германн ©   (2011-06-24 01:39) [50]


> Интересно, много используется vb который не .net?

По моим очучениям после многочисленных общений со спецами московского представительства бэкхофа, VB (который не .net) забыт всеми, кроме авторов старых учебников и/или примеров.
Это только моё имхо. Сейчас в практике либо бесплатная версия типа VB Express, либо VBA.
Но и sniknik прав! А если АП ещё подключится к этому обсуждению, то получим флэйм, который  либо удалят/закроют обсуждение, либо сначала перенесут в "Прочее", а уж потом...


 
Германн ©   (2011-06-24 01:47) [51]


> Palladin ©   (23.06.11 10:28) [26]
>
> то что string начинается с 1 - не вызывает никаких дискомфортов,
>  у тех кто достаточно долго работает с паскалем

Тип String всегда начинался с нуля. Это все хорошо знали и в Паскале, и в Д1, и позже. Только смысл St[0] менялся.


 
han_malign   (2011-06-24 10:50) [52]


> Интересно, много используется vb который не .net?

- да какая хрен разница?

вот вам - чистый и не замутненный - и VB, и .net(и даже в некоторых случаях JS) массив:
vb_rgi = VarArrayCreate([1,N]; varInteger);
а дальше... - хоть:
 vb_rgi[1]
хоть:
 PIntegerArray(VarArrayLock(vb_rgi))[0]...; VarArrayUnlock(vb_rgi);

Опять надо разницу между индексом и смещением объяснять???


 
Anatoly Podgoretsky ©   (2011-06-24 10:56) [53]

> Германн  (24.06.2011 01:47:51)  [51]

Это знали ламеры, а остальные, что с 1, а по смещению 0 находилась не
строка, а ее управляющая структура, поэтому переход на Ansi был безболезенен


 
Плохиш ©   (2011-06-24 12:40) [54]


> sniknik ©   (24.06.11 01:38) [49]
> получилось, что это я что-то "ляпнул" а ты меня "одернул"/опроверг

Извини, даже в мыслях не было :-)
Просто уточнил, т.к. свежи были воспоминания о потерянных 20 минутах.



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

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

Наверх





Память: 0.62 MB
Время: 0.004 c
2-1309050691
Drowsy
2011-06-26 05:11
2011.10.16
Перехват исключения при создании формы.


15-1308856161
George
2011-06-23 23:09
2011.10.16
Программисты шутят


2-1308977278
Kolobok
2011-06-25 08:47
2011.10.16
Разварот узла.


3-1264534891
crank
2010-01-26 22:41
2011.10.16
Добавление данных и шифрование базы


2-1308783149
Германн
2011-06-23 02:52
2011.10.16
Ошибка при удалении контролов





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский