Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/89: Рейтинг темы: голосов - 89, средняя оценка - 4.71
1 / 1 / 0
Регистрация: 26.02.2011
Сообщений: 23

Каков максимальный размер массива?

25.10.2014, 16:20. Показов 18916. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я занимаюсь интегрированием на прямоугольных сетках, для записи значений в узлах сетки я использую тройной массив arr[][][].

программа ещё терпит, когда массив я задаю размером 45x45x45, однако 50x50x50 уже не поддерживается, прога выдаёт ошибку в винде. Хотелось бы иметь больше узлов сетки в будущем.

Как задавать массивы с большими размерностями, чем 45 45 45? Знаю, что указатель в общем-то задаёт 1d массив неизвестного размера, указатель на указатель- двумерный массив, указатель на указатель на указатель - 3-мерный массив. Правильно я думаю, что можно отказаться от записи arr[][][] и перейти на задание массивов указателями, чтобы можно было получить намного больше переменных при задании?

Можно какие-то мысли мне на этот счёт рассказать, ну и если можно - показать как правильно пишется. Да, ещё приходится передавать массив в функции.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2014, 16:20
Ответы с готовыми решениями:

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

Каков максимальный размер массива
Привет. Вот такой вопрос, надо работать с большим количеством данных. Если использовать массив или список, сколько максимально возможно...

Каков максимальный размер одномерного массива
Добрый день. Хочу узнать, можно ли создать в Visual Studio 2010 одномерный массив размером в миллиарды, скажем. (Например, целочисленный)....

36
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
27.10.2014, 14:59
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от taras atavin Посмотреть сообщение
Кстати, а какие такие принципиальные препятствия против построения стека не на массиве, но и на списке массивов? Не делают и не целесообразно - это да.
ШО?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
27.10.2014, 15:34
Цитата Сообщение от SmittWesson Посмотреть сообщение
ШО?
Кстати, а какие такие принципиальные препятствия против построения стека не на массиве, а на списке массивов? Не делают и не целесообразно - это да. А принципиальные?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
27.10.2014, 21:13
Цитата Сообщение от taras atavin Посмотреть сообщение
Кстати, а какие такие принципиальные препятствия против построения стека не на массиве, но и на списке массивов? Не делают и не целесообразно - это да.
В современных машинных архитектурах поддержка стека реализуется на уровне процессора. Команды процессора типа 'push', 'pop', 'call', 'ret' и т.п. внутренне выполняют простое увеличение или уменьшение регистра, содержащего адрес вершины стека. Чтобы это работало правильно, стек должен занимать неперерывную область адресов в адресном пространстве процесса.

Реализации эффективных языков предпочитают используют тот же самый стек. Размеется, никто не запрещает реализациям языков отказаться от использования аппаратного стека и реализовать свой собственный стек для хранения локальных переменных, в том числе и "на списке массивов". (Я не удивлюсь, если где-то такие уже есть). Но это будет ударом по производительности получаемого кода. А в С и С++ минимизация потерь проивордительности на вызове функции очень важна.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2014, 04:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В современных машинных архитектурах поддержка стека реализуется на уровне процессора.
Она всегда на уровне процессора. Ну и что?

Добавлено через 53 секунды
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Команды процессора типа 'push', 'pop', 'call', 'ret' и т.п. внутренне выполняют простое увеличение или уменьшение регистра, содержащего адрес вершины стека.
Потому что стек реализован на массиве.

Добавлено через 4 минуты
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
(Я не удивлюсь, если где-то такие уже есть). Но это будет ударом по производительности получаемого кода. А в С и С++ минимизация потерь проивордительности на вызове функции очень важна.
Я где то оспариваю не целесообразность? Но это не означает, что так сделать невозможно и поэтому стек должен быть зарезервированного размера. Наоборот, сам же говоришь, что возможно, утверждая, что стек может быть полностью динамическим. По факту так не бывает, потому что такой стек здорово накладен и всего делов.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
28.10.2014, 04:37
Цитата Сообщение от taras atavin Посмотреть сообщение
Она всегда на уровне процессора. Ну и что?
Да что вы говорите?

Никто мне не запрещает написать компилятор С, который вообще не будет использовать аппаратный стек для хранения локальных переменных. Вместо этого я могу реализовать собственный стек вручную: каждый кадр стека выделяется в начале исполнения функции через 'malloc' и освобождается через 'free' в конце.

В былые времена именно так это и делалось на машинах с очень ограниченным по размеру стеком. Более того, даже сейчас так делается на некоторых IBM менфреймах, где аппаратного стека нет вообще.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
28.10.2014, 16:29
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никто мне не запрещает написать компилятор С, который вообще не будет использовать аппаратный стек для хранения локальных переменных.
улыбнуло.
каждый кадр стека выделяется в начале исполнения функции через 'malloc' и освобождается через 'free' в конце.
Ещё больше улыбнуло.
В былые времена именно так это и делалось на машинах с очень ограниченным по размеру стеком.
Ухохотайчик, полный.
Более того, даже сейчас так делается на некоторых IBM менфреймах, где аппаратного стека нет вообще.
Так, всё. Я пацталом. И, читая эту тему, врядли выползу.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2014, 16:40
Цитата Сообщение от SmittWesson Посмотреть сообщение
улыбнуло.
Если этой глупости ни кто не сделал, то это ещё ничего не значит.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
28.10.2014, 16:48
Ух ты! Как аутентично сыгран образ фидошного пионэра. (Смахиваю слезу...)

Обращаясь к завсегдатаям: вот это заскорузлое создание выше - это официальный форумный тролль (похоже совсем недавно принятый на работу) или просто так что-то со стороны приползло?
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
28.10.2014, 16:49
Блин, а я то думал. А оно вот оно что!
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
28.10.2014, 21:17
Цитата Сообщение от taras atavin Посмотреть сообщение
Если этой глупости ни кто не сделал, то это ещё ничего не значит.
Как говорится, "вот и выросло поколение..." (с)

Архитектуры IBM 360/370/3080 не имеют встроенного стека и не имеют "стековых" инструкций. Например, инструкция вызова подпрограммы BAL/BALR сохраняет адрес возврата в указанный пользователем регистр. А если пользователю хочется иметь "традиционный" стек - он его будет организовывать сам и адрес возврата туда сбрасывать тоже будет сам, как и извлекать его оттуда.

При этом нативная реализация компилятора C для IBM 360 не использует "традиционный" стек в памяти для хранения локальных переменных. При каждом вызове функции, Activation Record (AR) для этой функции (т.е. блок локальных переменных) выделяется динамически и линкуется с предыдущим блоком в связный список.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 04:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Архитектуры IBM 360/370/3080 не имеют встроенного стека и не имеют "стековых" инструкций. Например, инструкция вызова подпрограммы BAL/BALR сохраняет адрес возврата в указанный пользователем регистр.
А если подряд много вызовов? Регистров не хватит.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
29.10.2014, 07:06
Цитата Сообщение от taras atavin Посмотреть сообщение
А если подряд много вызовов? Регистров не хватит.
Так а пользователя никто не заставлял хранить этот адрес именно в этом регистре. Хватает регистров - храни. Не хватает - сбрасывай в память. Куда именно сбрасывать - тоже сам решай. Полная свобода выбора.

Ключевой момент тут в том, что сбрасывание адреса возврата в память если и делалось, то делалось пользователем "вручную" при помощи явной отдельной команды, а не автоматически.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
29.10.2014, 08:32
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а пользователя никто не заставлял хранить этот адрес именно в этом регистре. Хватает регистров - храни. Не хватает - сбрасывай в память. Куда именно сбрасывать - тоже сам решай. Полная свобода выбора.
И для глюков. main сохранила адрес возврата в регистре, условно назовём его BX, вызвав некую f1, та вызвала f2, сохранив адрес возврата, условно говоря, в CX, а f2, не зная о том, какие регистры уже использованы, поместила в BX данные. Это при наличии стандартного стека можно ввести правило: все регистры перед использованием сохранять в стек. А когда его нет? Для того, чтоб выделить для сохранения регистров память через менеджер памяти, надо уже вызвать функцию выделения памяти и сохранить адрес возврата опять в регистр. Одно дело в каждом элементе списка отвести место у границы под адрес возврата из функции выделения памяти и зашить её вызов а микрокод по условию приближения к границе и отвести стандартный адрес, или регистр для хранения адреса функции выделения памяти, а совсем другое дело, когда ни каких соглашений нет. Ладно ещё если все три функции компилировались вместе. А если раздельно? Если их исходники в разных *.с файлах, а код в разных *.obj файлах? И уж совсем фигово, если функции разрабатывались разными людьми прямо на языке ассемблера. А если, как на спектруме, само приложение владеет всей памятью и само выделяет её себе для различных подзадач и конкретных данных, то ещё смешней: само существование функции выделения выделения памяти в этом случае на совести разработчиков приложения.

Добавлено через 8 минут
Я когда для спекрума на асме писал, то ни какими менеджерами памяти не заморачивался и выделял вручную безо всяких кавычек. От 40000 до 46143 - копия видеостраницы, 38987 - флаг направления копирования. И ЕЯННП с 30000 начинается сама функция копирования.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
02.11.2014, 04:39
Мужики. Вы, вообще, об архитектуре процессоров что-нибудь слышали?
Есть регистры общего назначения (РОН). В них можно делать пересылку, инкремент и декремент. Есть арифметический регистр. В нём производятся все вычисления: сложение, вычитание, сравнение.
Есть автоматические регистры. Регистр адреса команд и регистр стека.
Для управления регистром стека используются команды push - загрузить в стек, pop - вытащить из стека и call - вызов подпрограммы (автоматически сохраняется адрес возврата + 1).
При выполнении этих команд, вершина стека меняется.
К сведению несведующих. Стек был изобретён ещё тогда, когда ЭВМ-ы занимали по три гектара, а ОЗУ в 1Мбайт, весило около тонны. С тех пор, во всех без исключения процессорах, стек - неотъемлемая часть их архитектуры.

Добавлено через 20 минут
Да, чуть не забыл. В современных процессорах, есть ещё один тип памяти. Сверхоперативное ЗУ (СОЗУ), так называемый - кеш. Это вообще, интересная штука. Она напоминает стопку книг на столе. Читаем названия книг сверху вниз. Выбираем любую из стопки, но ложим книгу, только сверху стопки. Если нужной книги на столе (кеше) не окажется, берём её с полки (ОЗУ), но ложим в реш опять-же сверху. Если кеш при этом переполняется, удаляем из стопки, самую нижнюю книгу. В результате таких операций, на столе всегда будут находиться, наиболее используемые книги. Лишние, будут со временем выталкиваться на полку.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.11.2014, 11:36
Цитата Сообщение от SmittWesson Посмотреть сообщение
Есть регистры общего назначения (РОН). В них можно делать пересылку, инкремент и декремент. Есть арифметический регистр. В нём производятся все вычисления: сложение, вычитание, сравнение.
Нет. Или есть адресные регистры и арифметические регистры, или регистры общего назначения. Общего - это значит, что они сразу и индексные, и адресные, и арифметические.

Добавлено через 1 минуту
Цитата Сообщение от SmittWesson Посмотреть сообщение
но ложим книгу
Глагол "ложить" совершенного вида.
0
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
02.11.2014, 14:46
Цитата Сообщение от taras atavin Посмотреть сообщение
Общего - это значит, что они сразу и индексные, и адресные, и арифметические.
Не верно. Общего, это общего. В них могут храниться промежуточные данные, например, регистр косвенной адресации. Адрес в нём, может инкрементироваться, декриментироваться или вычисляться при помощи арифметического регистра. Так-же этот регистр может просто хранить данные, без адресации чего-либо.
Да, и ещё. Регистры общего назначения, могут выполнять операцию сложения, минуя арифметический регистр.
Но, есть регистры специального назначения. Как правило, они напрямую из программы не доступны или доступны в ограниченном объёме.
Так, в регистр стека, может быть загружена вершина стека, но инкрементировать и декрементировать его произвольным образом не получится.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
02.11.2014, 15:38
Цитата Сообщение от SmittWesson Посмотреть сообщение
Не верно. Общего, это общего. В них могут храниться промежуточные данные, например, регистр косвенной адресации.
Нет. Адресный регистр может использоваться только для косвенной адресации. Как регистр HL на Z80. Ну может он и поддерживает инкремент/декремент, но это максимум его арифметических способностей. А регистр EAX на пентиуме кроме того может использоваться в операциях сложения, вычитания, сдвига, поразрядной логики и ладе деления и умножения. Поэтому он и общего назначения. Регистр A на Z80 для косвенной адресации не применим, он может использоваться только в логических, сдвиговых и арифметических операциях и быть приёмником/источником в операции LD (аналог mov) и в операциях с портами, но адресовать по нему нельзя.

Добавлено через 7 минут
Цитата Сообщение от SmittWesson Посмотреть сообщение
Так, в регистр стека, может быть загружена вершина стека, но инкрементировать и декрементировать его произвольным образом не получится.
Из него даже вычесть командой sub суммарный размер локальных переменных и то можно. Это регистр-указатель, но не потому, что с ним не работают не стековые операции, а потому, что что с ним не делай, в нём всё равно хранится адрес, имеющий одно постоянное назначение. Тоже относится к регистру IP: вряд ли с ним работают обычные арифметические операции, но это и не важно, зато в нём всегда хранится адрес постоянного назначения. У регистра SP это адрес текущей вершины стека, а у регистра IP это адрес текущей операции.

Добавлено через 8 минут
Регистр SP, хоть и специализирован для работы со стеком, всё-таки является регистром общего назначения, который можно использовать в любых командах, в том числе и арифместических.
Программирования на яыке ассемблера IBM PC. М.: "Диало-мифи". 1999. 286 с.

Добавлено через 3 минуты
Хотя на самом деле есть одно исключения: есть операции, выполняемые только с некоторыми регистрами: MUL, IMUL, DIV, IDIV имеют фиксированный первый операнд, стековые операции закреплены за SP, а операции перехода за IP. Но регистр является регистром общего назначения, то все не закреплённые за конкретными регистрами операции с ним можно выполнять.

Добавлено через 1 минуту
Цитата Сообщение от SmittWesson Посмотреть сообщение
регистр стека, может быть загружена вершина стека,
Не может. Загружена - это значит, что её там не было, а потом её туда загрузили. А в регистре SP вершина стека находится всегда. Изменить текущую вершину, изменив значение регистра SP, можно. А загрузить в него вершину стека нельзя.

Добавлено через 4 минуты
Цитата Сообщение от SmittWesson Посмотреть сообщение
Да, и ещё. Регистры общего назначения, могут выполнять операцию сложения, минуя арифметический регистр.
Нет. При наличии регистров общего назначения нет специализированных арифметических регистров. Регистров в процессоре слишком мало, что иметь и несколько регистров для всех команд, и ещё несколько регистров только для арифметики. Поэтому если уж есть регистры общего назначения, то они и есть арифметические, но общего назначения они потому, что они не только арифметические.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2014, 15:38

Каков максимальный размер динамического массива объектов?
подскажите пожалуйста, какое максимальное к-во объектов класса можно создать при таком описании класса? class MyClass { private: ...

Подскажите пожалуйста каков предельно максимальный размер БД Access
Подскажите пожалуйста каков предельно максимальный размер БД Access Спасибо!

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

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

Максимальный размер массива
Добрый день! Получил задание от преподавателя количественно измерить производительность математических пакетов Matlab, MatCad и Excel....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru