Модераторы: 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   Вверх
Gordon
Дата 1.8.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SergMilk @  1.8.2009,  17:55 Найти цитируемый пост)
И могу ли я писать в 8 студии, так, чтобы мои проекты могли открываться, компилироваться и запускаться людьми, у которых стоит 6я студия 


Вот это врятли, по крайней мере без проблем не обойтись... 

p.s. VC++ 6 кажется в 1998 году выпустили?


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

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


Новичок



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

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



Да, старьё конечно, вот это и огорчает.
Но на нормальную работу сразу не берут. Хотя бы так программировать или точнее г*внокод клепать...
PM MAIL   Вверх
Gordon
Дата 2.8.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(SergMilk @  1.8.2009,  23:44 Найти цитируемый пост)
Но на нормальную работу сразу не берут. Хотя бы так программировать или точнее г*внокод клепать...


Вас на работе заставляют в VS 6 писать?


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

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


Эксперт
****


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

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



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

Смысл от IDE, когда код программы надо писать во внешнем редакторе? Два раза кликаешь на файле и он открывается... Есть подсветка синтаксива, дополнение кода и пр. вкусности.

Но в VS6 вряд ли это все будет работать. Подозреваю, что из Qt уже начали удалять код для совместимости с VS6.
PM   Вверх
SergMilk
Дата 3.8.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нет, ну никто, конечно, не заставляет писать именно в VS6 и именно с MFC, но если подразумевается командный проект, как можно сделать по-другому? Подскажите, пожалуйста. Если допустим я наклепал форму, которая что-то делает, как-то работает с файлами, но нужно еще и функцию сторонюю подключить, добавив чужие .h и .cpp файлы(VS6+MFC). Какие могут быть проблемы, если мой cpp написан в другой  студии (например VS2008) или вовсе в Qt Creator?

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


Кодофей
****


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

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



SergMilk, Если мне память не изменяет, для VC6 было выпущено 4-5 сервиспаков. Почитайте, что именно эти сервиспаки обновляли. Возможно, после их установки, эта среда стала больше придерживаться стандарта. Значит, больших проблем со стыковкой кода не должно возникнуть.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
bsa
Дата 3.8.2009, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



SergMilk, лучше не смешивать в одном проекте такие разные технологии. В твоем случае, придется учить то, что нужно работодателю.
PM   Вверх
mrbrooks
Дата 4.8.2009, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



 smile 
Цитата(SergMilk @  3.8.2009,  20:14 Найти цитируемый пост)
Нет, ну никто, конечно, не заставляет писать именно в VS6 и именно с MFC, но если подразумевается командный проект, как можно сделать по-другому? 

это может приснится только в страшном сне. smile 
PM MAIL   Вверх
SergMilk
Дата 4.8.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну а как это состыковать со словами, что на MFC жалко время тратить? Хотя мне пока основы программирования изучить хотя бы. Вот потоки хотя бы.
PM MAIL   Вверх
bsa
Дата 4.8.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(SergMilk @ 4.8.2009,  18:14)
Ну а как это состыковать со словами, что на MFC жалко время тратить? Хотя мне пока основы программирования изучить хотя бы. Вот потоки хотя бы.

Очень просто. Если у тебя есть выбор, то на MFC лучше не терять время. А если нет выбора, то тогда о чем речь?
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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