Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка в программе, использование new/delete 
:(
    Опции темы
SergMilk
Дата 30.7.2009, 13:17 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 29.4.2009

Репутация: нет
Всего: нет



Привет! 
Дублирую пост с ixbt...


 Подскажите, пожалуйста, по-поводу new и delete.

Попытался написать функцию с динамическим массивом, компилируется, но во время работы выдает ошибку :(
Код

CString RemoveUselessSymbols(CString cTextToClear)
{    //function removes all symbols except 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,A,B,C,D,E,F
    int Limit;
    
    char *TextBuffer;    
    TextBuffer = new char [cTextToClear.GetLength()];
    
    sprintf(TextBuffer,"%s",cTextToClear);
 
    Limit = cTextToClear.GetLength();    
    cTextToClear = "";
    for(int i=0;i<Limit;i++)    {
        switch (TextBuffer[i])
        {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case 'a':
        case 'b':
        case 'c':
        case 'd':
        case 'e':
        case 'f':
        case 'A':
        case 'B':
        case 'C':
        case 'D':
        case 'E':
        case 'F':
            cTextToClear+=TextBuffer[i];
            break;        
        }
    }        
    
    delete [] TextBuffer; // am I deallocating memory right way?
    return cTextToClear;
}
[img=458x191, 8,9Kb]http://webemployee.narod.ru/files/debugerror.png[/img]
Подскажите, никак не могу поправить ...

Спасибо!
PM MAIL   Вверх
zim22
Дата 30.7.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(SergMilk @  30.7.2009,  13:17 Найти цитируемый пост)
CString

это MFC. 
форум  по MFC здесь


--------------------
PM MAIL   Вверх
azesmcar
Дата 30.7.2009, 15:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(SergMilk @  30.7.2009,  13:17 Найти цитируемый пост)
Попытался написать функцию с динамическим массивом, компилируется, но во время работы выдает ошибку :(

1. с каких пор функция sprintf принимает CString (вот говорят же не используйте функции с переменным числом параметров, и все зря).
2.
Цитата

TextBuffer = new char [cTextToClear.GetLength()];

тут выделяется недостаточно памяти, ты забыл про \0
3.
Цитата

switch (TextBuffer[i])
        {
        case '0':
        case '1':
        case '2':
        case '3':
        case '4':
        case '5':
        case '6':
        case '7':
        case '8':
        case '9':
        case 'a':
        case 'b':
        case 'c':
        case 'd':
        case 'e':
        case 'f':
        case 'A':
        case 'B':
        case 'C':
        case 'D':
        case 'E':
        case 'F':
            cTextToClear+=TextBuffer[i];
            break;        
        }

зачем это? if (TextBuffer[i] > '0' && TextBuffer[i] < '9' ... ) и тому подобное отменили?

Цитата(SergMilk @  30.7.2009,  13:17 Найти цитируемый пост)
delete [] TextBuffer; // am I deallocating memory right way?

Exactly.
PM   Вверх
bsa
Дата 30.7.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, дело тут не в MFC.

SergMilk
Ты уверен, что на входе в функцию, cTextToClear не является пустой строкой?
Код
sprintf(TextBuffer,"%s",cTextToClear);
Вообще убийственная операция! Ты пытаешься преобразовать в указатель объект класса CString. Т.е. первые 4 байта этого объекта будут представлены в виде указателя на char и содержимое памяти, на которую он указывает, будет помещено вместо %s. Думаю, тебе стоило бы почитать доки по поводу копирования строк. А еще лучше, не смешивать CString и строки в стиле Си.

Короче, делать лучше так (только я MFC не знаю, поэтому может быть ошибка в плане использования операторов CString):
Код
CString RemoveUselessSymbols(const CString &cTextToClear)
{
   CString res;
   for(int i = 0, e = cTextToClear.Length(); i < e; ++i) {
       char c = cTextToClear[i];
       if (  ( (c >= '0') && (c <= '9') ) || ( (c >= 'a') && (c <= 'f') ) || ( (c >= 'A') && (c <= 'F') ) )
            res += c;
   }
   return res;
}

PM   Вверх
Gordon
Дата 30.7.2009, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(bsa @  30.7.2009,  16:59 Найти цитируемый пост)
только я MFC не знаю, поэтому может быть ошибка в плане использования операторов CString


чуть-чуть  smile 

Код

cTextToClear.GetLength();



--------------------

  
     
PM MAIL WWW   Вверх
SergMilk
Дата 30.7.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 29.4.2009

Репутация: нет
Всего: нет



О, спасибо, большое!
Пока написал пост и вернулся на рабочее место, мне уже указали, что я  про нуль-терминатор  в строке забыл.
Насчёт совместного использования CString и sprintf это я вообще не особо понимаю, поэтому так коряво и пишу.

bsa, а ты какую библиотеку используешь в основном?

P.S. и еще, почему в цикле используешь префиксный инкремент?  Разве не с 
Код
char c = cTextToClear[1];
 начнется в этом случае?
 Хм, действительно всё равно блок statement раньше выполняется...


Если чё не так сказал - не смейтесь smile


Кстати, чем плохо CString в буфер через sprintf загонять?   чем экземпляр этого класса так кардинально отличается от массива символов? 
Код

   char  buffer[200], s[] = "computer";
 
   /* Format and print various data: */
   j  = sprintf( buffer,     "\tString:    %s\n", s );


Это сообщение отредактировал(а) SergMilk - 30.7.2009, 20:26
PM MAIL   Вверх
Gordon
Дата 30.7.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 459
Регистрация: 9.7.2006

Репутация: 1
Всего: 6



Цитата(SergMilk @  30.7.2009,  20:59 Найти цитируемый пост)
P.S. и еще, почему в цикле используешь префиксный инкремент?


Префиксный инкремент, в некоторых случаях, считается более эффективным... имхо
И начинается с чего и должно начаться т.е.

Код

char c = cTextToClear[ 0 ];


Это сообщение отредактировал(а) Gordon - 30.7.2009, 20:20


--------------------

  
     
PM MAIL WWW   Вверх
SergMilk
Дата 30.7.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 29.4.2009

Репутация: нет
Всего: нет



Упс, пока MSDN читал и примеры пробовал уже ответили насчёт цикла for smile
А Вы какие библиотеки для С++ используете?

Это сообщение отредактировал(а) SergMilk - 30.7.2009, 21:00
PM MAIL   Вверх
Леопольд
Дата 31.7.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(SergMilk @ 30.7.2009,  20:28)
Упс, пока MSDN читал и примеры пробовал уже ответили насчёт цикла for smile
А Вы какие библиотеки для С++ используете?

Разные. Если тебя интересуют GUI библиотеки, то советую обратить внимание на Qt или wxWidgets . На MFC своё время тратить не стоит.

Ещё есть STL (Standard Template Library), которая является неотемлемой частью С++. В ней тоже много чего полезного, тот же std::string, например. Так же следует посмотреть на Boost, часть которого войдёт в следующую версию STL.

Это сообщение отредактировал(а) Леопольд - 31.7.2009, 09:22


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 31.7.2009, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(SergMilk @ 30.7.2009,  19:59)
bsa, а ты какую библиотеку используешь в основном?

В зависимости от проекта. Или самописное, или Qt.

Цитата(SergMilk @ 30.7.2009,  19:59)
почему в цикле используешь префиксный инкремент?

Префиксная форма предпочтительней везде, где не нужна постфиксная. Почему? Поищи поиском или реализуй функциональность сам и сравни.
Кстати, цикл for() легко раскладывается на составляющие: for(A;B;C) X;
Код
A;
while(B) {
  X;
  C;
}
А при такой записи сразу становится понятно, что если C заменить на ++i или i++, то с точки зрения логики работы разницы не будет, так как единственное различие этих операций - возвращаемое значение, не используется.
Цитата(SergMilk @ 30.7.2009,  19:59)
Кстати, чем плохо CString в буфер через sprintf загонять?   чем экземпляр этого класса так кардинально отличается от массива символов?
Понимаешь, от тебя требуют колесо, а ты даешь грузовик. Конечно, различия небольшие... В грузовике есть колесо... Вот только, где гарантия, что оно подойдет?
От тебя требуют тип const char*, а ты подсовываешь CString. Это в корне неверно, даже если и работает сейчас (например, потому что класс CString содержит в себе первым атрибутом указатель на начало строки), то это не значит, что завтра (после того, как МС внесет изменения в этот класс) или при попытатке использовать в sprintf более одного параметра все будет так же работать.


Это сообщение отредактировал(а) bsa - 31.7.2009, 16:51
PM   Вверх
SergMilk
Дата 31.7.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 29.4.2009

Репутация: нет
Всего: нет



А из Visual Studio 6 можно писать с использованием библиотек Qt или Boost или STL? И как справку вызывать по библиотеке? Так MSDN по F1 вызывается, но там про MFC только
PM MAIL   Вверх
Леопольд
Дата 31.7.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(SergMilk @  31.7.2009,  21:11 Найти цитируемый пост)
И как справку вызывать по библиотеке? 

Как правило, документацию по библиотеке можно найти на сайте библиотеки smile Если интернет безлимитный, то лучше скачай Visual Studio Express Edition 2008 (таблетка не нужна, она бесплатная). VS 6 довольно сильно устарела на сегодняшний день. Но я бы посоветовал сразу начать с GCC, он более строго придерживается стандарта С++. Компилировать проект из командной строки можно так 
Код

g++ *.cpp -o program.exe



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
bsa
Дата 31.7.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



SergMilk, документация по Qt тут: http://www.qtsoftware.com/developer
Кстати, на их сайте можно скачать Qt Creator - среду разработки с использованием Qt. Рекомендую (начать писать программы с использованием Qt намного проще, чем в случае Visual Studio - так как не нужно ничего чужого компилировать).
Документация по boost тут: http://www.boost.org/libs/libraries.htm
Документация по STL должна быть во встроенной правке, если компилятор укомплектован этой библиотекой. Устаревшие компиляторые могут не иметь ее в комплекте. Я же пользуюсь: http://www.sgi.com/tech/stl/ и http://www.cplusplus.com/reference/

PM   Вверх
Леопольд
Дата 31.7.2009, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 3
Всего: 13



Цитата(bsa @ 31.7.2009,  22:54)
Кстати, на их сайте можно скачать Qt Creator - среду разработки с использованием Qt. Рекомендую (начать писать программы с использованием Qt намного проще, чем в случае Visual Studio - так как не нужно ничего чужого компилировать).

bsa, видимо, имеет ввиду что не надо компилировать саму библиотеку Qt для Visual Studio.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
SergMilk
Дата 1.8.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 29.4.2009

Репутация: нет
Всего: нет



Спасибо за ссылки !
Qt Creator я уже устанавливал, но ничего кроме калькулятора я на нём не делал :(. И я не понял, сам файл .cpp надо во внешнем   редакторе всё равно писать??

Просто на работе те, с кем я взаимодействую пишут в 6 Студии. Так вот вопрос, могу я в этой 6 студии использовать все те библиотеки, которые вы рекомендуете и которые пользуются спросом на рынке, без ущерба во взаимодействии с другими разработчиками. И могу ли я писать в 8 студии, так, чтобы мои проекты могли открываться, компилироваться и запускаться людьми, у которых стоит 6я студия  

В 8й Студии писал несколько консольных приложений типа игры жизнь, сортировок, и т.п. Но на С#. 
Borland C builder тоже устанавливал и делал в нём те же приложения вроде калькулятора, т.к. на предыдущей работе народ на 6м билдере сидел.

Кто-нибудь знаком с ВНИИСовскими вещами типа МСВС3.0 , Qt Конструктор (3.3 версия Qt)?

Это сообщение отредактировал(а) SergMilk - 1.8.2009, 17:08
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.