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);
};
{
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;
}
}
{
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 попросту теряется. помогите плз :)
Это какой ЯП ?
ЯП С++
Код:
struct CRow *Row[];
struct CColumn *Column[];
struct CColumn *Column[];
такого не может быть в C++
И что значит: "проблемма в том что указатели Row и Column одинаковы" ?
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)
{
// Далее по тексту
};
...
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];
// Далее по тексту
#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])
{
// Далее по тексту
}
{
public:
struct CRow **Row;
struct CColumn **Column;
// Далее по тексту
}
CTable::CTable (int ColumnQuantity, int RowQuantity)
:Row (new CRow* [RowQuantity]), Column (new CColumn* [ColumnQuantity])
{
// Далее по тексту
}
Цитата: Green
И что значит: "проблемма в том что указатели Row и Column одинаковы" ?
Видимо, компилятор автора допускает массивы нулевого размера, поэтому члены Row и Column занимают ноль байт, к тому же находятся по одному адресу :)