powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на std::array
34 сообщений из 34, показаны все 2 страниц
указатель на std::array
    #40073037
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть функция которая хотелось бы чтобы принимала в качестве одного из параметров указатель на массивы разной размерности вида :
const std::array < mystruct,N> где mystruct эта моя простенькая структура , а вот N у таких массивов разный.

вопрос можно ли объявить тип значение которого указатель на const std::array < mystruct,N>
...
Рейтинг: 0 / 0
указатель на std::array
    #40073081
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::vector<mystruct> не подойдет?

Если нет, то объявляй свою функцию через шаблоны .
...
Рейтинг: 0 / 0
указатель на std::array
    #40073091
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
std::vector<mystruct> не подойдет?

Если нет, то объявляй свою функцию через шаблоны .


вектор не пойдет. не хочу динамическую аллокацию. Шаблоны - да . Но тут их надо с параметром . я пока затрудняюсь, почитаю, если что ещё спрошу.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073111
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
вектор не пойдет. не хочу динамическую аллокацию.

Если std::array на стэке размещается, то будь осторожен, стэк всего 1 Мб, выйти за пределы элементарно.
andron81
Шаблоны - да . Но тут их надо с параметром . я пока затрудняюсь, почитаю, если что ещё спрошу.

Параметром будет размер (N).
...
Рейтинг: 0 / 0
указатель на std::array
    #40073126
Dima T
стэк всего 1 Мб

это на винде? Linux ulimit -s показывает 8192
...
Рейтинг: 0 / 0
указатель на std::array
    #40073140
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Код: plaintext
1.
2.
3.
4.
template <size_t N>
void fn(const std::array<mystruct, N>& arr)
{
}



Надо только помнить что тело шаблона должно быть в хедере, а не в .cpp (если это не локальная функция используемая только в этом .cpp файле)
...
Рейтинг: 0 / 0
указатель на std::array
    #40073141
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик
Dima T
стэк всего 1 Мб

это на винде? Linux ulimit -s показывает 8192

В виндавсе размер стэка при компиляции задается. В MSVC по умолчанию 1 Мб.
8 Мб не намного лучше, тоже легко переполнить.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073149
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
andron81,

Код: plaintext
1.
2.
3.
4.
template <size_t N>
void fn(const std::array<mystruct, N>& arr)
{
}



Надо только помнить что тело шаблона должно быть в хедере, а не в .cpp (если это не локальная функция используемая только в этом .cpp файле)


здорово ! спасибо. в шаблонах я вообще нулевой .
...
Рейтинг: 0 / 0
указатель на std::array
    #40073152
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
вектор не пойдет. не хочу динамическую аллокацию.

Если std::array на стэке размещается, то будь осторожен, стэк всего 1 Мб, выйти за пределы элементарно.


то есть у нас ограничения по количеству элементов в массиве ?
...
Рейтинг: 0 / 0
указатель на std::array
    #40073158
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
andron81,

Код: plaintext
1.
2.
3.
4.
template <size_t N>
void fn(const std::array<mystruct, N>& arr)
{
}



Надо только помнить что тело шаблона должно быть в хедере, а не в .cpp (если это не локальная функция используемая только в этом .cpp файле)

Ещё это может быть закрытый метод класса, объявленный в .h, а реализованный в .cpp.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073164
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T
пропущено...

Если std::array на стэке размещается, то будь осторожен, стэк всего 1 Мб, выйти за пределы элементарно.


то есть у нас ограничения по количеству элементов в массиве ?

Да, но не в одном массиве, а во всех вместе. Будешь гуглить - не путай с std::stack<>, читай про стек потока
...
Рейтинг: 0 / 0
указатель на std::array
    #40073167
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если уж писать шаблонную функцию, работающую со множеством, то делать ее сигнатуру в стиле STL: [begin; end). Такое решение позволит отложить выбор статической/динамической аллокации на более поздний этап.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073170
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
пропущено...


то есть у нас ограничения по количеству элементов в массиве ?

Да, но не в одном массиве, а во всех вместе. Будешь гуглить - не путай с std::stack<>, читай про стек потока


что не путать ? структуру данных стек и область памяти стек где хранятся переменные друг за другом ?
...
Рейтинг: 0 / 0
указатель на std::array
    #40073171
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Dima T
пропущено...

Да, но не в одном массиве, а во всех вместе. Будешь гуглить - не путай с std::stack<>, читай про стек потока


что не путать ? структуру данных стек и область памяти стек где хранятся переменные друг за другом ?

Да. Они одним и тем же словом называются.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073174
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

строго говоря - тут речь про ограничение размера стэка потока, а не про ограничение количества элементов в контэйнере "стэк".

количество элементов в контэйнере ограничено типом size_t и в настоящий момент можно считать это ограничение бесконечно большим :)
...
Рейтинг: 0 / 0
указатель на std::array
    #40073177
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж мы пустились в обсуждения "стека", позвольте и мне вставить свои три копейки: std::stack - это абстракция, которая ничего не говорит о структуре хранения. Она лишь определяет набор операций с элементами множества.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073182
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKad,

ну да . можно и свой класс "стэк" намутить с обычным массивом в качестве контейнера .
...
Рейтинг: 0 / 0
указатель на std::array
    #40073208
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?
...
Рейтинг: 0 / 0
указатель на std::array
    #40073219
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?
все перешли на вектор.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073221
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Ну да. Таких проблем бы не было. И шаблоны не нужны
...
Рейтинг: 0 / 0
указатель на std::array
    #40073227
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?

Уточните вопрос. Ерунду же написали.

Воспринимайте std::array как средство оптимизации. Да, со своими ограничениями. Но такой оптимизации нет в
C# или Ява.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073228
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
PetroNotC Sharp,
Ну да. Таких проблем бы не было. И шаблоны не нужны

Либо статика либо динамика. А смешивать не всегда хорошо.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073233
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav

Уточните вопрос. Ерунду же написали.
.


По первичному вопросу ответ был получен. Вощникла ла новая мысль. Для этого надо ответить на вопрос можно ли каким то образом
Определить массив из вот таких массивов :

std::array < mystruct,N>
...
Рейтинг: 0 / 0
указатель на std::array
    #40073237
можно конечно
array<Circle, 10> a2;
и даже так можно
array<string, n> aa;
...
Рейтинг: 0 / 0
указатель на std::array
    #40073238
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
petrav

Уточните вопрос. Ерунду же написали.
.


По первичному вопросу ответ был получен. Вощникла ла новая мысль. Для этого надо ответить на вопрос можно ли каким то образом
Определить массив из вот таких массивов :

std::array < mystruct,N>

Можно. Как и с любым другим типом элемента массива.

А по первичному вопросу могу предложить следующее:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void doItInner(int *, size_t);

template <size_t N>
void doIt(std::array<int, N> &arr)
{
    doItInner(arr.data(), N);
}



doItInner() можно будет разместить в .cpp. Это, конечно, компромисс...
...
Рейтинг: 0 / 0
указатель на std::array
    #40073320
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?

Возможно. Просто пойми что при наличии гигабайтов свободной памяти ты ограничен 1 Мб или чуть больше.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073401
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
andron81
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?

Возможно. Просто пойми что при наличии гигабайтов свободной памяти ты ограничен 1 Мб или чуть больше.



а как это сделать ??? )))
ну вот я попытался . и не работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <array>
#include <iostream>
const int N1 = 1;
const int N2 = 3;
const int N3 = 2;
const  int N4 = 1;
struct mystruct {
    int x;
    int y;
};
const std::array <mystruct, 2> A = { 222,777,111,555 };
const std::array <mystruct, 1> B = { 222,4444 };
const std::array <mystruct, 3> C = { 222,4444,222,4444,222,4444 };
/*
template <size_t N>
void fn(const std::array<mystruct, N>& arr, int i)
{
    std::cout << arr[i].x << std::endl;
} 
*/
template <int N>
std::array<const std::array<mystruct, N>&, 3> arrList = {A,B,C}
int main() {}
...
Рейтинг: 0 / 0
указатель на std::array
    #40073403
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, невнимательно прочитал вопрос.
В один массив никак не собрать std::array<mystruct, N>& с разными значениями N.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073407
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, видимо плохо сформулировал вопрос. теперь понятно.
ладно , спасибо .
...
Рейтинг: 0 / 0
указатель на std::array
    #40073491
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,

Если что vector и другие динамические контейнеры тоже можно на стеке выделять (>= С++17).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include <memory_resource>

void fun()
{
    char pool[1024];
    std::pmr::monotonic_buffer_resource resource{pool, sizeof(pool)};
    std::pmr::vector<int> v({1, 2, 3}, &resource);
    v.push_back(4);

}


Тут monotonic_buffer_resource это аллокатор который выделяет память из массива pool на стеке пока она не закончится, а потом начинает выделять из общей кучи. Так что для маленьких векторов все будет храниться на стеке.

ЗЫ. В Boost есть реализация pmr для компиляторов до C++17
...
Рейтинг: 0 / 0
указатель на std::array
    #40073532
Anatoly Moskovsky
Если что vector и другие динамические контейнеры тоже можно на стеке выделять (>= С++17).

у них же тогда должен измениться принцип работы, или как они будут динамически память выделять?
а почему pool - char ?
...
Рейтинг: 0 / 0
указатель на std::array
    #40073539
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
бабушкин зайчик,

Все контейнеры в С++ поддерживают параметром аллокатор.
PMR использует эту концепцию и реализует единый класс аллокатор для всех контейнеров - std::pmr::polymorphic_allocator.
А к нему есть плагины, реализуещие интерфейс memory_resource.
monotonic_buffer_resource это один из них.
Ему даешь любой буфер и он из него выделяет память пока не кончится буфер, а потом из кучи или другого указанного ресурса.

Т.е. сам std::pmr::vector это тот же std::vector в котором параметр шаблона Allocator = polymorphic_allocator.
Принцип работы не меняестя - код тот же.
...
Рейтинг: 0 / 0
указатель на std::array
    #40073650
не тот же, аллокатор же другой... И выделяет память он стало быть по-другому
...
Рейтинг: 0 / 0
указатель на std::array
    #40074342
andron81
Скажите , а можно всё же каким-то образом массив объявить и определить из таких указателей на такие массивы std::array < mystruct,N>

???

или это уже невозможно ?

технически ведь указатель на массив - это указатель на первый элемент + размер
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / указатель на std::array
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]