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

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

28.11.2015, 20:38. Просмотров 588. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2015, 20:38
Ответы с готовыми решениями:

Переполнение стека
Хочу полюбопытствовать. Вычитал недавно, что на стек выделяется ограниченная область памяти, и в...

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

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

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

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

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

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

Добавлено через 1 минуту
Melg, спасибо за исправления! Буду знать теперь!
0
6912 / 5977 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
28.11.2015, 21:19 7
Вектор не по ссылке, что ли, передаётся?
0
541 / 162 / 79
Регистрация: 23.09.2013
Сообщений: 316
28.11.2015, 21:20 8
M4753, Вы можете привести конкретные сигнатуры библиотечных вызовов, и написанных Вами функций? Вы можете четко для себя и для честной публики ответить, зачем Вам нужно конвертировать float в unsigned char? Что хранится в исходном float-e? Что хранится в преобразованном char-е?
0
2 / 2 / 0
Регистрация: 24.04.2015
Сообщений: 102
28.11.2015, 21:31  [ТС] 9
Сейчас опишу ситуацию.

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

Код слишком большой.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.11.2015, 21:31

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

Переполнение стека
Доброго времени суток, форумчане! Начинаю плюсы осваивать, подскажите, безопасен ли код: ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.