LINUX.ORG.RU

максимальное число элементов в массиве в С?

 , , openrange


1

3

эт что же массив(еденичных элементов) по определению меньше всего адресного пространства ??

т.е если вся память адреса 0...2^64-1 то массив элементов единичного размера начинающийся с 0 адресса не может в себе содержать элемент максимального значения типа индекса

( ща когда 64 бита это не очень актуально но для 32 и тем более 16 оказывается массив(байтов) обязан быть меньше сегмента байтов.)

★★☆
Ответ на: комментарий от drBatty

Давай примеры пути к вектору. И не пропускай вопрос про связность коллекций.

anonymous
()
Ответ на: комментарий от drBatty

Ладно. Будем считать, что я не правильно понял фразу «что угодно». Но, все же не стоит злоупотреблять квантором всеобщности без уточнения множества допустимых значений.

anonymous
()
Ответ на: комментарий от drBatty

Вы спорили о том, почему в массиве a[100500] нет элемента с индексом 100500?

Нет мы об этом не спорили. Читай тред целиком.

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

я и так простыни пишу. На будущее «что угодно», значит «что угодно», а вовсе НЕ «любая НЁХ придуманная анонимусом».

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

А не путаешь ли ты массив с хешем или с map'ом (картой, отображением или как тебе лучше перевести)?

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

Да неужели? А как же тогда называть такие посты, если ты простыни пишешь?

в моих постах инфы обычно больше. Я тот пост могу и в «ты йух» свернуть.

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

А не путаешь ли ты массив с хешем или с map'ом

не, не путаю. Массив — частный случай коллекции. Как он реализован — в данном случае дело десятое.

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

Вот скажи, тяжело было сказать, что ты решил перевести обсуждение на ассоциативные контейнеры? Очевидно, что там такого не будет, потому что там ключ и количество элементов, действительно, могут иметь разные типы. Если же сохранять однотипность ключа и количества элементов, но убрать «связность» множества ключей, то вопрос надо ставить так: может ли «массив» содержать все возможные значения ключей типа T, если количество элементов в нем задается максимальным значением типа T? И ответ опять будет нет.

anonymous
()
Ответ на: комментарий от drBatty

Массив — частный случай коллекции

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

anonymous
()
Ответ на: комментарий от drBatty

На свой пост, который мусором не считаю, я тебе ссылку давал. Остальные немусорные искать надо. Давай я тебе лучше по памяти пречислю какие темы затрагивались в данном треде:

  • Есть ли в C массивы?
  • Какими «скиллами» должен обладать программист?
  • Управление памятью в ядре Linux и в частности: как определить наибольшее значение при котором malloc гарантированно не вернет NULL?

Если что пропустил, то извени — боюсь сил перечитывать весь топик с начала я в себе сейчас не найду.

anonymous
()
Ответ на: комментарий от drBatty

И где в твоей «свертке» найти утверждение о том, что «Обобщение - это частный, а не общий случай»?

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

Вот скажи, тяжело было сказать, что ты решил перевести обсуждение на ассоциативные контейнеры?

ассоциативные контейнеры — тоже ещё один частный случай. А я про общий.

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

ну сколько вам можно повторять, что в сишечных массивах количество и индекс тоже имеют РАЗНЫЕ типы. В моём компьютере, который у меня на столе, типы действительно РАЗНЫЕ, это не исключение, а правило. И на моих серверах — тоже разные.

Если же сохранять однотипность ключа и количества элементов, но убрать «связность» множества ключей, то вопрос надо ставить так: может ли «массив» содержать все возможные значения ключей типа T, если количество элементов в нем задается максимальным значением типа T? И ответ опять будет нет.

естественно нет. Потому-что массив обязан существовать, а стало-быть допустимое для любого типа значение 0 НЕ может быть размером массива. Чего нет, то нельзя считать. ©Екклесиаст. Ну а для signed есть ещё и отрицательные числа, которые не имеют смысла для размера/количества. Ну и напоследок, индекс вообще никак не может быть ассоциирован с количеством/размером.

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

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

потому-что в данном случае для моих утверждений это не играет роли.

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

Совсем забыл. Тут незадолго до твоего прихода, кто-то перевел обсуждение на лавсана и vsl. С них обсуждение перешло на лисп и лисперов, но долго не продлилось. Но я бы не отнес эти посты к немусорным.

anonymous
()
Ответ на: комментарий от drBatty

А я про общий.

Тогда сформулируй этот общий случай, укажи какими свойствами он обладает, а то разговор какой-то беспредметный получается.

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

Есть ли в C массивы?

на этот вопрос нельзя ответить да/нет. Одно очевидно — полноценных массивов нет. Есть синтаксический сахар, который похож на массивы с виду, и который удобно использовать вместо настоящих массивов. Однако, их даже нельзя передать внутрь функции, ибо они ВНЕЗАПНО превращаются в указатели.

Какими «скиллами» должен обладать программист?

очевидно ЯП знать.

Управление памятью в ядре Linux и в частности: как определить наибольшее значение при котором malloc гарантированно не вернет NULL?

ответ на этот вопрос прост: нет такого значения.

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

Однако, их даже нельзя передать внутрь функции, ибо они ВНЕЗАПНО превращаются в указатели.

А в стуктуру заворачивать не пробовал?

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

Тут незадолго до твоего прихода, кто-то перевел обсуждение на лавсана и vsl.

да, я поржал. Но сказать мне на это нечего.

Все возражения аффтор отмёл заранее: «Но конечно, глупые неосиляторы мне будут говорить, <вставить что угодно> я клал на это, и на клал на выхлом этих неудачников». Что тут можно возразить?

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

ответ на этот вопрос прост: нет такого значения.

Ну учитывая то, что вопрос возник после того как superhackkiller1997 в своем посте заявлял об использовании разового вызова malloc с достаточно большим числом, то возникает вопрос: какое же число передавать malloc? Правда вопрос, пока, не к тебе.

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

Почему ты решил, что тип индекса должен быть ptrdiff_t?

в сишечке AFAIK запись a трактуется как *(a+i), при этом если a это указатель/массив, то i преобразуется в ptrdiff_t, если это возможно. Где-то в стандарте эта тема была раскрыта, но искать мне лениво.

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

Не можешь дать формального определения, так хотябы дай неформальное пояснение понятия о котором ты говоришь.

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

Однако, их даже нельзя передать внутрь функции, ибо они ВНЕЗАПНО превращаются в указатели.

А в стуктуру заворачивать не пробовал?

так и делаю. Но это лишняя сущность, ибо как только я объявил int a[5]; компилятор _знает_, что sizeof(a) это 5 int'ов, а вот при передаче он ВНЕЗАПНО забывает об этом. А почему?

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

Ну учитывая то, что вопрос возник после того как superhackkiller1997 в своем посте заявлял об использовании разового вызова malloc с достаточно большим числом, то возникает вопрос: какое же число передавать malloc?

у меня нет ответа.

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

Не можешь дать формального определения, так хотябы дай неформальное

уже дал: всё что угодно. Ну да, void и НЁХ в качестве индекса не подходят. Ещё что-то такое — тоже.

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

Где-то в стандарте эта тема была раскрыта, но искать мне лениво.

Тебе лениво, а я такого не нахожу. А нахожу я

The types are
     ptrdiff_t
which is the signed integer type of the result of subtracting two pointers;

и

When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object; the result is the difference of the subscripts of the two array elements. The size of the result is implementation-defined, and its type (a signed integer type) is ptrdiff_t defined in the <stddef.h> header. If the result is not representable in an object of that type, the behavior is undefined. In other words, if the expressions P and Q point to, respectively, the i-th and j-th elements of an array object, the expression (P)-(Q) has the value i−j provided the value fits in an object of type ptrdiff_t. Moreover, if the expression P points either to an element of an array object or one past the last element of an array object, and the expression Q points to the last element of the same array object, the expression ((Q)+1)-(P) has the same value as ((Q)-(P))+1 and as -((P)-((Q)+1)), and has the value zero if the expression P points one past the last element of the array object, even though the expression (Q)+1 does not point to an element of the array object. Another way to approach pointer arithmetic is first to convert the pointer(s) to character pointer(s): In this scheme the integer expression added to or subtracted from the converted pointer is first multiplied by the size of the object originally pointed to, and the resulting pointer is converted back to the original type. For pointer subtraction, the result of the difference between the character pointers is similarly divided by the size of the object originally pointed to. When viewed in this way, an implementation need only provide one extra byte (which may overlap another object in the program) just after the end of the object in order to satisfy the ‘‘one past the last element’’ requirements.

Разность указателей должна помещаться в ptrdiff_t, иначе будет Undefined behavior (о чем говориться во втором разделе приложения J).

anonymous
()
Ответ на: комментарий от drBatty

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

anonymous
()
Ответ на: комментарий от drBatty

разве это было при обсуждении лавсана, vsl, лиспа и лисперов? superhackkiller1997 в том обсуждении не участвовал, а сообщение явно в его духе.

anonymous
()
Ответ на: комментарий от drBatty

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

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

Разность указателей должна помещаться в ptrdiff_t, иначе будет Undefined behavior (о чем говориться во втором разделе приложения J).

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

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

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

anonymous
()
Ответ на: комментарий от drBatty

А стало быть,

С чего вдруг? Тебя же никто не заставляет считать разность между суммой и каким-либо ее слогаемым.

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

А еще, высказывалось интерестное мнение о том, почему для массива &m==m.

хрень какая-то. В таблице символов лежит адрес адреса первого эл-та массива, или адрес адреса того, на что указывает указатель. Потому *ptr == *array. Но хоть равны, но не эквивалентны, ибо sizeof(array) даёт таки размер array в char'ах, а вот sizeof(ptr) даёт размер одного указателя.

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

А почему ты так часто в разговоре ссылаешься на Екклесиаст?

это первый из известных мне источников, который описывал свойства void.

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

всё таки для массивов &m==m есть фича введения массив в язык как константных указателей известных на момент компиляции

как следствие несколько мозголомное &m== m ибо по сути константа(смещение для локального случая) не имеет отдельного места хранения при исполнении

qulinxao ★★☆
() автор топика
Ответ на: комментарий от drBatty

эквивалентны

Ты опять начинаешь отвечать на свои ассоциации? Прекращай уже разговаривать сам с собой.

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

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

массив это линейная структура в памяти без дырок. Соответственно индексировать массив можно любым целым числом сложенным с указателем на любой элемент массива, с учётом размера. Ну и в качестве базы может использоваться N'ый эл-т, которого не существует.

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

очевидно ЯП знать.

Очевидно этого недостаточно.

очевидно — да. Ещё надо иметь МПХ, или на край ЖПП ☺ Ну и много чего ещё.

drBatty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.