![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Вот мой код:
Переменная szStr приходит из WinMain (это lpCmdStr). На самом деле в том месте где происходит присваивание, *szTemp точно содержит пробел, то есть * не разывеновывает указатель на не проинициализированную область памяти, соответственно и присваивание тоже законно, но по какой-то причине именно в этом месте вылетает исключение -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| Nimbus |
|
||||||||
|
Unregistered |
IMHO, видимо, проблема заключается вот в этой строке:
Объясняю, почему: в строке
была выделена память в области динамического обмена, указатель szTemp содержит теперь АДРЕС начала выделенной области памяти. Затем, в строке
этому указателю присваивается адрес хр$н знает какой области памяти, которая, кстати, может быть УЖЕ использована для других целей! ...и затем, в эту хр$н знает какую область памяти, ты записываешь в строке
символ окончания строки '\0' !!! По твоему, это корректно??? |
||||||||
|
|||||||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Только не понятно - зачем там было создавать и копировать строку ?... Задумка не совсем ясна - надо обрезать исходную строку или же обрезать скопированную строку ? У меня такой код обрезает справа пробелы в szStr нормально, без ошибок:
PS: есть функция StrTrim... -------------------- С уважением, г-н Посол. |
||||
|
|||||
| Nimbus |
|
|||
|
Unregistered |
Признаю, насчет
ПОГОРЯЧИЛСЯ, но постойте, куда же девался post от mr.DUDA (так, кажется, его зовут?) |
|||
|
||||
| Олег М |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
[quote]LPSTR CMyDoc::mMyTrim(LPSTR szStr){
//MessageBox(NULL, szStr, "", MB_OK); size_t nStrLen = 0; StringCchLength(szStr, 4096, &nStrLen); LPSTR szTemp = new CHAR[nStrLen+1]; StringCchCopy(szTemp, nStrLen, szStr); szTemp = szStr + nStrLen -1; // First trim spaces on the right while( (szTemp >= szStr) && (*szTemp == ' ') ) *szTemp = '\0';//Здесь и возникает ошибка Какой-то хитровыдуманный способ. Но впринципе дожно работать. Только здесь надо
и можно попрощаться с началом строки - хрен потом найдёшь. Ну да ладно. И проверять надо, чтоб nStrLen!=0. И чтоб строка из одних пробелов не состояла - то начало-то потеряялось. И цикл чуть-чуть переделать
Атак всё круто. Иногда даже будет работать |
||||
|
|||||
| AndyY |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 316 Регистрация: 8.5.2004 Где: СПб Репутация: 2 Всего: 4 |
думаю действительно lpCmdStr лежит на страничке с атрибутами PAGE_READONLY и при попытке ее модифицировать и происходит exception.
надо не так: szTemp = szStr + nStrLen -1; а так: szTemp = szTemp + nStrLen -1; только начало строки действительно теряем |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
2Nimbus
Твоя мысль ясна и поэтому я несколько переделал алгоритм, дабы избавиться от подобных недорозумений, и хоть он получился несколько плосковатым, зато по-мойму стал более безопасным 2p0s0l Ради одной функции StrTrim подрубать библу слишком жирно 2Олег М Насчет nStrLen!=0 согласен, но менять условия цикла я не стал, так как есть вероятность того что байт перед 0-м символом строки тоже окажется пробелом и тогда будем считать левые пробелы лежащие где - то там... 2AndyY
Не думаю, я в одном случае получаю строчку из "Configuration Properties > Debugging > Command Arguments" проекта, а второй раз из самой командной строки, а результат один и тот же. Это сообщение отредактировал(а) Royan - 6.7.2004, 14:45 -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| Nimbus |
|
||||
|
Unregistered |
И что, это работает?!
А где же тип переменной szTemp? ...хотя, если она была уже объявлена где-то... И вот это ещё:
В данном случае, IMHO, переменная nLastPos ВСЕГДА будет равна 0 (что-то я не просёк, где nStrLen присваивается хоть что-то после инициализации нулём). Но, как я подозреваю, задумка была совсем иной! Остальное проверю завтра, а то поздно уже... |
||||
|
|||||
| Nimbus |
|
|||
|
Unregistered |
...да, похоже на сервере со временем что-то (на моих часах 01:11)???
|
|||
|
||||
| Nimbus |
|
|||
|
Unregistered |
...да, похоже на сервере со временем что-то (на моих часах 01:11)???
|
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Да уж, точно - изобрёл. Велосипед с треугольными колёсами. Ты её хоть скомпилировал? О запуске речи пока и не идёт |
|||
|
||||
| Royan |
|
|||
|
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Прошу прощения вот правильный вариант (то что выше писалось на работе из головы поэтому и наделал ошибок)
Это сообщение отредактировал(а) Royan - 7.7.2004, 14:02 -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
| Олег М |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 436 Регистрация: 10.6.2004 Где: Москва Репутация: 7 Всего: 7 |
Нормально только надо {if(nLastPos == 0) { return ""; }
как вариант (тоже из головы) - почти тоже самое
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |