Commit 04725cb1 authored by Bryant Mairs's avatar Bryant Mairs

Fixed a stack overflow bug when using the regression fitting command in...

Fixed a stack overflow bug when using the regression fitting command in logfile plot. Solution involved just allocating on the heap instead of the stack.
parent 6ba4def6
...@@ -561,7 +561,10 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil ...@@ -561,7 +561,10 @@ void QGCDataPlot2D::loadCsvLog(QString file, QString xAxisName, QString yAxisFil
bool QGCDataPlot2D::calculateRegression() bool QGCDataPlot2D::calculateRegression()
{ {
// TODO Add support for quadratic / cubic curve fitting // TODO Add support for quadratic / cubic curve fitting
return calculateRegression(ui->xRegressionComboBox->currentText(), ui->yRegressionComboBox->currentText(), "linear"); qDebug() << ui->xRegressionComboBox->currentText();
qDebug() << ui->yRegressionComboBox->currentText();
//return false;
return calculateRegression(ui->xRegressionComboBox->currentText(), ui->yRegressionComboBox->currentText(), "quadratic");
} }
/** /**
...@@ -579,9 +582,15 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me ...@@ -579,9 +582,15 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me
ui->xRegressionComboBox->setCurrentIndex(curveNames.indexOf(xName)); ui->xRegressionComboBox->setCurrentIndex(curveNames.indexOf(xName));
ui->yRegressionComboBox->setCurrentIndex(curveNames.indexOf(yName)); ui->yRegressionComboBox->setCurrentIndex(curveNames.indexOf(yName));
} }
// Create a couple of arrays for us to use to temporarily store some of the data from the plot.
// These arrays are allocated on the heap as they are far too big to go in the stack and will
// cause an overflow.
// TODO: Look into if this would be better done by having a getter return const double pointers instead
// of using memcpy().
const int size = 100000; const int size = 100000;
double x[size]; double *x = new double[size];
double y[size]; double *y = new double[size];
int copied = plot->data(yName, x, y, size); int copied = plot->data(yName, x, y, size);
if (method == "linear") { if (method == "linear") {
...@@ -604,14 +613,12 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me ...@@ -604,14 +613,12 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me
function = tr("Linear regression failed. (Limit: %1 data points. Try with less)").arg(size); function = tr("Linear regression failed. (Limit: %1 data points. Try with less)").arg(size);
result = false; result = false;
} }
} else if (method == "quadratic") {
} else if (method == "cubic") {
} else { } else {
function = tr("Regression method %1 not found").arg(method); function = tr("Regression method %1 not found").arg(method);
result = false; result = false;
} }
delete x, y;
} else { } else {
// xName == yName // xName == yName
function = tr("Please select different X and Y dimensions, not %1 = %2").arg(xName, yName); function = tr("Please select different X and Y dimensions, not %1 = %2").arg(xName, yName);
...@@ -635,7 +642,7 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me ...@@ -635,7 +642,7 @@ bool QGCDataPlot2D::calculateRegression(QString xName, QString yName, QString me
* the match of the regression. * the match of the regression.
* @return 1 on success, 0 on failure (e.g. because of infinite slope) * @return 1 on success, 0 on failure (e.g. because of infinite slope)
*/ */
int QGCDataPlot2D::linearRegression(double* x,double* y,int n,double* a,double* b,double* r) int QGCDataPlot2D::linearRegression(double *x, double *y, int n, double *a, double *b, double *r)
{ {
int i; int i;
double sumx=0,sumy=0,sumx2=0,sumy2=0,sumxy=0; double sumx=0,sumy=0,sumx2=0,sumy2=0,sumxy=0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment