crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> С++ теряется значение переменной
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  


QByteArray ar = ui->lineEdit->text().toAscii();
Table1->SetItem(0,0,ar.data());


При выходе из области видимости ar уничтожается, а вместе с ним и текст, указатель на который ты передаешь в SetItem, получив его методом data().
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 6:12