diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-06-27 07:42:09 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-11-09 19:19:04 +0100 |
commit | 11467fa326896934a299712810b74aef6a373c6f (patch) | |
tree | d8c599a8b2b5a50e4dd189ff8ec108cac20c007d | |
parent | f179ec033f39a6b774e6e6bb79f41771dfaf7e02 (diff) | |
download | subsurface-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.cpp | 7 | ||||
-rw-r--r-- | core/statistics.c | 11 | ||||
-rw-r--r-- | core/statistics.h | 3 | ||||
-rw-r--r-- | desktop-widgets/tab-widgets/TabDiveInformation.cpp | 4 | ||||
-rw-r--r-- | qt-models/yearlystatisticsmodel.cpp | 1 |
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) |