Solved The program crashes suddenly when working with a new feature
-
Take a look at the backtrace to see from where the call is coming.
As I said, when run by the Debugger, the project never crashes, at least based on my many tests' result!
This somehow makes no sense from me - either it crashes in debug or not.
I don't use the Release mode, so please let's drop this word down for the time being.
I run the program only in the Debug mode, either by pressing F5 (which is the Debugger) or ctrl+R (which is a rormal run).
- When run normally: Crash occurs.
- when run by the Debugger: Crash doesn't occur.
Why don't you simply download and run the project, please?
-
@tomy said in The program crashes suddenly when working with a new feature:
QTableWidgetItem* item = new QTableWidgetItem;
This is wrong, you have to use 'Cell' ...
Cell *Spreadsheet::cell(int row, int column) const { return static_cast<Cell *>(item(row, column)); }
-
Do you mean I use
sum()
this way:void Spreadsheet::sum() { double d = 0.0; QList<QTableWidgetItem *> items = selectedItems(); if(add(items, d)) { int row = 0, column = 0; position(items, row, column); ++row; Cell *c = cell(row, column); c->setTextAlignment(Qt::AlignRight); c->setText((QString::number(d))); somethingChanged(); } }
It still crashes.
-
@tomy said in The program crashes suddenly when working with a new feature:
It still crashes.
But this time your debugger will show you where...
-
@Christian-Ehrlicher
Right!![0_1552139887443_5.PNG]
-
So when you go up the backtrace you see that "Cell *c = cell(row, column);" returns a nullptr.
-
So when you go up the backtrace you see that "Cell *c = cell(row, column);" returns a nullptr.
Since it's empty, yeah?
So how to get to the next row (which may or may not be empty) to set the result into it, please?
-
When there is no object (yet) you should create one, or?
-
@Christian-Ehrlicher
I was doing it by:QTableWidgetItem* item = new QTableWidgetItem;
I don't know why we need:
Cell *c = cell(row, column);
while it's the last filled cell and we can't increase its row number to get to the next cell to put the result of sum() into it! -
I already told you that you don't have to use QTableWidgetItem but Cell since the model is working with Cell objects (which derives from QTableWidgetItem) instead QTableWidgetItem and therefore the static cast does undefined stuff -> c++ basics...
-
When there is no object (yet) you should create one, or?
Using this statement:
Cell* c = cell(row, column);
we can only have c as a pointer to a non-empty cell in the sheet. Moreover, we can't make it point to the next cell as our target cell for putting the result of our function, because the program crashes. So that c is useless.What do you mean by creating an object? And object of what? A cell? If so, how? This way:
Cell ce = *cell(row, column);
?I really don't understand what your intention is.
Isn't there any way to solve this issue? -
How to create a new object on the heap: http://www.cplusplus.com/reference/new/operator new/
-
You mean
new
? I've tested it beforehand in this version of sum and already for QTableWidgetItem.void Spreadsheet::sum() { double d = 0.0; QList<QTableWidgetItem *> items = selectedItems(); if(add(items, d)) { int row = 0, column = 0; position(items, row, column); row++; Cell* c = new cell(row, column); c->setTextAlignment(Qt::AlignRight); c->setText((QString::number(d))); somethingChanged(); } }
Neither
Cell* c = new cell(row, column);
norCell* c = new Cell(row, column);
works.Found it:
void Spreadsheet::sum() { double d = 0.0; QList<QTableWidgetItem *> items = selectedItems(); if(add(items, d)) { int row = 0, column = 0; position(items, row, column); row++; Cell* c = new Cell(); c->setTextAlignment(Qt::AlignRight); c->setText((QString::number(d))); setItem(row, column, c); somethingChanged(); } }
And apparently works fine. :)