Главная страница
    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]

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



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

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

Наверх





Память: 0.59 MB
Время: 0.004 c
2-1309007537
Maxim-us
2011-06-25 17:12
2011.10.16
TChart style


2-1309061190
Gu
2011-06-26 08:06
2011.10.16
Не могу удалить ключ реестра


15-1308555247
DiamondShark
2011-06-20 11:34
2011.10.16
А вы в компьютерах разбираетесь?


1-1269075838
O.O
2010-03-20 12:03
2011.10.16
Масштабирование формы


15-1308767885
alexdn
2011-06-22 22:38
2011.10.16
Шаблон для ms sql





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