The program crashes suddenly when working with a new feature
-
Just run using the debugger, crash your program and look at the stack trace window
-
@tomy said in The program crashes suddenly when working with a new feature:
Then we increase it, ++i;, to refer to the next (blank) cell where we want to put the result of the sum into.
Incrementing
i
means you are now referring to the next row. How do you/we know whether there is a next row in yourQTableWidget
? I gave you a reference toQTableWidget::setRowCount()
, which I said you may need to call to increase how many rows there are, I don't know.Meanwhile, as I & the others have said, if you can use the debugger it may be the quickest way to get to whatever your problem is.
-
@JonB
There are 1000 rows in each sheet while I'm working on the rows number 1 to 30 utmost. Yes, it would be better to use that function you sent, but it's not improving the code for those rows. I will make use of that afterwards. so thanks. -
It's more than 20 times I'm testing the program after running it by F5. But extremely astonishing, the program doesn't crash!!!! I changed nothing in the code.
I should dedicate more time and hopefully see it crash. But, where is the window called "stack trace window", please?
-
@tomy said in The program crashes suddenly when working with a new feature:
where is the window called "stack trace window", please?
It's the one in the bottom right corner
-
I ran the program with Debugger (F5) and tested it for crash many a time, but thus far it's never crashed in this mode. But when I run it by crtl+R, it crashes at the second or third time I apply the sum action on the highlighted cells!
Why please? Does the debugger change the behavior of the program, please?Here is the project spreadsheet.rar. Please if possible test it and let me know what makes the program crash, please?
I wanted to upload it here but faced a message saying I haven't that privilege! so posted that below:
https://www.dropbox.com/s/anuk091qr8tjeem/spreadsheet.rar?dl=0 -
Hi,
Check for uninitialised pointers and/or variables. In debug mode, the pointers at least are initialised to zero but not in release mode (that's nothing Qt specific though)
-
I changed the initial value of some pointers from
0
tonullptr
and also assigned0
to some uninitialized variables too ( E.g.,quint16
) then reran the project and tested for the crash. This time I got this message at the time of crash:12:53:28: Starting C:\Users\Abbasi\Desktop\Documents\Qt\qt-book\chap03\build-spreadsheet-Desktop_Qt_5_12_0_MinGW_64_bit-Debug\debug\spreadsheet.exe...
ASSERT: "size == 0 || offset < 0 || size_t(offset) >= sizeof(QArrayData)" in file..\..\include/QtCore/../../src/corelib/tools/qarraydata.h, line 67
12:53:50: The program has unexpectedly finished.
12:53:50: The process was ended forcefully.
12:53:51: C:/Users/Abbasi/Desktop/Documents/Qt/qt-book/chap03/build-spreadsheet-Desktop_Qt_5_12_0_MinGW_64_bit-Debug/debug/spreadsheet.exe crashed.And when I clicked on that file I got this message:
By the way, I always run the programs in the Debug mode unless they're in their last state before creating an installer for them. So all crashes have happened in the Debug mode so far.
And still by the Debugger, I get no crashes!!
-
You're hitting an assertion because you are accesing a QVector/QList with an index which is out-of-bounds. Take a look at the backtrace to see from where the call is coming.
So all crashes have happened in the Debug mode so far. And still by the Debugger, I get no crashes!!
This somehow makes no sense from me - either it crashes in debug or not.
-
@Christian-Ehrlicher
as far as i unerstand it, it‘s always a debug build but only crashes, when rhe debugger is not attached.which is unusual.
You could potentially try attaching the debugger after wards to the running process via VS.
-
Since it's an assertion it will also happen when a debugger is attached. And that's also the reason why it does 'work' in release mode.
-
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! -
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!
14/28