Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2015, 06:12   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Напишите это в коммитиет стандартизации, т.к. в стандарте
нет необходимости,
поскольку, именно стандартом я и руководствуюсь,
когда утверждаю, что аргумент operator[] должен быть size_t,

Цитата:
Сообщение от p51x Посмотреть сообщение
Где здесь size_t?
стандарт не запрещает использовать любые интегральные.
стандарт никогда не запрещал стрелять себе в голову,
и писать говнокод.

что касается size_t - это вытекает из предназначения самого size_t

Цитата:
Сообщение от p51x Посмотреть сообщение
Во-первых, каста нет
да, действительно.
извиняюсь, я ошибся.

и тем не менее, это ничего не меняет.

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

у массивов не может быть отрицательных элементов.
если вы запросите элемент по отрицательному индексу,
то получите UB.

если вас интересует стандарт,
то могу сослаться на:

Цитата:
5.7.6 Additive operators
When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the pointer operand points to an element of an array object, and the array is large enough, the result points to an element offset from the original element such that the difference of the subscripts of the resulting and original array elements equals the integral expression. In other words, if the expression P points to the i-th element of an array object, the expressions (P)+N (equivalently, N+(P)) and (P)-N (where N has the value n) point to, respectively, the i+n-th and i–n-th elements of the array object, provided they exist. Moreover, if the expression P points to the last element of an array object, the expression (P)+1 points one past the last element of the array object, and if the expression Q points one past the last element of an array object, the expression (Q)-1 points to the last element of the array object. If both the pointer operand and the result point to elements of the same array object, or one past the last element of the array object, the evaluation shall not produce an overflow; otherwise, the behavior is undefined.
Цитата:
Сообщение от p51x Посмотреть сообщение
Во-вторых, если индексы не превосходят + диапозон, то ничего страшного.
в этом и заключается вся суть говнокода.
ключевое слово "если".

знаю одного паренька, любителя интовых индексов.
так он люто возмущался, когда компиляторы задолбали его предупреждениями о сравнении знаковых с беззнаковыми,
при работе со стандартными контейнерами.

я ему очень просто ответил:
пиши грамотный код, или странствуй 8 лет.

Цитата:
Сообщение от p51x Посмотреть сообщение
Т.е. если мы к массиву добавим обертку с несколькими функциями для аллокации, реаллокации - он перестает быть массивом?
если вы построите обертку над массивом,
то у вас получится обертка над массивом,
и ничего более.
ваш кэп.

и кстати, это не имеет никакого отношения
к вашему бредовому вопросу,
по поводу вектора и листа.

Цитата:
Сообщение от p51x Посмотреть сообщение
А стек у нас какой релегиозно правильный?
у вас - не знаю.
меня вполне устраивает std::stack

Цитата:
Сообщение от p51x Посмотреть сообщение
А дерево тоже сюрприз не дерево...
мне не понятно,
каким образом вы сюда ещё и дерево припахали,
и почему оно у вас вдруг перестало быть деревом.
и при чем тут вектор или лист.

кстати о контейнерах:

Код:
     reference operator[] (size_type n);
const_reference operator[] (size_type n) const;
внезапно?

http://www.cplusplus.com/reference/v...ector/operator[]/
_Bers вне форума Ответить с цитированием
Старый 27.12.2015, 07:21   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
когда утверждаю, что аргумент operator[] должен быть size_t
Вы сами себе противоречите. Вы же дальше соглашаетесь, что нету там никакого size_t

Цитата:
что касается size_t - это вытекает из предназначения самого size_t
ну а предназначене инта хранить числа, только кто-то еще использует char, short, ...

Цитата:
у массивов не может быть отрицательных элементов.
если вы запросите элемент по отрицательному индексу,
то получите UB.

если вас интересует стандарт,
то могу сослаться на:
я где-то спорил с тем, что выход за границы массива это UB? это отменяет тот факт, что если, утрированно, указатель на середине массива, то p[-1] нормальные обращение - нет.

Цитата:
знаю одного паренька, любителя интовых индексов.
так он люто возмущался, когда компиляторы задолбали его предупреждениями о сравнении знаковых с беззнаковыми,
при работе со стандартными контейнерами.
Вы путает мягкое с теплым. То что в стандартных контейнера используют для адресации целочисленный size_t, не отменяет факта возможность использовать в [] других целочисленных... например, инта
т.е. из того что я, например, как разрешает стандарт реализую функцию f(int a), а в STL запихнуть реализацию f(unsigned int a), не следует, что функции могу принимать только положительные аргументы (**)

Цитата:
если вы построите обертку над массивом,
то у вас получится обертка над массивом,
и ничего более.
ваш кэп.

и кстати, это не имеет никакого отношения
к вашему бредовому вопросу,
по поводу вектора и листа.
т.е. массив это не строго T a[N] и все, а если мы делаем обертку, то это просто обертка над ним... запомним (*)

Цитата:
у вас - не знаю.
меня вполне устраивает std::stack
А меня и еще кучу программистов - нет, то памяти в обрез, то многопоточность, то... вообщем, инода приходится делать свою реализацию, например, на кольцевом буфере

Цитата:
мне не понятно,
каким образом вы сюда ещё и дерево припахали,
и почему оно у вас вдруг перестало быть деревом.
и при чем тут вектор или лист.
А что такое дерево? Это не список внутри? Так почему это дерево? Вспоминаем (*)

Цитата:
внезапно?
Почему внезапно? См. **. Но вы же говорили, что контейнеры не массив. Причем они тут?

Последний раз редактировалось p51x; 27.12.2015 в 07:25.
p51x вне форума Ответить с цитированием
Старый 27.12.2015, 11:20   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы сами себе противоречите. Вы же дальше соглашаетесь, что нету там никакого size_t
нет никакого противоречия.

Цитата:
Сообщение от p51x Посмотреть сообщение
ну а предназначене инта хранить числа, только кто-то еще использует char, short, ...
"хранить число" и "хранить индекс массива" - никакой разницы не замечаете?
индекс массива в отличие от числа
не может быть отрицательным числом в принципе.

если вы допускаете, что у вас индекс массива может быть отрицательным числом, то у вас не просто UB в коде,
но и проблемы со здравым смыслом в мозгах.

Цитата:
Сообщение от p51x Посмотреть сообщение
я где-то спорил с тем, что выход за границы массива это UB? это отменяет тот факт, что если, утрированно, указатель на середине массива, то p[-1] нормальные обращение - нет.
при чем здесь указатели,
когда речь идет о массиве и его индексации?

вы вообще осознаете разницу между указателем и массивом?

Код:
int arr[10];
int x = arr[-2]; // out of range; UB
Код:
nt arr[10];
int* p = &arr[2];
int x = p[-2]; // valid:  accesses arr[0]
Цитата:
Сообщение от p51x Посмотреть сообщение
Вы путает мягкое с теплым. То что в стандартных контейнера используют для адресации целочисленный size_t, не отменяет факта возможность использовать в [] других целочисленных... например, инта
я ничего не путаю.
дизайн стандартных контейнеров - пример грамотного подхода.
в отличие от вас, в комитете понимают,
что не бывает "минус второго потрона" в магазине.
в принципе не бывает.

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

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

и вместо того, что бы использовать тип данных,
специально предназначенный для этой цели,
вы предлагаете использовать не предназначенный,
и не способный удовлетворить потребностям массивов,
знаковый int.

вы либо новичок, либо - говнокодер.


Цитата:
Сообщение от p51x Посмотреть сообщение
т.е. из того что я, например, как разрешает стандарт реализую функцию f(int a), а в STL запихнуть реализацию f(unsigned int a), не следует, что функции могу принимать только положительные аргументы (**)
разумеется.
из того, что стандартная библиотека написана по уму,
никак не следует, что вы не можете писать говнокод.
стандарт вам этого не запрещает.

Цитата:
Сообщение от p51x Посмотреть сообщение
т.е. массив это не строго T a[N] и все,
то есть у вас проблемы с логикой, если на основании хз-чего,
вы сделали такие выводы.

к тому же, составной тип данных может иметь множество размерностей,
так что да - не строго одна.

Цитата:
8.3.4 Arrays
In a declaration T D where D has the form
D1 [ expressionopt] attribute-specifier-seqopt

Цитата:
Сообщение от p51x Посмотреть сообщение
А меня и еще кучу программистов - нет, то памяти в обрез, то многопоточность, то... вообщем, инода приходится делать свою реализацию, например, на кольцевом буфере
мне без разницы какую именно реализацию стека вы предпочитаете.
это не имеет никакого отношения к обсуждаемой теме.

Цитата:
Сообщение от p51x Посмотреть сообщение
А что такое дерево?
почитайте википедию.
это так же не имеет отношения к массивам.
и я предлагаю вам не оффтопить.

Цитата:
Сообщение от p51x Посмотреть сообщение
Почему внезапно? См. **. Но вы же говорили, что контейнеры не массив. Причем они тут?
при том, что хотя вектор и не массив, но задачи у него схожие.
он реализует функциональность "динамического массива".

его дизайн спроектирован грамотно.

size_t в оператор[] заложили именно потому,
что именно этот тип данных и должен отвечать за индексацию
во всех механизмах подобного рода.
_Bers вне форума Ответить с цитированием
Старый 27.12.2015, 12:25   #14
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Цитата:
нет никакого противоречия
ну да, в первом предложении говорите, что нету там сайз_т и во втором говорите, что есть, но противоречия нету... ну что вы

Цитата:
"хранить число" и "хранить индекс массива" - никакой разницы не замечаете?
индекс массива в отличие от числа
не может быть отрицательным числом в принципе.
Для проца нет разницы, это только люди договорились нумеровать от 0 или 1 и все. И UB потому что если нет контроля, то проц может полезьт не туда, а там как повезет.

Цитата:
при чем здесь указатели,
когда речь идет о массиве и его индексации?
При том, что у проца нету отдельно массивов и отдельной арифметики для них. Именно поэтому оператор [] описывается одинаково в стандарте.

Цитата:
в отличие от вас, в комитете понимают,
что не бывает "минус второго потрона" в магазине.
а еще не бывает очередей и стеков на каких-то "листах" с указателями в реальной жизни, и деревьев на списках и много чего

Цитата:
именно этот тип данных и используется в стандартной библиотеке.
потому что её делали по уму, а не так, как вы предлагаете.
нет, первой целью сайз_т было снизить порог вхождения и хоть чуть избавиться от глупых ошибок новичков. можете архивы рассылок почитать

Цитата:
и вместо того, что бы использовать тип данных,
специально предназначенный для этой цели,
вы предлагаете использовать не предназначенный,
и не способный удовлетворить потребностям массивов,
знаковый int.
где я это предлагал? грубо говоря, я писал, что если вам хватает 100 байт, то не нужно выделять 100 мегабайт (а что? в современных компах это ж фигня)

Цитата:
вы либо новичок, либо - говнокодер.
у вас либо ЧСВ, либо вы идиот с раздвоенние личности... дальше пойдем по личностям?

Цитата:
из того, что стандартная библиотека написана по уму
то-то ее переодически исправляю, изменяют и обкатывают в бусте кучу версий; то-то для мнопоточности есть свой вариант, даже у интела был; то-то ее опять предлягают серьезно переделать - но для кого-то это святая корова

Цитата:
то есть у вас проблемы с логикой, если на основании хз-чего,
вы сделали такие выводы.
это ваша логика. следите:
кто-то: ...или безразмерная суперэкзотика
я: с каких пор вектор стал экзотикой?
вы: ни то, ни другое никогда не являлось массивом.

так теперь является?

Цитата:
почитайте википедию.
это так же не имеет отношения к массивам.
и я предлагаю вам не оффтопить.
Вы эту часть темы начали, так что может заткнете свое ЧСВ откуда оно вылезло и сами перестанете оффтопить для начала?

Цитата:
так что да - не строго одна.
Цитата:
при том, что хотя вектор и не массив, но задачи у него схожие
так вектор это в начале поста массив (пусть с оберткой), а в конце поста уже не массив?

Цитата:
он реализует функциональность "динамического массива".
ну вы же писали, что вектор не имеет никакого отношения к динамическим массивам

Цитата:
его дизайн спроектирован грамотно.
т.е. его писали не люди? т.е. его ниразу не переделывали? т.е. нет никакой критики? т.е. ...

Цитата:
size_t в оператор[] заложили именно потому,
что именно этот тип данных и должен отвечать за индексацию
во всех механизмах подобного рода.
Во-вервых, не в оператор [], а в опреатор [] в классах СТЛ (я уже приводил стандарт, где нет никакого сайз_т)
Во-вторых, а умные указатели заложили именно потому, что имменно этот тип данных и должен отвечать за работу с памятью? Так?

Последний раз редактировалось p51x; 27.12.2015 в 12:29.
p51x вне форума Ответить с цитированием
Старый 27.12.2015, 14:40   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
ну да, в первом предложении говорите, что нету там сайз_т и во втором говорите, что есть, но противоречия нету... ну что вы
что именно вам не понятно?
приведите конкретные цитаты.

Цитата:
Сообщение от p51x Посмотреть сообщение
Для проца нет разницы, это только люди договорились нумеровать от 0 или 1 и все. И UB потому что если нет контроля, то проц может полезьт не туда, а там как повезет.
меня не интересуют трудовые будни процессора.

меня интересует, что бы говнокода не было
в исходном коде с++.

Цитата:
Сообщение от p51x Посмотреть сообщение
При том, что у проца нету отдельно массивов и отдельной арифметики для них. Именно поэтому оператор [] описывается одинаково в стандарте.
я специально привел исходный код двух примеров.
но вы похоже реально не осознаете разницу
между указателями и массивами.

Цитата:
Сообщение от p51x Посмотреть сообщение
а еще не бывает очередей и стеков на каких-то "листах" с указателями в реальной жизни, и деревьев на списках и много чего
маразм крепчал.

Цитата:
Сообщение от p51x Посмотреть сообщение
нет, первой целью сайз_т было снизить порог вхождения и хоть чуть избавиться от глупых ошибок новичков. можете архивы рассылок почитать
тоже самое по сути.

Цитата:
Сообщение от p51x Посмотреть сообщение
где я это предлагал? грубо говоря, я писал, что если вам хватает 100 байт, то не нужно выделять 100 мегабайт (а что? в современных компах это ж фигня)
такова ваша позиция.
и она будет оставаться таковой до тех пор,
пока вы считаете нормальным использовать знаковый тип
для хранения беззнаковых величин

Цитата:
Сообщение от p51x Посмотреть сообщение
у вас либо ЧСВ, либо вы идиот с раздвоенние личности... дальше пойдем по личностям?
у меня - здравый смысл.
_Bers вне форума Ответить с цитированием
Старый 27.12.2015, 14:40   #16
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
то-то ее переодически исправляю, изменяют и обкатывают в бусте кучу версий; то-то для мнопоточности есть свой вариант, даже у интела был; то-то ее опять предлягают серьезно переделать - но для кого-то это святая корова
стандартная библиотека стабильна.

Цитата:
Сообщение от p51x Посмотреть сообщение
это ваша логика. следите:
кто-то: ...или безразмерная суперэкзотика
я: с каких пор вектор стал экзотикой?
вы: ни то, ни другое никогда не являлось массивом.
слежу:

сообщение #3
Цитата:
мой CodeBloks просто не хочет даже создавать обычный безразмерный массив
здесь речь идет о массиве.

сообщение #6
Цитата:
Уж или обычный, или безразмерная суперэкзотика. Что нибудь одно.
контекст не менялся. речь по прежнему идет о массивах.

под суперэкзотикой подразумевается некий "безразмерный массив".

сообщение #7
Цитата:
С каких пор вектор или лист стал экзотикой?
контекст по прежнему тот же.

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

Цитата:
Сообщение от p51x Посмотреть сообщение
так теперь является?
у вас действительно какие то проблемы с пониманием текста.
мне вот интересно, на основании чего вообще мог возникнуть такой вопрос?

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы эту часть темы начали, так что может заткнете свое ЧСВ откуда оно вылезло и сами перестанете оффтопить для начала?
я не оффтоплю, когда утверждаю, что знаковые типы в качестве индексов - говнокод, за искл положительных литерных констант.

см сообщение #7
Цитата:
а количество элементов массива всегда должно быть типа size_t.
тезис - верный, и не является оффтопом в рамках темы о массивах.

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

и как я уже вам писал выше, мне не очевидно,
на кой черт вы мне начали про всякие деревья загонять,
и рассказывать поо свои неудовлетворенности стандартным стеком,
и тп.

эти сообщения никак не коррелируют с общим ходом диалога.

Цитата:
Сообщение от p51x Посмотреть сообщение
так вектор это в начале поста массив (пусть с оберткой), а в конце поста уже не массив?
я никогда не утверждал, что вектор - это массив.
у меня начинает складываться впечатление,
что вы какой то сказочный.

откуда вы все это берете?

Цитата:
Сообщение от p51x Посмотреть сообщение
ну вы же писали, что вектор не имеет никакого отношения к динамическим массивам
то есть, когда я написал (#13):
Цитата:
при том, что хотя вектор и не массив, но задачи у него схожие.
он реализует функциональность "динамического массива".
вы это поняли как "не имеет никакого отношения к динамическим массивам"?

потому что это - единственное моё упоминание о связи вектора с "динамическим массивом".

Цитата:
Сообщение от p51x Посмотреть сообщение
т.е. его писали не люди? т.е. его ниразу не переделывали? т.е. нет никакой критики? т.е. ...
и на основании чего вот такие выводы вы могли сделать?

Цитата:
я: мерседес - отличная машина, весь дизайн прекрасно продуман
вы: то есть мерседес делали не люди?
Цитата:
Сообщение от p51x Посмотреть сообщение
Во-вервых, не в оператор [], а в опреатор [] в классах СТЛ (я уже приводил стандарт, где нет никакого сайз_т)
из контекста не очевидно о чем идет речь?

учитывая, что у вас сложности с пониманием текста,
я пожалуй буду более конкретен впредь
общаясь с инопланетянами.

Цитата:
Сообщение от p51x Посмотреть сообщение
Во-вторых, а умные указатели заложили именно потому, что имменно этот тип данных и должен отвечать за работу с памятью? Так?
конкретный тип данных,
это например: std::shared_ptr<type>

а умный указатель - это паттерн
элегантное решение определенных проблем.
его не "заложили", а "изобрели".
и оказалось очень даже практичная штука.
_Bers вне форума Ответить с цитированием
Старый 28.12.2015, 03:18   #17
FIDE
Заблокирован
 
Регистрация: 02.08.2014
Сообщений: 30
По умолчанию

Никого не смущает кросспостинг?
http://www.programmersforum.ru/showthread.php?p=1566838
FIDE вне форума Ответить с цитированием
Старый 28.12.2015, 10:07   #18
NastyaAkolzina
 
Регистрация: 01.12.2015
Сообщений: 1
Подмигивание

Я написала Вам программу:

Это произведение нечетных элементов, конечно, готовое не даю :3 Вам только подправить ответ, чтобы он выводил кол-во. Удачи

Цитата:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <conio.h>

using namespace std;

int main()
{
setlocale(0,"");
const int n=10;
int sum = 1;
int M[n];
for (int i = 0; i < n; i++)
{
cin >> M[i];
if ((M[i] % 2) != 0)
{
sum *= M[i];
}
}
cout << "sum=" << sum << endl;
system("pause");
return 0;
}
Написала благодаря этому видео:
http://www.youtube.com/watch?v=yy1pNwadaes

Если вы хотите разобраться "что, как, почему". Советую тоже посмотреть все видео

Последний раз редактировалось NastyaAkolzina; 28.12.2015 в 10:27.
NastyaAkolzina вне форума Ответить с цитированием
Старый 28.12.2015, 11:28   #19
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вы бред не несите, а прочитайте стандарт или попробуйте скомпилить.


Т.е.
Код:
int i;
a[i] = ..
не скомпилится?4
Он то может и скомилится, но у Вас здесь размер массива не известен. И даже если
Код:
const int n=20;
a[n];
, то получаем мину на будущее, когда элементов станет больше, чем (2 в степени 8*sizeof(int)-1)-1. И даже
Код:
const unsigned int n=20; a[n];
- та же мина на будущее, когда элементов станет больше, чем 2 в степени 2*sizeof (int). А массив, в котором элементов больше, чем 2 в степени 8*sizeof(size_t), хранить всё равно негде. Так что бред несёшь ты. И чем этим заниматься, прочитайка лучше вдумчиво тот самый стандарт.
taras-proger вне форума Ответить с цитированием
Старый 28.12.2015, 13:10   #20
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
прочитал и привел цитаты
И какое же место говорит о достаточности какого либо инта для хранения размера любого возможного массива? Так что читай ещё раз. Вдумчиво, а не бездумно, как привык.
taras-proger вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите девушке! Заполнить массив случайным образом, выделить в отдельные массивы буквы латинского алфавита, Svetlana90 Помощь студентам 0 19.05.2015 14:14
Помогите девушке alena1995 Помощь студентам 7 03.12.2014 17:03
Паскаль массив, помогите девушке!!!на учебную практику срочно нужно!!! анастасия56 Помощь студентам 1 30.05.2009 13:37