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

Поиск:

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


Unregistered











Помогите, плиз! Мне необходимо создать друмерный димнамический exclamation.gif массив на С++.
  Вверх
<Spawn>
Дата 23.11.2003, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Вот на Билдере:

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 int* iarray[10][10];
 for (int i = 0; i < 10; i++)
   for (int j = 0; j < 10; j++)
     iarray[i][j] = new int;
 *iarray[1][0] = 100;
 ShowMessage(IntToStr(*iarray[1][0]));
}



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Waters
Дата 23.11.2003, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



2 <Spawn>
Динамический массив позволяет программно менять размеры.

2 Гость_Djnv
Топик негодится.

Код

template<class T>
class matrixd // она же двумерный массив
{
 T *base; int row_count, col_count;
 int linear_idx(int row, int col) const
   { return (row * get_col_count() + col); }
 bool is_valid_idx(int row, int col) const
   {
     if(row >= get_row_count()) //out of bounds
       return false;
     if(col >= get_col_count())
       return false;
     return true;
   }
 void assign_(const matrixd &r);
 void free(void)
   { resize(0, 0); }
 static T access_error;
public:
 matrixd(void)
   : base(NULL), row_count(0), col_count(0) { }
 explicit matrixd(const matrixd &r)
   : base(NULL), row_count(0), col_count(0) { assign_(r); }
 const matrixd& operator=(const matrixd &r)
   { assign_(r); return *this; }
 virtual ~matrixd(void) { free(); }

 int get_row_count(void) const
   { return row_count; }
 int get_col_count(void) const
   { return col_count; }
 int get_count(void) const
   { return (row_count * col_count); }

 void resize(int row_count, int col_count);
 T& operator()(int row, int col)
   {
     if(!is_valid_idx(row, col))
       return access_error;
     return base[linear_idx(row, col)];
   }
 const T& operator()(int row, int col) const
   {
     if(!is_valid_idx(row, col))
       return access_error;
     return base[linear_idx(row, col)];
   }

};

template<class T>
T matrixd<T>::access_error;

template<class T>
void matrixd<T>::assign_(const matrixd &r)
{
 resize(r.get_row_count(), r.get_col_count());
 int c=get_count();
 for(int i=0; i<c; ++i)
   base[i] = r.base[i];
}

template<class T>
void matrixd<T>::resize(int new_row_count, int new_col_count)
{
 int count = row_count*col_count;
 int new_count = new_row_count*new_col_count;
 if(count != new_count)
 {
   if(count != 0)
   {
     delete[] base; // free
     base = NULL;
     row_count = 0;
     col_count = 0;
   }
   if(new_count != 0)
   {
     count = new_count;
     base = new T[count]; // allocate
     row_count = new_row_count;
     col_count = new_col_count;
   }
 }
}

// использование
{
 matrixd<float> m;
 m.resize(10, 20);

 m(2,2)=1.2345;
//...
}



wbr.
PM MAIL   Вверх
<Spawn>
Дата 23.11.2003, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


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

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



Waters Да, перепутал, просто не привык еще к Си.


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Ars
Дата 24.11.2003, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
2 <Spawn>
Динамический массив позволяет программно менять размеры.

А как же массивы, созданные динамически (в отличии от статических)?
Код
int **Array=new int*[DimY];
for(int i=0;i<DimY;i++) Array[i]=new int[DimX];
Array[10][10]=10;



--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
math_beginer
Дата 24.11.2003, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если массив большой и/или формируется несколько раз (напр. в цикле) после использования освобождаем память:
Код

for (int i=0;i<DimY;i++)
delete Array[i];
delete array;


Это сообщение отредактировал(а) math_beginer - 24.11.2003, 14:09
--------------------
Метод "Кнута и Пряника" - алгоритм, описанный в известной монографии Кнута и позднее модифицированный русским программистом Пряником.
PM MAIL   Вверх
Nastya
Дата 24.11.2003, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



В FAQ по С++ есть несколько красивых решений проблемы


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Waters
Дата 24.11.2003, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Цитата

Динамический массив позволяет программно менять размеры.

А как же массивы, созданные динамически (в отличии от статических)?

Вы правы, "динамический" значит не совсем то, что я написал.

P.S.
В моем посте есть ошибки. (куда без них)
Вот исправленный метод resize()
Код

template<class T>
void matrixd<T>::resize(int new_row_count, int new_col_count)
{
 int count=row_count*col_count;
 int new_count=new_row_count*new_col_count;
 if(count != new_count)
 {
   if(count != 0)
   {
     delete[] base;
     base=NULL;
     row_count=0;
     col_count=0;
   }
   if(new_count != 0)
     base=new T[new_count];
 }
 row_count=new_row_count;
 col_count=new_col_count;
}


wbr.

Это сообщение отредактировал(а) Waters - 24.11.2003, 19:17
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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