LINUX.ORG.RU

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


0

1

Есть структура

typedef struct{
int type_elem;
int posX, posY;
int value;
} Elements;

На языке Си при создании максива

Elements *myElements;

нужно инициализировать и наверное как я понимаю выделить память. Но количество элементов неизвестно. Например, сколько раз пользователь нажмёт кнопку - такая и будет размерность. Как быть в этой ситуации? Память желательно выделять через malloc, а не new


Ответ на: комментарий от k_andy

void *calloc(size_t num, size_t size);

Функция calloc() выделяет память, размер которой равен значению выражения num * size, т.е. память, достаточную для размещения массива, содержащего num объектов размером size. Все биты распределенной памяти инициализируются нулями.


number_of_elements - фиксированный размер массива, а у меня неизвестно сколько элементов будет

g-71
() автор топика
Ответ на: комментарий от g-71

>неизвестно сколько элементов будет
размер с неба упадет?

rg-400
()

используй списки вместо массивов

nu11 ★★★★★
()
Ответ на: комментарий от g-71

>На языке Си при создании максива

new

так си или c++

rg-400
()

Да и в С++ лучше использовать контейнерные типы из STL - std::vector, std::list. Для C, наверно, стоит использовать glib.

Begemoth ★★★★★
()

зачем все усложнять(списки строить). используй realloc

struct Elements *ptr;
size_t n;

ptr = NULL;
n=getN();//или по другому

ptr = realloc(ptr,n*sizeof(*ptr));

rg-400
()

голосую за список или статическое аллоцирование памяти большими кусками с запасом(чтобы избежать фрагментации), при нехватке памяти realloc и тоже с запасом.

true_admin ★★★★★
()
Ответ на: комментарий от Love5an

Вообще, если все же не сессия, то для задачи выбран совершенно неподходящий язык(и нет, С++ тоже не подходящий).

На это намекают «int posX, posY;»(гуйня?) и, собственно, самое дикое - «int type_elem»(метка типа?)

Подходящим был бы нормальный высокоуровневый язык с нормальными высокоуровневыми(динамические массивы, etc.) структурами данных(и, если последнее предположение верно, с динамической типизацией).

Love5an
()

Использовать связный список, каждый раз добавляя в него элемент, выделенный при помощи malloc(). Дело в том, что realloc() заведомо неэффективен при больших массивах.

Deleted
()
Ответ на: комментарий от Love5an

так, а чего в С++ такого не1подходящего(ну если STL считать частью плюсов)?

RedPossum ★★★★★
()
Ответ на: комментарий от Begemoth

> Love5an демонстрирует чудеса телепатии - определение задачи по одному определению типа!

Парень proof theory, видимо, обдолбился.

balodja ★★★
()
Ответ на: комментарий от Deleted

realloc можно делать не при каждом добавлении элемента. А, например, только на степенях двойки(как это делается в питоне).

balodja ★★★
()
Ответ на: комментарий от true_admin

> голосую за список или статическое аллоцирование памяти большими кусками с запасом(чтобы избежать фрагментации), при нехватке памяти realloc и тоже с запасом.

Ъ. Но все-таки лучше взять уже готовое решение.

balodja ★★★
()
Ответ на: комментарий от balodja

Парень proof theory, видимо, обдолбился.

при такой идиосинкразии к статической типизации? сомнительно

jtootf ★★★★★
()
Ответ на: комментарий от Deleted

Использовать связный список, каждый раз добавляя в него элемент, выделенный при помощи malloc().

Ну это уже не массив, вот в чем беда.

Dudraug ★★★★★
()
Ответ на: комментарий от jtootf

Сомнительно только в том случае, если считать рассматриваемую личность внутренне непротиворечивой :)

balodja ★★★
()
Ответ на: комментарий от balodja

оно Ъ пока не понадобится выделить один очень большой кусок, тут realloc может и послать :). По крайней мере я как-то баловался с кусками по гигабайту, линух послал.

true_admin ★★★★★
()
Ответ на: комментарий от Love5an

На это намекают «int posX, posY;»(гуйня?) и, собственно, самое дикое - «int type_elem»(метка типа?)

тогда можно продолжить мысль про «гуйню» и предложить автору топика двумерный массив по разрешению экрана :)

typedef struct{
  int type_elem;
  // int posX, posY;  //Теперь ненужны
  int value;
} Elements;
Elements elmap[MAX_SCREEN_HEIGHT][MAX_SCREEN_WODTH]={0};
MKuznetsov ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.