Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Границы для массива. 
:(
    Опции темы
GriKo
Дата 12.8.2003, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот например в ПАСКАЛе, при объявлении массива, можно задать как верхнюю так и нижнюю границы. Ну например:

Код

var asd:array[0..20] of integer;

{ili}

var asd:array[20..40] of integer;


Мне нужно тоже самое от С (указать нижнюю границу массива). Разве можно только написать размер массива?


PM MAIL ICQ   Вверх
RAN
Дата 12.8.2003, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Цитата
Разве можно только написать размер массива?

Да.
Но есть один способ использовать массивы как в паскале - написать свой класс с перегруженным оператором [] для такого массива.
PM MAIL ICQ   Вверх
GriKo
Дата 12.8.2003, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Source не подбросишь?

заранее благодарен
PM MAIL ICQ   Вверх
RAN
Дата 12.8.2003, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Ну, я вообще никогда эти не пользовался. Но могу набросать:
Код

template<class T>
class MyArray
{
private:
T* data;
int down;
public:
MyArray(int down, int up) {
 MyArray::down = down;
 data = new T[up - down + 1];
}

~MyArray() {
 delete data;
}

inline T& operator[](int index) {
 return data[index - down];
}
};

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

Пользоваться так:
- чтоб создать твой массив MyArray<int> asd(20, 40);
- доступ к элементам как обычно: asd[25] = 12; int x = asd[25];

PM MAIL ICQ   Вверх
GriKo
Дата 13.8.2003, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ПАСИБО
PM MAIL ICQ   Вверх
Step
Дата 13.8.2003, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



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


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Unregistered
Дата 14.8.2003, 00:59 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Код
typedef enum { i20=20,i21,i22,.....i40}clueless_e;

  Вверх
RAN
Дата 14.8.2003, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Можно пояснить, что имелось ввиду в последнем сообщении
PM MAIL ICQ   Вверх
DENNN
Дата 14.8.2003, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Наверное имелось в виду, что тогда код будет выглядеть так:
Код

typedef enum { i20=20,i21,i22,.....i40}clueless_e;
.....
int dm[]={1,2,3,4,5,6,7};
int first=dm[i20];
int second=dm[i21];
//и прочие извращения

Вообще-то весь вопрос из области извращенских, потому как не нумеруй первый элемент, хоть двадцатым, хоть сотым, физический он все равно будет первым в последовательности (сорри - нулевым smile.gif )
PM ICQ   Вверх
RAN
Дата 14.8.2003, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Ну, я так и понял, но только тогда в enum не надо i20 инициализировать двадцаткой, надо так: [I]enum { i20 = 0, /*для надёжности, хотя можно опустить*/i21, ..........}[I]

У этого способа лишь один плюс
- выражение dm[i20] раскрывается на этапе компиляции,

но, по-моему, по крайней мере два недостатка, делающие этот способ весьма не гибким:
- размерность массива должна быть известна при разработке проги (нельзя создавать динамические массивы)
- придётся делать новый enum для другого массива с другими размерами (придётся придумать новые имена или определять namespace'ы)
- а главное, если у меня в переменной i содержиться 20, то dm[i] даст совсем не то, что надо. Получается, что можно использовать только константы, а нафига тогда массив вообще.
PM MAIL ICQ   Вверх
DENNN
Дата 14.8.2003, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я же говорю - извращение, свойственное всем людям, начинающим изучать язык.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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