Modernes C++ programmieren

Okt 23, 2024

lst-1040-godb.cpp

//#(compile) c++; compiler:g132; options:-O3 -std=c++23; libs:-
// https://godbolt.org/z/Pj63xfn7x 
#include <future> // async
#include <vector>
#include <algorithm> // max
#include <iostream>

int berechneHoehe(int count, int maxCount, int scale) {
  if(maxCount == 0)
      throw std::logic_error("Alle Hoehen 0");
  return (count * scale) / maxCount;
}

void balken(const std::vector<int> &counts) {
  // Berechnung starten
  auto maxCount = *std::max_element(counts.begin(), counts.end());
  std::vector< std::future<int> > futs;
  for(int count : counts) {
    futs.push_back(
          std::async(std::launch::async,
              berechneHoehe, count, maxCount, 200) );
  }

  // Ergebnisse einsammeln
  for(auto &fut : futs) {
    std::cout << fut.get() << ' ';                // löst Exception aus
  }
  std::cout << '\n';
}

int main() {
  try {
    balken(std::vector {10,23,13,0,33,4 });       // Ausgabe: 60 139 78 0 200 24
    balken(std::vector { 0, 0, 0, 0 });           // löst Exception aus
  } catch(std::exception &ex) {
    std::cout << "Fehler: " << ex.what() << '\n'; // Ausgabe: Fehler: Alle Hoehen 0
  }
}