А что за шляпа с std::array?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.12.22 20:28
Оценка: 3 (1) :))) :))) :)
Здравствуйте!

Вот я написал
std::array<unsigned, 14> scales = { 500, 250, 175, 150, 125, 110, 100, 90, 80, 75, 67, 50, 33, 25 };

for(auto scale : scales)
{
    //...
}


Я могу написать
std::array<unsigned, 15> scales = { 500, 250, 175, 150, 125, 110, 100, 90, 80, 75, 67, 50, 33, 25 };


и поиметь при итерации по элементам нулевой последний 15ый элемент. Но блджад, я задал явно только 14, какого хэ мне подсовывают 15ый?

И никто мне по рукам не дал, даже варнингов не написал, как будто так и должно быть.

Какую-то херню подсунули, на ровном месте баги, а ты думаешь, что раз стандартная библиотека, то там всё по уму.

С сырыми массивами хотя бы все подлянки уже изучены.

Или я что-то неправильно делаю?
Маньяк Робокряк колесит по городу
Re: А что за шляпа с std::array?
От: T4r4sB Россия  
Дата: 07.12.22 20:35
Оценка:
Здравствуйте, Marty, Вы писали:

M>С сырыми массивами хотя бы все подлянки уже изучены.


И сырой массив бы повёл себя точно так же.
И с чего ты взял что std::array хранит какую-то инфу, кроме заранее известных N элементов? Наверное тебе тогда StaticVector нужен?
Re[2]: А что за шляпа с std::array?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.12.22 20:46
Оценка:
Здравствуйте, T4r4sB, Вы писали:

M>>С сырыми массивами хотя бы все подлянки уже изучены.


TB>И сырой массив бы повёл себя точно так же.

TB>И с чего ты взял что std::array хранит какую-то инфу, кроме заранее известных N элементов? Наверное тебе тогда StaticVector нужен?

Я полагал, что когда я размер явно задаю — это максмальный размер. И мне выдадут ошибку, если при инициализации я превышу указанный размер. А при недостаче инициализаторов это зафиксируется, и я смогу докинуть при нужде недостающее. Ну или тоже просто ошибка будет.

С сишечными массивами проще — у каждого есть свой макрос SIZEOF_ARRAY(), а у некоторых есть и плюсовая перегрузка, чтобы не облажаться на указателе
Маньяк Робокряк колесит по городу
Re: А что за шляпа с std::array?
От: Zhendos  
Дата: 07.12.22 21:10
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>и поиметь при итерации по элементам нулевой последний 15ый элемент. Но блджад, я задал явно только 14, какого хэ мне подсовывают 15ый?


M>И никто мне по рукам не дал, даже варнингов не написал, как будто так и должно быть.


Но так и должно, есть правило про "частичную" инициализацию и массивов и структур:
https://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure

и компиялтор не знает, ошибка это или ты хочешь использовать "частичную" инициализацию.
Можно поступить как и с обычным статичным массивом,
инициализировать, а потом проверить размер:

std::array scales = { 500u, 250u, ... };
static_assert(std::size(scales) == 15);
Re[2]: А что за шляпа с std::array?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 07.12.22 21:26
Оценка: +1 :)
Здравствуйте, Zhendos, Вы писали:

Z>Можно поступить как и с обычным статичным массивом,

Z>инициализировать, а потом проверить размер:

Z>
Z>std::array scales = { 500u, 250u, ... };
Z>static_assert(std::size(scales) == 15);
Z>



Херня какая-то, если честно. Проще на своих велосипедах и дальше ездить, чем по этим новым граблям прыгать
Маньяк Робокряк колесит по городу
Re: А что за шляпа с std::array?
От: sergii.p  
Дата: 08.12.22 07:29
Оценка:
Здравствуйте, Marty, Вы писали:

можно реализовать свой велосипед по мотивам https://en.cppreference.com/w/cpp/experimental/make_array
подобная проблема и с vector для некопируемых элементов. Надо сначала вызвать reserve(N) а потом мучительно проверять сколько элементов добавил.
Re: А что за шляпа с std::array?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 08.12.22 07:56
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>С сырыми массивами хотя бы все подлянки уже изучены.


Вот! Новый std::array ведёт себя точно также как сишный.
char tmp[256] = {0};

Тут же понятно, что размер массива будет равен 256, а не 1 и чем оно проинициализируется?

M>Или я что-то неправильно делаю?


Неправильно понимаешь, что такое std::array? Это же просто обёртка над сишным массивом и вести себя должен соответственно.
Re[2]: А что за шляпа с std::array?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.12.22 09:32
Оценка:
Здравствуйте, Nuzhny, Вы писали:

N>Неправильно понимаешь, что такое std::array? Это же просто обёртка над сишным массивом и вести себя должен соответственно.


У сишного можно не задавать явно размер, и тогда он будет ровно того размера, сколько элементов задано в списке инициализации
Маньяк Робокряк колесит по городу
Re[3]: А что за шляпа с std::array?
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 08.12.22 09:38
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>У сишного можно не задавать явно размер, и тогда он будет ровно того размера, сколько элементов задано в списке инициализации


Можно. Но ведь с std::array размер явно задаётся, это не тот случай.
Re[4]: А что за шляпа с std::array?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 08.12.22 10:46
Оценка:
Здравствуйте, Nuzhny, Вы писали:

M>>У сишного можно не задавать явно размер, и тогда он будет ровно того размера, сколько элементов задано в списке инициализации


N>Можно. Но ведь с std::array размер явно задаётся, это не тот случай.


Вот это и напрягает
Маньяк Робокряк колесит по городу
Re[3]: А что за шляпа с std::array?
От: rg45 СССР  
Дата: 08.12.22 10:49
Оценка:
Здравствуйте, Marty, Вы писали:

M>У сишного можно не задавать явно размер, и тогда он будет ровно того размера, сколько элементов задано в списке инициализации


Так а что от этого меняется? Да, в С-шном массивве можно не задавать размер, а в std::array нельзя, но поведение std::array в точности соответствует встроенному массиву с явно заданным размером. Потому что std::array сам по себе является простой структурой, содержащей массив и подчинаяется правилам агрегатной инициализации, так же, как и все агрегатные типы — массивы и простые структуры.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 08.12.2022 10:50 rg45 . Предыдущая версия .
Re[3]: А что за шляпа с std::array?
От: Chorkov Россия  
Дата: 08.12.22 16:12
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, Nuzhny, Вы писали:


N>>Неправильно понимаешь, что такое std::array? Это же просто обёртка над сишным массивом и вести себя должен соответственно.


M>У сишного можно не задавать явно размер, и тогда он будет ровно того размера, сколько элементов задано в списке инициализации


Так и у array можно ...

https://godbolt.org/z/nd1MEqaqd
Re[4]: А что за шляпа с std::array?
От: B0FEE664  
Дата: 08.12.22 17:47
Оценка: 6 (1)
Здравствуйте, rg45, Вы писали:

R>Так а что от этого меняется? Да, в С-шном массивве можно не задавать размер, а в std::array нельзя,

Можно уже:
https://wandbox.org/permlink/Z33d2R8vX2A2Y3OO
И каждый день — без права на ошибку...
Re[3]: А что за шляпа с std::array?
От: B0FEE664  
Дата: 08.12.22 17:55
Оценка:
Здравствуйте, Marty, Вы писали:

M>Херня какая-то, если честно. Проще на своих велосипедах и дальше ездить, чем по этим новым граблям прыгать


Всегда проще использовать тот код, который знаешь.
Поэтому можно всегда таскать свои велосипеды везде, но могут возникнуть проблемы собственности, если велосипед из одной конторы вдруг появляется в другой.
Если ваш велосипед настолько хорош, что коллеги начинают его использовать, тогда — ok, а вот изучать чужой код, который делает тоже самое, что есть в стандартной библиотеке — зачем?
Так что стандартная библиотека рулит.
И каждый день — без права на ошибку...
Re[5]: А что за шляпа с std::array?
От: rg45 СССР  
Дата: 08.12.22 19:10
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Можно уже:

BFE>https://wandbox.org/permlink/Z33d2R8vX2A2Y3OO

О, отлично. Только все равно не понимаю, зачем вспоминать об этой возможности в контексте обсуждения, когда проблема наблюдается как раз в другом случае — когда размер задается явно.
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.