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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая форма возвращает указатель 
V
    Опции темы
фигурист
Дата 25.12.2008, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые форумчане. Возникла одна проблема.

в приложении создаю динамическую форму. на форме размещена кнопка Cancel, которая при нажатии закрывает форму, и кнопка ОК, которая ДОЛЖНА возвращать указатель на массив типа int.
Вместо этого она возвращает черти че.
Код

TEdit *edt;
int *d =NULL; // глобальная переменная

void __fastcall TForm1::FormClick(TObject *Sender)
{
AnsiString A=edt->Text;
int D = StrToInt(A);
::d = &D;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TForm *form=new TForm(Application); 
  form->Caption=""; 
  MoveWindow(form->Handle,200,300,300,300,false);
  edt = new TEdit(form);
  edt->Parent = form;
  edt->Left=(form->Width-edt->Width)/2;
  edt->Top=form->Height-20*edt->Height/2;
  TButton *btn=new TButton(form);
  btn->Parent=form; 
  btn->Caption="Cancel"; 
  btn->ModalResult=mrCancel; 
  btn->Cancel=true; 
  btn->Left=(form->Width-btn->Width)/2; 
  btn->Top=form->Height-6*btn->Height/2; 
  btn=new TButton(form); 
  btn->Parent=form; 
  btn->Left=(form->Width-btn->Width)/2; 
  btn->Top=form->Height-9*btn->Height/2; 
  btn->Caption="OK"; 
  btn->OnClick=FormClick;
  btn->Default=true; 
  form->ShowModal();
  delete form;
  Edit1->Text = IntToStr(*d); }


Обычно я пользуюсь глобальными переменными и операцией :: для их изменения. Тут это не работает.
Посоветуйте что делать.






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


Новичок



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

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



Цитата(фигурист @  25.12.2008,  18:46 Найти цитируемый пост)
:: d = &D;

D - это локальная переменная метода, память под нее выделяется на стеке, и после выхода из метода ее адрес использовать нельзя.

Это сообщение отредактировал(а) 2p0i - 25.12.2008, 19:31
PM MAIL   Вверх
J0ker
Дата 25.12.2008, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



D - локальная переменная - она разрушается при покидании блока, т.о. d будет указывать куда-то в стек, где уже хрен знает что хранится

Добавлено через 38 секунд
о блин, уже ответили  smile 


--------------------
user posted image
PM MAIL   Вверх
фигурист
Дата 27.12.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за советы.

Решил проблему просто 
Код

int *d =NULL; // глобальная переменная    
int D=0;
void __fastcall TForm1::FormClick(TObject *Sender)    
{    
::D = StrToInt(edt->Text);    
::d = &D;

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


Опытный
**


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

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



Цитата(фигурист @ 27.12.2008,  14:17)
Спасибо за советы.

Решил проблему просто 
Код

int *d =NULL; // глобальная переменная    
int D=0;
void __fastcall TForm1::FormClick(TObject *Sender)    
{    
::D = StrToInt(edt->Text);    
::d = &D;

оригинальное решение
а для чего тогда d?  smile 


--------------------
user posted image
PM MAIL   Вверх
фигурист
Дата 28.12.2008, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

оригинальное решение
а для чего тогда d?


Действительно  smile  , но это просто учебный пример, а форма должна возвращать именно указатель, поэтому здесь это d светится для адекватности примера smile 
PM MAIL   Вверх
vinick
Дата 29.12.2008, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(фигурист @  27.12.2008,  14:17 Найти цитируемый пост)

Код

::D = StrToInt(edt->Text);    
::d = &D;



Тут кстати или везде указывайте на глобальный нэймспейс, или убирайте эти двоеточия совсем, а то чушь получается.
PM MAIL ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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