summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2019-06-27 07:42:09 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2019-11-09 19:19:04 +0100
commit11467fa326896934a299712810b74aef6a373c6f (patch)
treed8c599a8b2b5a50e4dd189ff8ec108cac20c007d
parentf179ec033f39a6b774e6e6bb79f41771dfaf7e02 (diff)
downloadsubsurface-11467fa326896934a299712810b74aef6a373c6f.tar.gz
Core: dynamically allocate the result of get_gas_used()
get_gas_used() returns the volume of used gases. Currently, an array with MAX_CYLINDERS is passed in. If we want to make the number of cylinders dynamic, the function must use an arbitrarilly sized array. Therefore, return a dynamically allocated array and free it in the caller. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/qthelper.cpp7
-rw-r--r--core/statistics.c11
-rw-r--r--core/statistics.h3
-rw-r--r--desktop-widgets/tab-widgets/TabDiveInformation.cpp4
-rw-r--r--qt-models/yearlystatisticsmodel.cpp1
5 files changed, 16 insertions, 10 deletions
diff --git a/core/qthelper.cpp b/core/qthelper.cpp
index 8082db742..700854ebc 100644
--- a/core/qthelper.cpp
+++ b/core/qthelper.cpp
@@ -388,13 +388,14 @@ QVector<QPair<QString, int>> selectedDivesGasUsed()
for_each_dive (i, d) {
if (!d->selected)
continue;
- volume_t diveGases[MAX_CYLINDERS] = {};
- get_gas_used(d, diveGases);
- for (j = 0; j < MAX_CYLINDERS; j++)
+ volume_t *diveGases = get_gas_used(d);
+ for (j = 0; j < MAX_CYLINDERS; j++) {
if (diveGases[j].mliter) {
QString gasName = gasname(d->cylinder[j].gasmix);
gasUsed[gasName] += diveGases[j].mliter;
}
+ }
+ free(diveGases);
}
QVector<QPair<QString, int>> gasUsedOrdered;
gasUsedOrdered.reserve(gasUsed.size());
diff --git a/core/statistics.c b/core/statistics.c
index 6e4630d64..d5ef58955 100644
--- a/core/statistics.c
+++ b/core/statistics.c
@@ -359,10 +359,13 @@ bool is_cylinder_prot(const struct dive *dive, int idx)
return false;
}
-void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS])
+/* Returns a dynamically allocated array with MAX_CYLINDERS entries that
+ * has to be freed by the caller */
+volume_t *get_gas_used(struct dive *dive)
{
int idx;
+ volume_t *gases = malloc(MAX_CYLINDERS * sizeof(volume_t));
for (idx = 0; idx < MAX_CYLINDERS; idx++) {
cylinder_t *cyl = &dive->cylinder[idx];
pressure_t start, end;
@@ -372,6 +375,8 @@ void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS])
if (end.mbar && start.mbar > end.mbar)
gases[idx].mliter = gas_volume(cyl, start) - gas_volume(cyl, end);
}
+
+ return gases;
}
/* Quite crude reverse-blender-function, but it produces a approx result */
@@ -397,8 +402,7 @@ void selected_dives_gas_parts(volume_t *o2_tot, volume_t *he_tot)
for_each_dive (i, d) {
if (!d->selected)
continue;
- volume_t diveGases[MAX_CYLINDERS] = {};
- get_gas_used(d, diveGases);
+ volume_t *diveGases = get_gas_used(d);
for (j = 0; j < MAX_CYLINDERS; j++) {
if (diveGases[j].mliter) {
volume_t o2 = {}, he = {};
@@ -407,5 +411,6 @@ void selected_dives_gas_parts(volume_t *o2_tot, volume_t *he_tot)
he_tot->mliter += he.mliter;
}
}
+ free(diveGases);
}
}
diff --git a/core/statistics.h b/core/statistics.h
index 257303e19..6e125a217 100644
--- a/core/statistics.h
+++ b/core/statistics.h
@@ -10,7 +10,6 @@
#define STATISTICS_H
#include "core/units.h"
-#include "core/dive.h" // For MAX_CYLINDERS
#define STATS_MAX_DEPTH 300 /* Max depth for stats bucket is 300m */
#define STATS_DEPTH_BUCKET 10 /* Size of buckets for depth range */
@@ -62,7 +61,7 @@ extern void init_stats_summary(struct stats_summary *stats);
extern void free_stats_summary(struct stats_summary *stats);
extern void calculate_stats_summary(struct stats_summary *stats, bool selected_only);
extern void calculate_stats_selected(stats_t *stats_selection);
-extern void get_gas_used(struct dive *dive, volume_t gases[MAX_CYLINDERS]);
+extern volume_t *get_gas_used(struct dive *dive);
extern void selected_dives_gas_parts(volume_t *o2_tot, volume_t *he_tot);
#ifdef __cplusplus
diff --git a/desktop-widgets/tab-widgets/TabDiveInformation.cpp b/desktop-widgets/tab-widgets/TabDiveInformation.cpp
index 273bf4525..e6bb7c581 100644
--- a/desktop-widgets/tab-widgets/TabDiveInformation.cpp
+++ b/desktop-widgets/tab-widgets/TabDiveInformation.cpp
@@ -53,8 +53,7 @@ void TabDiveInformation::updateProfile()
ui->maximumDepthText->setText(get_depth_string(current_dive->maxdepth, true));
ui->averageDepthText->setText(get_depth_string(current_dive->meandepth, true));
- volume_t gases[MAX_CYLINDERS] = {};
- get_gas_used(current_dive, gases);
+ volume_t *gases = get_gas_used(current_dive);
QString volumes;
int mean[MAX_CYLINDERS], duration[MAX_CYLINDERS];
per_cylinder_mean_depth(current_dive, select_dc(current_dive), mean, duration);
@@ -76,6 +75,7 @@ void TabDiveInformation::updateProfile()
SACs.append(get_volume_string(sac, true).append(tr("/min")));
}
}
+ free(gases);
ui->gasUsedText->setText(volumes);
ui->oxygenHeliumText->setText(gaslist);
diff --git a/qt-models/yearlystatisticsmodel.cpp b/qt-models/yearlystatisticsmodel.cpp
index 5950ffd5d..d280808e9 100644
--- a/qt-models/yearlystatisticsmodel.cpp
+++ b/qt-models/yearlystatisticsmodel.cpp
@@ -3,6 +3,7 @@
#include "core/qthelper.h"
#include "core/metrics.h"
#include "core/statistics.h"
+#include "core/dive.h" // For NUM_DIVEMODE
class YearStatisticsItem : public TreeItem {
Q_DECLARE_TR_FUNCTIONS(YearStatisticsItem)