Среда, 27 Ноября 2024, 08:04

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как создать массив произвольного размера в стеке?
PesetsДата: Среда, 04 Мая 2011, 22:18 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Задали тут задачку... думаю, дай у народа спрошу - мб знает кто)
Такая проблема - надо на С (стандарт С89) выделить в стеке массив произвольного размера. Ассемблерную вставку делать нельзя. В куче выделять тоже нельзя) Перейти на C99 тоже)
Пока единственное, до чего догадался - использовать alloca. Но ее тоже не желательно. Мб кто-нибудь знает другой способ?

Добавлено (04.05.2011, 22:18)
---------------------------------------------
Что-то мне подсказывает, что правильный ответ - "нет ответа") Либо alloca, либо asm-вставка, либо C99.



noTformaTДата: Среда, 04 Мая 2011, 22:36 | Сообщение # 2
Ukrainian independent game developer
Сейчас нет на сайте
Quote (Pesets)
нет ответа

это из за
Quote (Pesets)
С89


@noTformaT
UndeadДата: Четверг, 05 Мая 2011, 12:55 | Сообщение # 3
NeoAxis User
Сейчас нет на сайте
Quote (Pesets)
Задали тут задачку... думаю, дай у народа спрошу - мб знает кто)

Может быть кто и знает. Но тот кто знеает скорее всего здесь больше не обитает. Спроси на каком нибудь форуме с матёрыми сишниками. Или попробуй ещё на Gamedev.ru поспрашивать.


Вcем зла.
froexДата: Суббота, 07 Мая 2011, 01:34 | Сообщение # 4
Руководитель Froexilize team
Сейчас нет на сайте
Я начал работать со стандарта С99, поэтому не вникал в более первобытные истоки вроде С89. Если мне не изменяет память, то массивы переменной длины ввели именно в С99.
Pesets, alloca я бы не советовал, да и смысла маловато - много памяти не выделишь, да и в циклах проблемы могут возникнуть. В С89 ещё не было структур вроде, это тоже усложнит задачу с организацией своего массива, а то можно было бы сделать массив массивов и переопределить вторые скобки... У меня есть совет - использовать минимум С99. Где же это понадобилось динозавров копать? Единственное, что на ум пришло - старые контроллеры.


Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее.
Алгоритмы, программирование, оптимизация, тестирование, ведение проектов.
Ищу художника, дизайнера, тестера, программистов С и С++
Обучаю процессам разработки и программированию.
Black_LordДата: Суббота, 07 Мая 2011, 08:00 | Сообщение # 5
был не раз
Сейчас нет на сайте
Quote (froex)
Если мне не изменяет память, то массивы переменной длины ввели именно в С99.

Quote (froex)
В С89 ещё не было структур вроде, это тоже усложнит задачу с организацией своего массива, а то можно было бы сделать массив массивов и переопределить вторые скобки...

biggrin Пишите еще.

Quote (froex)
У меня есть совет - использовать минимум С99. Где же это понадобилось динозавров копать? Единственное, что на ум пришло - старые контроллеры.

C99 несовместим с C++ (в отличие от C89, он же ANSI C), из-за чего не поддерживается некоторыми компиляторами. Поэтому часто используется именно C89.

Pesets

Quote
Стек (англ. stack — стопка) — структура данных, в которой доступ к элементам организован по принципу LIFO (англ. last in — first out, «последним пришёл — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху). Удаление элемента, называемое также выталкиванием (pop), тоже возможно только из вершины стека, при этом второй сверху элемент становится верхним.

http://ru.wikipedia.org/wiki/Стек

Не понимаю, в чем проблема. Помещаешь в цикле for в стек все элементы массива, а затем - их количество. Ну и при извлечении наоборот - извлекаешь количество элементов и после этого сами элементы (в обратном порядке), опять же в цикле. Какая куча? Какой alloca? Какой C99?! surprised

З.Ы. Керниган и Ричи "Язык программирования Си" - хороший учебник по C для начинающих.




Сообщение отредактировал Black_Lord - Суббота, 07 Мая 2011, 08:08
PesetsДата: Суббота, 07 Мая 2011, 11:14 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Ох... Ну, всем спасибо, в итоге я поюзал-таки alloca, меня потроллили, но все закончилось хорошо)

Quote (froex)
Pesets, alloca я бы не советовал, да и смысла маловато - много памяти не выделишь, да и в циклах проблемы могут возникнуть.

Ну, в пределах нескольких килобайт она вполне нормально работает, а больше мне и не надо. А проблемы возникают вовсе не в циклах, а в вызовах функций и портируемости.
Quote (Black_Lord)
C99 несовместим с C++ (в отличие от C89, он же ANSI C), из-за чего не поддерживается некоторыми компиляторами. Поэтому часто используется именно C89.

Да-да, оно самое. Поэтому C99-массивы не катили.
Quote (Black_Lord)
http://ru.wikipedia.org/wiki/Стек

http://en.wikipedia.org/wiki/Data_segment
Ну, я надеялся, по контексту будет понятно, что под "стеком" понимается сегмент, а не абстрактная структура данных.
Quote (Black_Lord)
З.Ы. Керниган и Ричи "Язык программирования Си" - хороший учебник по C для начинающих.

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



  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг