Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблемма с динамическим созданием структур

10K
06 ноября 2007 года
Archy_74
51 / / 13.12.2006
Собственно объявлены структуры
Код:
struct CRow
{
  int   LastIndex;
  int   NextIndex;
  int   Height;
};

struct CColumn
{

  int   LastIndex;
  int   NextIndex;
  int   Width;
};

И есть класс

 
Код:
class CTable
{
public:
        struct CRow          *Row[];
        struct CColumn       *Column[];

        CTable(int ColumnIndex=1,int RowIndex=1);
        int ColSpan(int Index, int Quantity);
        int RowSpan(int Index, int Quantity);
};

в конструкторе пытаюсь динамически создать эти две структуры

Код:
CTable::CTable(int ColumnQuantity,int RowQuantity)
{
int i;
for(i=0;i<ColumnQuantity;i++)
   {
        Column = new CColumn;
        Column->Width = 60;
        Column->LastIndex = i-1;
        Column->NextIndex = i+1;
        if(Column->LastIndex<0)
                Column->LastIndex = 0;
        if(Column->NextIndex>=ColumnQuantity)
                Column->NextIndex = ColumnQuantity;
   }

for(i=0;i<RowQuantity;i++)
   {
        Row = new CRow;
        Row->Height = 30;
        Row->LastIndex = i-1;
        Row->NextIndex = i+1;
        if(Row->LastIndex<0)
                Row->LastIndex = 0;
        if(Row->NextIndex>=RowQuantity)
                Row->NextIndex = RowQuantity;
   }
}

проблемма в том что указатели Row и Column одинаковы. Т.е. меняя параметр структуры Column в конструкторе, меняется и параметр в структуре Row и наоборот. Таким образом все, что присвоено для структуры Column попросту теряется. помогите плз :)
3
06 ноября 2007 года
Green
4.8K / / 20.01.2000
Это какой ЯП ?
10K
06 ноября 2007 года
Archy_74
51 / / 13.12.2006
ЯП С++
3
06 ноября 2007 года
Green
4.8K / / 20.01.2000
Тогда, не ясна вот такая запись:
 
Код:
struct CRow          *Row[];
        struct CColumn       *Column[];

такого не может быть в C++
И что значит: "проблемма в том что указатели Row и Column одинаковы" ?
350
06 ноября 2007 года
cheburator
589 / / 01.06.2006
Visual C++ 2005 ругается на этот код:
warning C4200: nonstandard extension used : zero-sized array in struct/union
И он абсолютно прав - в приведенном коде объявлены не указатели Row и Column, как утверждает автор, а массивы указателей; причем компилятор должен знать размер массива на этапе компиляции, а он не указан - значит, массив нулевого размера.
Нужно либо указать размер массива (если он фиксированный), либо применить какой-либо контейнер, либо объявить члены Column и Row просто указателями.
Вариант 1: контейнеры.
Код:
#include <vector>

...

class CTable
{
public:
    std::vector<CRow*>  Row;
    std::vector<CColumn*>   Column;
// Далее по тексту
};

CTable::CTable (int ColumnQuantity, int RowQuantity)
:Row ((size_t)RowQuantity), Column ((size_t)ColumnQuantity)
{
// Далее по тексту
};


Вариант 2: фиксированный массив
 
Код:
#define MAX_ROW_COUNT 10
#define MAX_COLUMN_COUNT 15
class CTable
{
public:
        struct CRow          *Row[MAX_ROW_COUNT];
        struct CColumn       *Column[MAX_COLUMN_COUNT];
// Далее по тексту

В таком варианте нельзя создать более 10 строк и более 15 колонок.

Вариант 3: просто указатель
Код:
class CTable
{
public:
        struct CRow           **Row;
        struct CColumn       **Column;
// Далее по тексту
}

CTable::CTable (int ColumnQuantity, int RowQuantity)
:Row (new CRow* [RowQuantity]), Column (new CColumn* [ColumnQuantity])
{
// Далее по тексту
}
350
06 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Green

И что значит: "проблемма в том что указатели Row и Column одинаковы" ?


Видимо, компилятор автора допускает массивы нулевого размера, поэтому члены Row и Column занимают ноль байт, к тому же находятся по одному адресу :)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог