Форум программистов, компьютерный форум CyberForum.ru

Перезапись строки и Bad_alloc - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Функция редактирования строк http://www.cyberforum.ru/cpp-beginners/thread644531.html
Доброго времени суток. Столкнулся со следующей проблемой: void Erase(char **str, int pos, int n) { char *newstr1, *newstr2; newstr2 = *str; int i = 0, len; len = strlen(newstr2); if (len >= pos + n) { newstr1 = new char;
C++ Опишите класс "Вектор" 1. Опишите класс "Вектор". Данные класса: координаты начала и конца вектора. Методы класса: должны обеспечить минимальную функциональность объекта. 2.Перегрузите операцию сложения векторов с использованием операции - метода класса, а операцию вычитания с использованием дружественной ф-ии. 3.Перегрузите унарную операцию ++ для инкремента вектора как метод класса, а-- как дружественную... http://www.cyberforum.ru/cpp-beginners/thread644494.html
C++ Конвертирование в wstring&
Всем привет! Не могу понять почему невозможно конвертировать из wchar_t в wstring& Вызов метода client -> CompareTwoString( iteratorclient -> nameclient, positionclient ,lenghtname ); функция bool CompareTwoString( wstring &one, wstring &two, int position ) { //something
C++ В строке с найти количество слов не содержащий подстроку
В строке с найти количество слов не содержащий подстроку с2 вывести эти слова где с2=аб
C++ Матрицы: поменять местами первую строку и строку, содержащую максимальный элемент http://www.cyberforum.ru/cpp-beginners/thread644409.html
1)В матрице поменять местами 1 строку и строку содержащие последнее вхождение элемента максимального где максимальный- максимальный элем всей матрицъ вывести итоговую матрицу. 2)В матрице обнулить Все строки содержащие элемент мин более одного раза мин минимальный элемент всей матрицы вывести итоговую матрицу
C++ Двузначное число разделить на две позиции в массиве у меня есть действительные числа в массиве от 1 до 15. Как сделать так что бы начиная с 10, десять стояла не на одной позиции, а разделилось на две, то есть что бы 10 делилась на 1 и на 0, что бы на 9 позиции стоит 1, а на 10 стоит 0. подробнее

Показать сообщение отдельно
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
31.08.2012, 12:22  [ТС]     Перезапись строки и Bad_alloc
Intel~lect, даже если делать проверку, то я все равно в минусе, ибо нужно выделить память, а послать на new в циклу while (bad_alloc) - не катит. Здесь все должно отрабатывать нормально.
Хотя может есть какой-то способ встать в ожидание памяти помимо while? Тогда было бы ясно - ошибка в кол-ве памяти или ещё в чем-то?

novi4ok, BOOL - это unsigned int в WinApi. Любая функция должна возвращать значение о корректной работе (в моей понимании). Кто знает, может я добавлю ещё чего внутрь и придется возвращать уже PROCESS_FAILED?
strlen(something)+1 - кол-во символов в строке something + ещё 1 символ для перехода на позицию ЗА \0, чтобы не затереть её.
Я не знаю, что объяснять в алгоритме, ибо, возможно, написан он "не красиво", но на самом деле все просто.

p.s В изначально _r_history хранятся строчки вида "............\0.........\0..........." - как видно, все три нуль-терминантные.
И ещё, входное сообщение никогда не больше выходного. Входное сообщение максимум 1000 символов, таким образом невозможно добиться зацикливания.

Так же пример :
Допустим, у меня сейчас ROOM_HISTORY_SIZE = 10. Макс. кол-во символов в приходящей истории 5. Вот пример.
Имеется история :
123
44
Приходит сообщение
12345 // !Overfilling!
Я прохожу по первой строчке и вычитаю прибавляю её длину к переменной erasableHistorySize (история для удаления).
Если теперь (после вычитания этой длины) длина истории пришла в норму (входит в буфер), то я перезаписываю её.
Окончательная история в этом случае :
44
12345

Замечу, что если к этому сообщению добавить ещё :
34567
то ответ будет :
34567
ибо у меня стоит проверка не на >, а на >=ROOM_HISTORY_SIZE


Добавлено через 3 часа 35 минут
up-to-date

Добавлено через 2 часа 8 минут
Похоже смог разобраться с проблемой. А она была в той самой строчке:
strcpy_s(shiftHistory+shiftPos, ROOM_HISTORY_SIZE, _r_history+erasableHistorySize+shiftPos);
Я думал, что второй параметр - макс. кол-во символов к считыванию, а значит оно не так уж и важно, но нет. Так как (первый параметр) shiftHistory имеет размер ROOM_HISTORY_SIZE, то из второго параметра нужно было вычитать shiftPos. Так уж вышло, что я интуитивно делал это во всех других strcpy_s, а тут не сделал, и вот результат. Выделение памяти с bad_alloc видимо происходило из-за того, что я выделял уже выделенную (или перезаписанную) память при размере ROOM_HISTORY_SIZE (без -shiftPos).
 
Текущее время: 04:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru