С++ теряется значение переменной |
Здравствуйте, гость ( Вход | Регистрация )
С++ теряется значение переменной |
greh |
8.3.2010, 16:56
Сообщение
#1
|
Студент Группа: Участник Сообщений: 48 Регистрация: 23.11.2009 Пользователь №: 1252 Спасибо сказали: 0 раз(а) Репутация: 0 |
Помогите пожалуйста найти решение. Есть 2 класса написанных на C++ (table.cpp и tableitem.cpp) они инклудятся в Qt проект. вот часть кода:
table.cpp: CODE #include "table.h" Table::Table(int NumberOfRows1, int NumberOfcolumns1) { NumberOfRows=NumberOfRows1; NumberOfColumns=NumberOfcolumns1; for(int i1=0; i1<MaxRows; i1++) for(int i2=0; i2<MaxColumns;i2++) ArrayOfItems[i1][i2]=0; } Table::~Table() { ClearTable(); } ... char* Table::GetItemChar(int RowIndex, int ColumnIndex) { if(ArrayOfItems[RowIndex][ColumnIndex]!=0) //если объект существует return ArrayOfItems[RowIndex][ColumnIndex]->GetValueChar(); //получаем значение текстового поля else return "NULL"; //если его нет } void Table::UpdateCell(int RowIndex, int ColumnIndex, char text[]) { ArrayOfItems[RowIndex][ColumnIndex]->SetValue(text); } void Table::SetItem(int RowIndex, int ColumnIndex, char text[]) { if(ArrayOfItems[RowIndex][ColumnIndex]!=0) //если объект существует UpdateCell(RowIndex,ColumnIndex,text); //то обновляем его содержимое else ArrayOfItems[RowIndex][ColumnIndex] = new TableItem(text); //иначе создаём его } tableitem.cpp: CODE TableItem::TableItem() { value = new char[100]; } TableItem::TableItem(char text[]) { value = new char[100]; value=text; } TableItem::TableItem(int number) { value = new char[100]; char NumberInChar[100]; sprintf(NumberInChar,"%d",number); value=NumberInChar; } void TableItem::SetValue(char text[]) { value=text; } void TableItem::SetValue(int number) { char NumberInChar[100]; sprintf(NumberInChar,"%d",number); value=NumberInChar; } TableItem::~TableItem() { delete [] value; } int TableItem::GetValueInt() { if(IsNumber(value)) return atoi(value); else return -5; } char* TableItem::GetValueChar() { return value; } } bool TableItem::IsNumber(char text[]) { int i=0; while(text[i]) { if(text[i]>=48 && text[i]<=57) { return true; } else return false; } } Проблемы начинаются здесь(mainwindow.cpp): CODE MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); Table1 = new Table(8,8); connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(Add())); //тыкаем кнопку 1 и текст добавляется в поле объекта Table1 connect(ui->pushButton_2,SIGNAL(clicked()),this,SLOT(GetLast())); //тыкаем кнопку 2 и вытаскиваем этот же текст из этого-же поля } MainWindow::~MainWindow() { delete ui; delete Table1; } ... } void MainWindow::Add() { QByteArray ar = ui->lineEdit->text().toAscii(); Table1->SetItem(0,0,ar.data()); // Получаем из edit'а текст = "50" ui->label->setText(QString(Table1->GetItemChar(0,0))); // Получаем из объекта текст ="50" } void MainWindow::GetLast() { ui->label_2->setText(QString(Table1->GetItemChar(0,0))); // Из того же объекта получаем текст ="Ð4Ébÿ" <-каждый раз получается что-то рандомное } Никак понять не могу в чём дело. |
|
|
SABROG |
8.3.2010, 20:31
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
При выходе из области видимости ar уничтожается, а вместе с ним и текст, указатель на который ты передаешь в SetItem, получив его методом data(). |
|
|
Текстовая версия | Сейчас: 19.4.2024, 6:12 |