Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2009, 14:21   #11
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Скажите, пожалуйста, почему моем коде игнорируется оператор
delete [] a;?
Видимо поэтому программка не работает.
Если сделать линейную программку, то все работает и оператор delete удаляет. Может это из-за цикла?

Последний раз редактировалось Сергей089; 28.03.2009 в 14:35.
Сергей089 вне форума Ответить с цитированием
Старый 10.12.2009, 16:32   #12
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Всем привет. Помогите удалить динамическую строку newy
Вот часть кода:
Код:
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
Image1->Canvas->FillRect(Image1->Canvas->ClipRect);
if (CSpinEdit1->Value != 0) {
                             char *axiom = "X";
                             char *newf = "F";
                             char *newx = "-YF+XFX+FY-";
                             char *newy = "+XF-YFY-FX+";
                             char *newax;
                             alfa = 0;
                             teta = M_PI/2;
                             p = CSpinEdit1->Value;
                             a = (Image1->Width)/2;
                             for (int i = 1; i <= p; i++)
                                     a = a/2;
                             r = 2*a;
                             b = (Image1->Width)-a;
                             /*for (int i = strlen(newax)-1; i >= 0; i--)
                                     newax[i] = '\0';*/
                             while (p > 0)
                                {
                                 newax = "";
                                 for (int i = 0; i < strlen(axiom); i++)
                                        switch (axiom[i]) {
                                                           case 'F': strcat(newax,newf); break;
                                                           case 'X': strcat(newax,newx); break;
                                                           case 'Y': strcat(newax,newy); break;
                                                           case '+': strcat(newax,"+"); break;
                                                           case '-': strcat(newax,"-"); break;
                                                          }
                                 p -= 1;
                                 strcpy(axiom,newax);
                                 /*for (int i = strlen(newax)-1; i >= 0; i--)
                                        newax[i] = '\0';*/
                                        delete [] newax;
                                        newax = NULL;
                                }
                             delete [] newf;
                             newf = NULL;
                             delete [] newx;
                             newx = NULL;
                             delete [] newy;
                             newy = NULL;
                             x = floor(a);
                             y = floor(b);
                             Image1->Canvas->MoveTo(x,y);
                             for (int i = 0; i < strlen(axiom); i++)
                                     switch (axiom[i]) {
                                                        case 'F': {
                                                                   a = r*cos(alfa)+a;
                                                                   b = r*sin(alfa)+b;
                                                                   x = floor(a);
                                                                   y = floor(b);
                                                                   Image1->Canvas->LineTo(x,y);
                                                                  } break;
                                                        case '+': alfa += teta; break;
                                                        case '-': alfa -= teta; break;
                                                       }
                             delete [] axiom;
                             axiom = NULL;
                            }
}
На операторе
Код:
delete [] newy;
вылетает ошибка:

Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 011943BB in module 'BORLNDMM.DLL'. Read of address 006DAAE0'. Process stopped. Use Step or Run to continue.

И еще после оператора:
Код:
strcpy(axiom,newax);
в newf вместо "F" откуда-то появляется "F+XFX+FY-", а в newx вместо "-YF+XFX+FY-" - "XFX+FY-". Почему так?
Сергей089 вне форума Ответить с цитированием
Старый 10.12.2009, 16:51   #13
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Код:
char *newy = "+XF-YFY-FX+";
Это что?! Чтобы удалить(освободить) память её нужно сначала выделить. Замени строку так:

Код:
char *newy = new char[size];
strcpy(newy, "+XF-YFY-FX+");
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Старый 10.12.2009, 18:55   #14
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Максимально длина 256? Просто на каждой итерации в axiom вместо 'X' и 'Y' вставляются "-YF+XFX+FY-" и "+XF-YFY-FX+" соответственно. Сейчас попробую, но, кажется, не хватит 256.
Сергей089 вне форума Ответить с цитированием
Старый 10.12.2009, 20:26   #15
Сергей089
Форумчанин
 
Регистрация: 22.09.2008
Сообщений: 214
По умолчанию

Работает. А что тогда я здесь сделал?
Код:
char *newy = "+XF-YFY-FX+";
Если посмотреть Watch List, то строка "+XF-YFY-FX+" вроде бы записывалась в newy.
256 мало. Дошел только до 3 итерации, хотя на Delphi до 8. Есть ли в Builder аналог типа string из Delphi? Я вроде бы нашел такой же тип String, но не знаю функций для него. Как для такой строки длину определить и какую-нибудь i-ую букву?
Сергей089 вне форума Ответить с цитированием
Старый 10.12.2009, 20:32   #16
nazavrik
Форумчанин
 
Аватар для nazavrik
 
Регистрация: 01.09.2008
Сообщений: 178
По умолчанию

Цитата:
Сообщение от Сергей089 Посмотреть сообщение
Работает. А что тогда я здесь сделал?
Код:
char *newy = "+XF-YFY-FX+";
Вы здесь определили указатель на статическую строку-константу. В то время как new и delete соответственно выделяет и освобождает память динамически.
Быть радикальным - значит понять вещь в её корне. К.Маркс
nazavrik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическая строка в консоле win32 AlexeyLed Общие вопросы C/C++ 4 10.03.2009 12:39
Строка состаяния или загрузачная строка Sergeu Мультимедиа в Delphi 8 27.08.2008 10:32
Динамическая переменная kezman Общие вопросы C/C++ 1 29.07.2008 13:49
Класс Динамическая строка по Си Zolotce Помощь студентам 1 26.04.2008 18:58
Динамическая память MadDog__ Помощь студентам 2 22.11.2007 00:05