Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102

Переполнение стека

28.11.2015, 20:38. Показов 1212. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем добрый вечер. Я создаю вектор, который имеет большой размер: порядка 256000000. Этот вектор имеет тип float, т.к. функция, куда я передаю по ссылке этот вектор, принимает на вход вещественный массив и заполняет его значениями. На этом первый этап закончен. Все работает.

На втором этапе мне нужно этот вектор передать в другую функцию, которая вместо float принимает unsigned char!
Изначально я все делала по-глупому: я создавала ещё один массив типа unsigned char и с помощью явного преобразования получала массив типа unsigned char:

C++
1
buf_[i] = (unsigned char)buf[i];
Все работало. Но работало все с маленькими данными! Т.е. массив был порядка 10000 элементов.

Как я поняла: при больших размерах стек переполняется и уже нет места запихнуть туда ещё один массив размером
256000000!

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

C++
1
buf[i] = (unsigned char)buf[i];
Вылета нет, но результат не тот, который нужен! Потому что buf как был типа float, так им и остался, а мне нужен unsigned char.

Мыслей по этому поводу нет, как поступить! Помогите советом!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.11.2015, 20:38
Ответы с готовыми решениями:

Переполнение стека
Хочу полюбопытствовать. Вычитал недавно, что на стек выделяется ограниченная область памяти, и в языке Си это 4 Кб. Вопрос: Если мне...

Переполнение стека
Есть функция f(): void f() { //... std::make_pair<size_t, size_t> pairReturner(); //... } Если пускать ее в цикле от...

Переполнение стека
Добрый вечер! Я пытался решить следующую задачку: Петя и Вася часто играют в различные логические игры. Недавно Петя поведал Васе о...

8
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
28.11.2015, 21:08
M4753, если Вам необходимо обрабатывать 256 000 000 объектов типа float и если на Вашей системе тип float занимает 4 байта (можно узнать, например, используя выражение sizeof(float); тогда только для хранения подобного массива потребуется примерно 976 мегабайт оперативной памяти.
Вектор хранит свои элементы не на стеке, а в куче. Стек размером 976 метров по умолчанию для программы был бы не доступен в любом случае. Скорее всего у Вас просто заканчивается память, доступная приложению для работы. Если бы Вы предоставили полный код программы, можно было более конкретно обсудить возможности для решения Вашей проблемы.
Общие советы могут быть следующими:
1) исключить лишние копирования векторов, если они алгоритмически не требуются
2) понять, почему у Вас в системе, часть работы идет с типом float (число с плавающей точкой) а часть с unsigned char(без знаковый символьный) Эти типы имеют и разный размер (например: float - 4 байта, char 1 байт), так и разное назначение, и способ интерпретации. Привести программу к виду, работы с согласованными типами, либо точно выяснить какие преобразования необходимо совершать, для корректного перевода из одного типа в другой, исходя из предметной области решаемой задачи.
3) Возможно следует не пытаться сразу генерировать огромный массив, хранить его в памяти, а потом обрабатывать в других функциях, а генерировать маленькие его части (или вообще по 1 элементу) - сразу их обрабатывать, и потом уже каким-то образом складировать в памяти, если это необходимо
4) Возможно следует не пытаться хранить огромный массив в оперативной памяти, после его генерации - а сохранить его в долговременной памяти (например на диске в виде файла) - и при дальнейшей обработке - считывать из этого файла некоторые части данного массива данных.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.11.2015, 21:14
976 не так много для современного компьютера и есть же файл подкачки.
А вот зачем преобразовывать float в unsigned char не понятно. Может там сразу можно unsigned char использовать тогда?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
28.11.2015, 21:15  [ТС]
Спасибо! Идея с обработкой по частям понравилась. Попробую реализовать! Спасибо!

Добавлено через 30 секунд
Все это мне нужно в следующей задаче: я создаю tif изображение с помощью библиотеки libtiff. И мне нужно конвертировать tiff 32 битный float в 8 битный unsigned char.
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
28.11.2015, 21:16
Небольшие ремарки в дополнение:
Этот вектор имеет тип float,
Вектор не может иметь тип float. Вектор, если мы говорим о векторе из стандартной библиотеки шаблонов - std::vector - это шаблонный класс, который пользователь может инстанцировать явным образом указав тип, для которого нужно создать конкретную реализацию вектора. Таким образом тип объекта вектора, созданного для хранения элементов типа float, будет std::vector<float>.
втором этапе мне нужно этот вектор передать в другую функцию
Необходимо помнить, что если вы передаете вектор в другую функцию по значению - будет создана локальная копия вектора, содержащая все элементы исходного вектора, и на время выполнения данной функции системе потребуется памяти x2 относительно исходного размера памяти, вектора.

при больших размерах стек переполняется
Обычно у новичков стек переполняется при бесконечных рекурсивных вызовах, либо попытках выделить обычный массив элементов неадекватно большого размера. Скорее всего в Вашем случае заканчивалось адресное пространство, доступное для программы для выделения объектов в куче.
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
28.11.2015, 21:18  [ТС]
Т.е. я сперва копирую всю инфу с первого изображению и потом записываю его во второе.

Добавлено через 1 минуту
Melg, спасибо за исправления! Буду знать теперь!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.11.2015, 21:19
Вектор не по ссылке, что ли, передаётся?
0
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
28.11.2015, 21:20
M4753, Вы можете привести конкретные сигнатуры библиотечных вызовов, и написанных Вами функций? Вы можете четко для себя и для честной публики ответить, зачем Вам нужно конвертировать float в unsigned char? Что хранится в исходном float-e? Что хранится в преобразованном char-е?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
28.11.2015, 21:31  [ТС]
Сейчас опишу ситуацию.

Добавлено через 8 минут
Я использую библиотеку libtiff, чтобы из 8-битного изображения получить 32-битное... Я делаю следующим образом: с помощью функций libtiff копирую весь массив, который хранится в изображении в свой вектор, который имеет тип unsigned char. Затем создаю 32 - битное изображение и туда мне нужно записать тот же самый вектор, но типа float. Если передать в фукнцию libtiff вектор unsigned char, то бред получится.

Код слишком большой.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2015, 21:31
Помогаю со студенческими работами здесь

Переполнение стека
Привет народ. Такой вопрос: Если в общем виде: if (условие) double d else double d почему компилятор отказывается выполнять такое с...

Переполнение стека
Доброго времени суток, форумчане! Начинаю плюсы осваивать, подскажите, безопасен ли код: #include &lt;stdio.h&gt; int main(int...

Переполнение стека
Всем привет. Помогите, пожалуйста с решением одной проблемы. Мне нужно в программе обрабатывать большие объемы текста. 10 000 000 символов....

Рекурсия - переполнение стека
Помогите написать,задание ниже#include &quot;stdafx.h&quot; #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt;...

Реализовать переполнение стека
Помогите пожалуйста: Задали написать программу, где будет переполнение стека ( если съедает оперативной памяти больше, чем я выделил, то...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru