Двумерный массив структур
От: Anativ  
Дата: 02.11.06 10:31
Оценка: :)
Добрый день!
1. У меня есть структура вида:
struct POINTS
{
double pointX;
double pointY;
double angle;
};

Нужно создать динамический двумерный массив, состоящий из такой структуры. Как это сделать?
В первую очередь интересует синтаксис.

2. Пытался выделить память статически:
POINTS points[200][100];

При обращении к полям
points[pointsNum][resultsNum].pointX = a;

выдается ошибка.
Как правильно обращаться к полям такого массива?
Re: Двумерный массив структур
От: Аноним  
Дата: 02.11.06 10:43
Оценка:
Здравствуйте, Anativ, Вы писали:

A>Добрый день!

A>1. У меня есть структура вида:
A>
A>struct POINTS
A>{
A>double pointX;
A>double pointY;
A>double angle;
A>};
A>

A>Нужно создать динамический двумерный массив, состоящий из такой структуры. Как это сделать?
A>В первую очередь интересует синтаксис.

A>2. Пытался выделить память статически:

A>
A>POINTS points[200][100];
A>

A>При обращении к полям
A>
A>points[pointsNum][resultsNum].pointX = a;
A>

A>выдается ошибка.
A>Как правильно обращаться к полям такого массива?

может ошибка потому что по индексам за предлы массива вышел?
Re: Двумерный массив структур
От: Какая разница Украина  
Дата: 02.11.06 11:03
Оценка: 1 (1)
Здравствуйте, Anativ, Вы писали:

A>Добрый день!

A>1. У меня есть структура вида:
A>
A>struct POINTS
A>{
A>double pointX;
A>double pointY;
A>double angle;
A>};
A>

A>Нужно создать динамический двумерный массив, состоящий из такой структуры. Как это сделать?
A>В первую очередь интересует синтаксис.

динамический массив размерностью M x N

std::vector <std::vector <POINTS> > massiv(M, std::vector <POINTS>(N));


обращаться обычно по индексам
massiv[i][j]

A>2. Пытался выделить память статически:

A>
A>POINTS points[200][100];
A>

A>При обращении к полям
A>
A>points[pointsNum][resultsNum].pointX = a;
A>

A>выдается ошибка.
что за ошибка
A>Как правильно обращаться к полям такого массива?
может просто вылазиш за границы массива
!0xDEAD
Re: Двумерный массив структур
От: sokel Россия  
Дата: 02.11.06 11:12
Оценка: 2 (1)
Здравствуйте, Anativ, Вы писали:

A>Добрый день!

A>1. У меня есть структура вида:
A>
A>struct POINTS
A>{
A>double pointX;
A>double pointY;
A>double angle;
A>};
A>

A>Нужно создать динамический двумерный массив, состоящий из такой структуры. Как это сделать?
A>В первую очередь интересует синтаксис.

A>2. Пытался выделить память статически:

A>
A>POINTS points[200][100];
A>

A>При обращении к полям
A>
A>points[pointsNum][resultsNum].pointX = a;
A>

A>выдается ошибка.
A>Как правильно обращаться к полям такого массива?

Всё вроде правильно, ошибок быть не должно, если за границы не вылез.

Динамически можно так:

POINT** points = new POINT*[M];
for(int i=0;i<M;++i)points[i] = new POINT[N];
// обращение к points[i][j]:
POINT& p = points[i][j];


а можно просто одномерным массивом:

POINT* points = new POINT[M*N];
// обращение к points[i][j]:
POINT& p = points[i*N+j];
Re[2]: Двумерный массив структур
От: Anativ  
Дата: 02.11.06 14:10
Оценка:
Sokel, спасибо. Заработало.

Еще один вопрос возник. Просто проверить.
В случае, если объявить структуру так:
typedef struct POINT
{
float pointX;
float pointY;
float angle;
POINT()
  {
  angle = 0;
  }
} POINT;

а в программе выделить под нее память динамически, то angle не обнуляется. В случае статического объявления angle обнуляется на стадии сборки проекта. Я правильно понимаю?
Re[3]: Двумерный массив структур
От: Какая разница Украина  
Дата: 02.11.06 14:17
Оценка:
Здравствуйте, Anativ, Вы писали:

A>Sokel, спасибо. Заработало.


A>Еще один вопрос возник. Просто проверить.

A>В случае, если объявить структуру так:
A>
A>typedef struct POINT
A>{
A>float pointX;
A>float pointY;
A>float angle;
A>POINT()
A>  {
A>  angle = 0;
A>  }
A>} POINT;
A>

A>а в программе выделить под нее память динамически, то angle не обнуляется. В случае статического объявления angle обнуляется на стадии сборки проекта. Я правильно понимаю?

И в случае динамического и в случае статического выделения будет срабатывать твой конструктор который ты объявил и
который будет нулить поле angle
!0xDEAD
Re: Двумерный массив структур
От: Sm0ke Россия ksi
Дата: 03.11.06 08:44
Оценка:
Здравствуйте, Anativ, Вы писали:

A>Добрый день!

A>1. У меня есть структура вида:
A>
A>struct POINTS
A>{
A>double pointX;
A>double pointY;
A>double angle;
A>};
A>

A>Нужно создать динамический двумерный массив, состоящий из такой структуры. Как это сделать?

Если одна размерность известна в compile-time то можно так:

void fn()
{
    
    int n= 50;
    POINTS (*h)[10]= new POINTS[n][10];
    // do_something
    delete [] h;
}


Или шаблон:

template <class T, int SizeX>
class matrix
{
public:
    enum { cx= SizeX };
    typedef T vec[cx];

private:
    //T (*handle)[cx];
    vec *handle;

public:
    matrix(int cy) : handle(new vec[cy] /* new T[cy][cx] */)
    {}

    ~matrix()
    {
        delete [] handle;
    }

    T * operator [](int y)
    {
        return handle[y];
    }
};

typedef matrix<int, 10> int_matrix10;


Но этот шаблон надо доделать (добавить проверку на NULL и т.д.)
Re: Двумерный массив структур
От: Барбос  
Дата: 27.11.06 07:45
Оценка:
А если такая ситуация: я читаю файл построчно. После чтения каждой строки из нее выделяются пресловутые pointX, pointY и angle.
Поэтому необходимо после чтения каждой строки выделить память не сразу для нескольких элементов, а для каждого элемента в отдельности. Как это можно сделать?
Конечно, можно сначала пройтись по файлу и посчитать количество записей, после чего выделять память уже для полного массива и пройтись по этому файлу заново, занося значения в массив. Но ведь это не путь тру программиста...
Re[2]: Двумерный массив структур
От: Sm0ke Россия ksi
Дата: 27.11.06 09:55
Оценка:
Здравствуйте, Барбос, Вы писали:

Б>А если такая ситуация: я читаю файл построчно. После чтения каждой строки из нее выделяются пресловутые pointX, pointY и angle.

Б>Поэтому необходимо после чтения каждой строки выделить память не сразу для нескольких элементов, а для каждого элемента в отдельности. Как это можно сделать?
Б>Конечно, можно сначала пройтись по файлу и посчитать количество записей, после чего выделять память уже для полного массива и пройтись по этому файлу заново, занося значения в массив. Но ведь это не путь тру программиста...

1. Хранить в файле кол-во эл-тов.
или
2. Взять длину файла и поделить на sizeof(struct POINTS)
Re[3]: Двумерный массив структур
От: Барбос  
Дата: 27.11.06 10:34
Оценка:
Б>>А если такая ситуация: я читаю файл построчно. После чтения каждой строки из нее выделяются пресловутые pointX, pointY и angle.
Б>>Поэтому необходимо после чтения каждой строки выделить память не сразу для нескольких элементов, а для каждого элемента в отдельности. Как это можно сделать?
Б>>Конечно, можно сначала пройтись по файлу и посчитать количество записей, после чего выделять память уже для полного массива и пройтись по этому файлу заново, занося значения в массив. Но ведь это не путь тру программиста...

S>1. Хранить в файле кол-во эл-тов.

S>или
S>2. Взять длину файла и поделить на sizeof(struct POINTS)

Количество элементов неудобно считать каждый раз. А вдруг их около сотни? И если формат файла нефиксированный (комментарии, другие параметры и т.п.)?
Re[4]: Двумерный массив структур
От: Аноним  
Дата: 29.11.06 10:21
Оценка: +1
Здравствуйте, Барбос, Вы писали:

Б>Количество элементов неудобно считать каждый раз. А вдруг их около сотни? И если формат файла нефиксированный (комментарии, другие параметры и т.п.)?


Тут уже говорили — используй вектор (std::vector). В него можно динамически добавлять элементы и не думать о том, как что выделяется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.