Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Знатокам С++


Автор: Гость_Djnv 23.11.2003, 13:19
Помогите, плиз! Мне необходимо создать друмерный димнамический exclamation.gif массив на С++.

Автор: <Spawn> 23.11.2003, 13:42
Вот на Билдере:

Код

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]));
}

Автор: Waters 23.11.2003, 17:10
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.

Автор: <Spawn> 23.11.2003, 18:56
Waters Да, перепутал, просто не привык еще к Си.

Автор: Ars 24.11.2003, 11:07
Цитата
2 <Spawn>
Динамический массив позволяет программно менять размеры.

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

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

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

Автор: Nastya 24.11.2003, 14:37
В FAQ по С++ есть несколько красивых решений проблемы

Автор: Waters 24.11.2003, 19:04
Цитата

Цитата

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

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

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

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)