Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Массивы, Отрицательные индексы 
:(
    Опции темы
ShadeSt
Дата 16.11.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Delphi позволяет объявить массив, элементы которого имеют отрицательные индексы:
Код

procedure TForm1.ButtonClick(Sender: TObject);
Var
 A : array[-5..5] of Integer;
 I : Integer;
begin
 for I := Low(A) to High(A) do
   A[I] := I;
...............
 for I := Low(A) to High(A) do
   memo.Lines.Add(IntToStr(A[I]));
end;



Хочется услышать Ваше мнение о таком способе объявления массивов, пользуетесь ли Вы этой возможностью.
Насколько я знаю для большинства задач достаточно иметь массив с положительными индексами, по крайней мере для тех, с которыми я сталкивался.



--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Snowy
Дата 16.11.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Вообще массивы редко использую.
А уж тем более с отрицательными индексами smile
Индекс вообще редко когда должен нести информацию.
Его основное назначение - порядковый номер элемента, отличный от других элементов.
Что-то вроде UniqueID. А какой он - по барабану. 0..N - стандартное нормальное решение для этого.
PM MAIL   Вверх
Sunvas
Дата 16.11.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(ShadeSt @  16.11.2006,  13:14 Найти цитируемый пост)
Ваше мнение

Мое мнение таково: если кому-то мал массив
Код

var a:array[0..1000000000] of integer;


То надо использовать
Код

var a:array[-1000000000..1000000000] of integer;
  smile 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
ShadeSt
Дата 16.11.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



понятно.
проблема не в том, что он мал, а в том, что:
был набор описаний элементов, начинающийся в нуля, описания были в массиве, для каждого из них была константа индекса, примерно так:
Код

const 
  cvino  = 0;
  cpivo  = 1;
  cvodka = 2;
  Name : array [0 .. 2] of string = ('Вино', 'Пиво', 'Водка');

Потом встал вопрос, как наиболее верно, с наименьшими изменениями добавить туда
еще один пункт, учитывая что данный список может расти "вперед", а пунктик(пусть будет "алкоголь") надо добавить с уникальным индексом.
сначала было решение добавить его с нулевым индексом, а константы сместить, но при данном подходе приходилось бы править все обращения к массиву и делать там смещение.
или как вариант добавить его с бОльшим индексом, тогда, либо пришлось бы его двигать, либо если индекс был бы = 999, то большая часть массива бы просто висела без использования.
вобщем так я нарвался на то, что можно делать отрицательные индексы.


Цитата(Snowy @  16.11.2006,  13:20 Найти цитируемый пост)
Индекс вообще редко когда должен нести информацию.Его основное назначение - порядковый номер элемента, отличный от других элементов.Что-то вроде UniqueID. А какой он - по барабану. 0..N - стандартное нормальное решение для этого.

это понятно, просто по логике программы использование отрицательного индекса оказалось наиболее быстрым и "безболезненным" решением для остального кода.
Поэтому и возник вопрос "на сколько красиво" поступать таким образом.
Если не рекомендуется - то я перепишу все структуры и соответственно переделаю  логику; а если так можно поступать - то пусть останется (просто это оказалось наиболее "красивым" вариантом)



--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Sunvas
Дата 16.11.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



А как тогда задать минусовые индексы динамическим массивам?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Snowy
Дата 16.11.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Не нужно привязывать данные к выводу.
Данные и вывод должны быть сами по себе.
Например, хранить данные в TStringList, а для вывода создавать другой стринглист, сортировать и выводить.
PM MAIL   Вверх
Yanis
Дата 16.11.2006, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Sunvas @  16.11.2006,  18:37 Найти цитируемый пост)
А как тогда задать минусовые индексы динамическим массивам? 

Этого делать нельзя.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Bose
Дата 16.11.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



ShadeSt, в твоём случае было бы лучше сделать класс контейнер с публичным индексированным свойством DrinkName, который и выдвал бы данные по нужному индексу. Тогда чтобы добавить вот такой вот уникальный индекс, достаточно было бы изменить метод GetDrinkName.

Небольшой пример:

Код

TDrinkList=class
  protected 
    function GetDrinkName(aDrinkIndex:integer): string;
  public
     property DrinkName[aDrinkIndex:integer]:string read GetDrinkName;
  end;


Это сообщение отредактировал(а) Bose - 16.11.2006, 21:42
PM MAIL WWW Skype   Вверх
ShadeSt
Дата 16.11.2006, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Цитата(Snowy @  16.11.2006,  17:50 Найти цитируемый пост)
Не нужно привязывать данные к выводу.

учту.

Цитата(Bose @  16.11.2006,  21:42 Найти цитируемый пост)
ShadeSt, в твоём случае было бы лучше сделать класс контейнер с публичным индексированным свойством DrinkName, который и выдвал бы данные по нужному индексу. Тогда чтобы добавить вот такой вот уникальный индекс, достаточно было бы изменить метод GetDrinkName.

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

но все же я видимо неудачно привел пример, в том массиве как раз только данные и содержатся, причем индексы массива соответствуют полю ID из некоторого импортируемого xml файлика определенной структуры. этот файлик формируется в др. программе и может меняться, т.е. как раз тот случай, когда может расти массив. Помимо импорта, есть случай, когда массив заполняется данными, полученными из БД.
И выбран был именно массив, по той причине, что с ним оказалось на удивление просто работать во всех кусках кода где это надо, и некоторые моменты, получилось даже упростить.

Был конечно вариант не вносить в массив еще один элемент с отрицательным индексом, но тогда немного усложняется код. Создавать список (TList, TStringList) тоже особо не получится, да и не кажется столь необходимым.

Я по мере развития темы, все таки дохожу до правильной формулировки вопроса smile видимо надо было написать так: "Является ли хорошим тоном программирования использование отрицательных индексов в массивах?"


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
Snowy
Дата 17.11.2006, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Нет, не является.
Это означает, что реализация плохо продумана.
Отделяй данные от сортировки.
Не нужно впихивать данные в странное место из-за того, что они не там по алфавиту.
Порядок не имеет значения.
Он имеет значение при отображении. А это не имеет отношения к хранению.
А, если у тебя потом появится запись, которую нужно воткнуть между 3 и 4? Что тогда? Создавать дробные элементы?
Выбрось это из головы.
Пусть идут в порядке добавления.
А как их показать - это уже другой вопрос. Причём более простой.
PM MAIL   Вверх
Nicholas_S
Дата 17.11.2006, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



ShadeSt, как-то давно был один прецендетн в использовании отрцательных индексов массива. Когда опыта было мало, советовался с профессионалами, они не разделяли мнения о том, что индекс должен быть отрицательным.
  Стандарт - индекс 0..n. Отрицательные индексы, как заметил Snowy, не есть хорошо. Использовать можешь, дабы язык позволяет, однако если для тебя программирование больше чем просто "абы было и работало", то начальный индекс - 0 (или на край - 1).


--------------------
...все в мире относительно
PM   Вверх
Guedda
Дата 17.11.2006, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Подрывник
****


Профиль
Группа: Завсегдатай
Сообщений: 3137
Регистрация: 27.12.2005
Где: Ростов-на-Дону

Репутация: 14
Всего: 78



Ну есть одна задумка, как можно исполбьзовать отрицательные индексы:
Допустим, надо построить график функции, точки абсциссы которой есть и отрицательные. И график надо построить от [-10;10]. График функции y = x^2 - 3;
В этом случае, как кстати, понядобятся отрицательные индексы:
Код

var
  i: Integer;
  y : array[-10..10] of Integer;
begin
  for i := -10 to 10 do 
    y[i] := i * i - 3;
  //и дальше делаем график.
end;



--------------------
Ll 2
PM MAIL WWW ICQ Skype GTalk   Вверх
ShadeSt
Дата 17.11.2006, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 256
Регистрация: 9.8.2005
Где: Россия, г. Ставро поль

Репутация: нет
Всего: 7



Цитата(Snowy @  17.11.2006,  00:46 Найти цитируемый пост)
Нет, не является.


Цитата(Nicholas_S @  17.11.2006,  01:59 Найти цитируемый пост)
Стандарт - индекс 0..n. Отрицательные индексы, как заметил Snowy, не есть хорошо.


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



Цитата(Guedda @  17.11.2006,  07:58 Найти цитируемый пост)
Ну есть одна задумка, как можно исполбьзовать отрицательные индексы:

там можно ввести смещение на 10ть элементов и массив начать с нуля, просто придется учитывать смещение, но массив будет "нормальный".

Вобщем исходя из рассуждений я сделал вывод, что использование массивов с отрицательными индексами является злом и от него надо избавляться более детально продумывая реализацию.

Всем спасибо за участие!


--------------------
It's nice to be importand, but it's more importand to be nice © Scooter
PM MAIL ICQ Jabber   Вверх
bems
Дата 17.11.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Красивше будет так. И вставить можно куда огодно и что угодно
Код

type TDrink=(dPivo,
             dVino,
             dVodka);
var Name : array [TDrink] of string = ('Пиво',
                                       'Вино',
                                       'Водка');


Добавлено @ 09:09 
Цитата(ShadeSt @  17.11.2006,  08:45 Найти цитируемый пост)
там можно ввести смещение на 10ть элементов и массив начать с нуля, просто придется учитывать смещение, но массив будет "нормальный".
Смещение это лишнее. Код должен отражать задачу. Не знаю, стоит ли вообще использовать массив для графика, но если использовать - отрицательный индекс имхо здесь в тему.

Добавлено @ 09:19 
Цитата(ShadeSt @  17.11.2006,  08:45 Найти цитируемый пост)
но массив будет "нормальный".
не делай из этого цель. Это средство



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Nicholas_S
Дата 17.11.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 12.10.2006
Где: Санкт-Петербург

Репутация: 1
Всего: 19



Цитата

Смещение это лишнее. Код должен отражать задачу. Не знаю, стоит ли вообще использовать массив для графика, но если использовать - отрицательный индекс имхо здесь в тему.

Отриц. индекс не то чтобы в тему, таким образом задача становится нагляднее для человека. Но смещение - более "правильное" решение. К тому же, наверняка этот график придется масштабировать, перемещать и т.д., поэтому использование коэффициентов смещения/сжатия будет необходимым.


--------------------
...все в мире относительно
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0630 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.