Форум: "Начинающим";
Текущий архив: 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