![]() |
|
|
![]()
|
|
| kometa_triatlon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Мне нужно считать текст из RichEdit'a в массив строк - построчно.
Нашел такой более-менее способ из мсдн. Но результат...
Вот, что у меня в едите:
А вот, что я получаю, когда вывожу массив:
Кроме того, кириллица превращается в ???. Ну да то ладно, не важно... А чего ж так получается? Или есть способ получше считать текст в массив? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||
|
|||||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
1.А в сам эдит ты строки чем заносишь? Случаем не из массива тоже копируешь?
2. И в чем ты просматриваешь массив? Я к чему...К тому, что если строка представлена видом char[n_bytes], то в таких строках надо принудительно ставить конец строки, например, нулевой символ. Тогда и отладчик, и всякие функции типа sprintf и симейство будут видеть эти строки нормально. А когда конец строки не виден, то как раз лезет мусор из памяти. А "дырки" в памяти за границами диапазона массивовкак правило заполняются этой гадостью вида "MMMMM...." Короче, проверь, не нуждается ли твой код в символах окончания строки.... -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Знаешь, такие мысли были...
Как заношу в едит?
Добавлено @ 20:31 А как принудительно добавить '\0'? strcat(strCode[i],'\0'); вылетает с ексепшном, strCode[i][strlen(strCode[i])] = '\0'; результата не дало -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Dreamer_0x01 |
|
||||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
а если так: ?
и здесь
Попробуй!!! Это сообщение отредактировал(а) Dreamer_0x01 - 20.9.2005, 20:54 -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
неа...
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Кoнечно вылетает Эти функции ведь ищут тот же символ '\0'для распознания конца
слова. А тебе надо искать '\n'. Добавлено @ 21:10 Чтото вроде этого
или вот функция для того же самого
|
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Частично решил так:
Точнее почти полностью. Почти потому что иногда теряется символ '\n' в конце строки. Другая проблема серьезнее. Если файл довольно большой, вылетаю с абортом Хотя какой там большой... 300 строк уже не катит... Добавлено @ 21:17 sergej.z А зачем мне заменять символ перехода на конец? Тогда в другом окне я получу одну длинную строку. -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| sergejzr |
|
||||
![]() Un salsero Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: нет Всего: 360 |
Это в последней строке файла. Из за того и abort что там он ищет переход, а его нет. и так до конца памяти Добавлено @ 21:21
Posle сложения строк заменишь 0 обратно на переход. Это же элементарно. |
||||
|
|||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
sergej.z
А вот и не в последней строке А насчет аборта... Там с памятью проблемы. Что пишет: File: dbgheap.c Expression: _CrtCheckMemory() Ну это опять же с более-менее большими файлами. Может, массив не помещается? -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| The Thing |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: 1 Всего: 3 |
Посмотри дебугером.... строка копируется в массив нормально?
Именно после первого прогона... так как скорее всего ты действительно попал на \0, а надо на \r\n
-------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
|||
|
||||
| Dreamer_0x01 |
|
|||
![]() Терминатор ![]() ![]() Профиль Группа: Участник Сообщений: 780 Регистрация: 14.4.2005 Где: Санкт-Петербург Репутация: 9 Всего: 12 |
strCode[i][nLineLength]=0;
А здесь ты не вылез за границу массива? не nLineLenth-1 надо делать разве??? -------------------- Нет ничего невозможного. Есть цели, и есть время и силы на их достижение. |
|||
|
||||
| kometa_triatlon |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Dreamer_0x01
Не вылез, я памяти на байт больше выделяю
Гм. На самом деле, глюк спрятался здесь:
Протрассировал, строки копируются нормально, а когда освобожаю память, вылетаю... The Thing А строки копируются просто удивительно. Как хотят На входе:
На выходе:
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||||
|
|||||||||
| kometa_triatlon |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Я тут еще кое-что заметил...
Как-то странно работает m_editCode.LineLength(i); - все время возвращает одно и тоже значение - длину первой строки. И если остальные длиннее - получается обрезание Такой текст
Превращается в такой:
Интересные вещи происходят. GetLine возвращает количество скопированных символов, nLineLength в данном случае ограничитель.
И это при том, что я вызываю nLineLength = m_editCode.LineLength(i); в начале цикла. Я как-то неправильно с этой функцией работаю? Почему каждый раз одни и те же значения??? Это сообщение отредактировал(а) kometa_triatlon - 21.9.2005, 21:44 -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
||||||
|
|||||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
kometa_triatlon
Во -первых если уже взялся за МФС, то давай полностью МФС( взялся танцевать с дьяволом, танцу до конца)! У меня сейчас РЕАЛЬНО мало времени, поэтому многие топики без ответов и не т времени код смотреть, но вот лови-может поможет. Там с комментариями.. Присоединённый файл ( Кол-во скачиваний: 7 )
ExampleRE.rar 38,22 Kb-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Coocky
Посмотрел пример, кой-чему научился Ну, только что переписал функцию, вроде все работает, но есть небольшая (и не новая) проблема. Вылетаю при попытке освободить память, выделенную под массив для текста кода. Скажите, если я выделяю память под двумерный динмассив, как ее правильно освободить? Достаточно delete [] arrSzCode; ? Потому что вылетаю именно на : for(int j=0; j<nLineCount; j++) delete [] arrSzCode[j];
-------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
kometa_triatlon
Второй раз говорю-пользуйся МФС методами--т.е. CString классом. Что тебе конкретно надо (извини, но немного не понял, распиши плиз, что ты ХОЧЕШЬ сделать со строкой?) Все сделаем через МФС -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Coocky
Освободить от нее память. CString... Да мне он и не нужен, все и так работает прекрасно, мне придется много переписывать. Проблема одна: как освободить правильно память от массива char **arrSzCode ?
Это конечно в раздел С++, но все же... -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
kometa_triatlon
А я в третий раз Что нуна? Добавлено @ 15:43 И кажется, надо не delete [] arrSzCode[j]; delete arrSzCode[j];eckb d wbrkt Уже и сам забыл... -------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не достаточно, нужно в цикле, как ты и делаешь, но можно просто delete вместо delete[], в обоих случаях. Вылетаешь ты, 100%, потому что где-то одна строка залазит на место другой и портит информацию, которую ожидает найти при освобождении отладочная версия delete. Точнее, смотри, на освобождении какой строки вылетел - предыдущая и испортила память. Это если они выделяются подряд, что не факт. Но если все блоки одинаковой длины, то так. Ищи блох, короче. Или последуй совету Coocky и перепиши все на строки - это, скорее всего, быстрее будет. -------------------- ... |
|||
|
||||
| kometa_triatlon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 384 Регистрация: 7.1.2005 Где: Киев Репутация: 1 Всего: 6 |
Coocky
Ну дай ребенку поиграться с памятью! Хотя наверное придется переписать... Справлюсь и сам, но все равно буду делать динамически, все-таки я в массив файл считываю. Earnest Поковырялся немного, интересная ситуация... Вылетаю на последней строке или где-то в районе. Открывает мне файл dllheap.c и тычет мордой в функцию CheckBytes(). Диагноз понятен )) Попробовал уменьшить кол-во строк в цикле,
но если открыть файл побольше, то не канает, а с десятью строками и так справляется. Такие пироги... Ну все, иду переписывать. Это сообщение отредактировал(а) kometa_triatlon - 26.9.2005, 18:26 -------------------- Всё очень просто: сказки обман, Солнечный остров скрылся в туман, Замков воздушных не носит земля, Кто-то ошибся, ты или я. -------------- Программирование - самое большое удовольствие, которое вы можете получить, будучи одетым. |
|||
|
||||
| The Thing |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 286 Регистрация: 6.9.2004 Репутация: 1 Всего: 3 |
Что не понятно спрашивай...
-------------------- Правильность работы программы зависит от двух велечин. В нужном месте должны стоять нолик и еденичка. |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |