C++Guns – RoboBlog blogging the bot

02.11.2019

GIT SHA hash in QT as macro created at compile time

Filed under: Allgemein — Tags: — Thomas @ 17:11

print git hash in qt as macro created at compile time

This works for me:

.pro File:
DEFINES += GIT_CURRENT_SHA1="\\\"$(shell git rev-parse HEAD)\\\""

C++ File:
std::cout << __DATE__ << " " << __TIME__ << " GIT " << GIT_CURRENT_SHA1 << "\n";

The build directory must be inside the GIT directory of the project.

Nov 2 2019 16:41:22 GIT bf2d25f47afe2c8befcfa6fefb25acbb462d43b3

12.10.2019

Märklin Metall HO Gleisdreieck, Gleisfünfeck und andere Gleisfiguren

Filed under: Allgemein — Tags: , — Thomas @ 21:10

Winkel von Ausgleichstücken und Kurven
Gleisradien
Spass mit der gekürzten 5137
Unsere eigene Anlage von 1994
Drehscheibe, Lokschuppen, Wenden oder Drehen
Schattenbahnhof, Kehrschleife
Bahnhöfe Betriebswerke
Inspiration aus Youtube (und anderen Quellen)
Paradestrecke
Gleisdreiecke
Gleisfünfecke
Hosenträger
Industriekreuzungen

TODO Bauzen

Winkel von Ausgleichstücken und Kurven

5205 5.7 11.4 17.1 23.8 29.5 34.2 39.9 45.6 51.3
5102 7.5 15.0 22.5 30
5102+5205 13.2 (18.9 20.7)
5101 15.0 30
5206 24.3 48.6
5100 30.0
5120 45.0

Gleisradien

gleisradius1
Die normalen drei Märklin M-Gleis Radien: Parallelkreis 437.4mm, Normalkreis 360mm und Industriekreis 286mm. Zusammen mit den ganz Alten Kreisen 39A 585mm und 38A 535mm.

gleisradius2
Schöner ist es, wenn die Kurve langsam enger wird und nicht so abrupt anfängt. Eine Kombination aus Parallelgleis und Normalgleisstücken zeigt eine ganz leicht angedeutete Ellipsenform. Zum Vergleich ist der Parallel und Normalkreis übereinander gelegt mit abgebildet.

gleisradius3
Durch die Kombination von kleinen Ausgleichstücken lässt sich die Ellipse noch ein Stück in die Länge ziehen.

gleisradius4
Mit dieser Technik kann auch mittel Bogenweichen aus einer zwei gleisigen Strecke eine drei gleisige Strecke gemacht werden. Die Weichen werden in die Kurve verlegt, das spart Platz im Bahnhof.

gleisradius5
Oder eine vier gleisige Einfahrt.

gleisradius6
Wer sagt, dass man mit den Metallgleisen nicht vier Gleisradien haben kann ^^

Spass mit der gekürzten 5137

5137_1

5137_1_bild

Mit dem Ausgleichstück bekommt man mit der gekürzten Weiche einen normalkreis Abstand von 96mm. Dreht man das Ausgleichstück um, sind es nur 55m. Zwei unterschiedliche Gleisabstände mit nur einer Weiche. Gewieft ;)

Unsere eigene Anlage von 1994

Video auf Youtube

H0_Anlage_1994

Drehscheibe, Lokschuppen, Wenden oder Drehen

Der Gleisplan aus dem Märklin Drehscheibe 7186 Begleitheft.
maerkling_7186_gleisplan


Die Gleisharfe aus dem Märklin Drehscheibe 7186 Begleitheft.
maerklin_7186_gleisharfe


Aus 18.Jan 2020 Siegburger Modellbahntage Fotos von Wolfgang

siegburg_bild

siegburger


wendendrehenschuppen

kehrschleifenacht

Schattenbahnhof, Kehrschleife

schattenbahnhof_kehrschleife1

Fläche 2.5qm Nutzbare Gleislänge ca. 155cm


schattenbahnhof_kehrschleife2

Fläche 2.2qm Nutzbare Gleislänge ca. 124cm


schattenbahnhof_kehrschleife3

Fläche 1.7qm Nutzbare Gleislänge ca. 77cm


schattenbahnhof_kehrschleife4

Fläche 1.6qm Nutzbare Gleislänge ca. 72cm


schattenbahnhof_kehrschleife5

Fläche 2qm Nutzbare Gleislänge ca. 144 - 162cm


schattenbahnhof_kehrschleife6

Fläche 2.1qm Nutzbare Gleislänge ca 135 - 153cm

Bahnhöfe Betriebswerke

Motivation für diesen Gleisplan ist es, den geringe Gleisabstand von nur 54mm gegenüber den Parallelgleisabstand von 74mm einmal auszuprobieren. Dies wird durch die ehr seltenen Weichen 5137 möglich. Ein sauberer Anschluss an Bogenweichen ist auch möglich. So ist es möglich, die Gleise näher zusammen zu rücken und dann recht und links ein Bahnsteig zu bauen.
Auch habe ich in diesem Gleisplan den Normalgleisabstand von 96mm ausprobiert um einen breiten Bahnsteig zwischen den Gleisen zu realisieren.
Es gibt eine zweigleisige Hauptstrecke. Das zweite Gleis im Bahnhof kann von beiden Richtungen befahren werden.
Auch eine Ausfahrt auf der linken Seite auf dem Gegengleis ist durch das zusätzliche paar Bogenweichen möglich.

bahnhof1
bahnhof1_bild


wendendrehenschuppen2

wendendrehenschuppen2_bild


petershagen

Inspiration aus Youtube (und anderen Quellen)

theke3d

theke

Vielen Dank an debdog!


Thorstens MOBA-Design Anlage 019 – Testanlage in Spur 0
Wenn es in Spur 0 ins Zimmer passt, dann geht auch H0 rein.

anlage19_bild

anlage19_gleisplan


Modellbahnen von Josef Brandl: Täuschend echt

brandl

brandl_bild


Amazing Crazy Train Videos!!!

bhfausfahrtbruecke_vorbild

bhfausfahrtbruecke_bild

bhfausfahrtbruecke


The Val Valley branch line

a) Mit Normalkreis Weichen
b) Mit Parallelkreis Weichen
Die vielen Kreuzungen sehen ja schon cool aus, aber sie sind irgendwie sinnlos.
c) Hauptstrecke verzweigt erst nach den Abstellgleisen.
d) Hauptstrecke getrennt von den Abstellgleisen
e) Platz zwischen Haupstrecke und Abstellgleisen für Signal und Lok zum umsetzen

valvalley


Vielen Dank an Wolfgang!

sabionski_bhf_hintern_bild

sabionski_bhf_hintern


Aus Märklin H0 Messe anlage Intermodellbau Dortmund 2018

intermodellbaudortmund2018

intermodellbaudortmund2018_bild


Aus Mon Réseau Heidelberg (Marklin HO)

monresenaubild

monreseau


Aus Frank Schoder Youtube Kanal

Der Gleisplan ist riesig und geht über zwei Zimmer.
(Auf die Bilder zum vergrößern klicken)

frankschoderbild1
frankschoderbild2

frankschoder


Vielen Dank an WolfgangSch

wolfgang1

wolfgang1


Aus Neues von der Schwagerbahn, viele neue Details...

schwagerbahn1

schwagerbahn1bild


Aus Märklin H0 Bahn Vintage

Maerklin_H0_Bahn_Vintage_Gleisplan


Aus Zugverkehr mit Märklin-Altbauloks

dreiwegeweiche1


Aus Modellbahnhof Glauburg-Stockheim

Der Screenshot ist aus dem Video bei etwa Minute 6.

GlauburgStockheim_bild

GlauburgStockheim

Der Gleisplan sieht immer etwas verwirrender aus als das Modell selbst.


Aus 4K: Modellbahn: Planung Teil 4 - nützliche Gleisfiguren (mit Gleisplänen)

industrieanlage1

Mit Übergabebahnhof, Ringbahn, Kehrschleife, Gleisdreieck, Laderampe, Abstellgleise

industrieanlage1_bild


Aus "Märklin H0 Gleisanlage 0390 Für M Gleise"

Personen und Güterbahnhof mit Haupt-, Neben-, Abstell-, Lokverkehrs-, Auszieh-, Richtungs-, Schadwagen-, Packwagen-, Rampen-, Schuppen-, Freilade-, Werkstatt-, Lokbehandlung- und Untersuchungsgleis.

H0Gleisanlagen_0390_Bahnhof

Created with GIMP


Aus 4K – Modellbahn Planung Teil 53 – Ein End-, Kopf- und Spitzkehrenbahnhof

Paradestrecke, Kopfbahnhof, zwei Ebenen, Lokschuppen, Laderampe und Hosenträger verbaut. Der Zug kommt einem auf der Paradestrecke schräg entgegen. Im Untergrund kann noch eine Kehrschleife und Schattenbahnhof eingebaut werden.
Betriebskonzept: Ein Zug kommt von rechts auf der blauen Strecke an und fährt in das Stumpfgleis, um sogleich rückwärts in den Bahnhof einzufahren. Danach fährt er vorwärts links aus dem Bahnhof raus.
Auf der rot/orange Strecke kommt von links ein anderer Zug und kann unabhängig von dem, was auf der blauen Stecke passiert, in den Bahnhof einfahren.

gleisplan_miltenberg


Aus Folge 036 - Der Gleisplan (Deutsch/German)

Übersicht
folge36_uebersicht

Ebene 0 - Schattenbahnhof
folge36_schattenbahnhof

Ebene 1
folge36_rechts

Ebene 2
folge36_mitte

Ebene 3
folge36_links


Aus Folge 077 - Der Gleisplan meiner neuen MoBa (Deutsch/German) - H0e

Übersicht
gartenbahn_folge77_uebersicht

Fiddle-Yard
gartenbahn_folge77_fiddleyard

Erster Bahnhof
gartenbahn_folge77_erster_bahnhof

Endbahnhof
gartenbahn_folge77_endbahnhof


Aus Martin´s Gartenbahn 2020 auf 250m²

Man beachte, dass gemäß Vorbild Kreuzungsweichen, statt Doppelkreuzungsweichen eingesetzt wurden.

gartenbahn_martin_2020


Aus 6.Östl. Gartenbahntreffen 2014, Teil 1/2

gartenbahn_6_2014_1_2


Aus Youtube: HSB Gartenbahn 14-08-2011 Teil 2 / 3
gartenbahn_HSB_2011


Aus YouTube: Doppelausfahrt HSB

gartenbahn_doppelausfahrt_HSB


Aus Gartenbahn Mallorca 2020

Zwei Strecken treffen sich am Begegnungsgleis der Steigungsstrecke.

gartenbahn_mallorca_2020

Paradestrecke

In irgendeinem Buch las ich von einer Paradestrecke, die aber nicht parallel zur Anlagenkante verlaufen soll, sondern ehr V-förmig. Das hat den Vorteil, dass man die Lok auch von vorne und hinten sehen kann. Statt immer nur von der Seite.

Gar nicht so leicht irgendetwas Sinnvolles zu erstellen.

paradestrecke3

Der zweite Versuch geht mehr in die Länge statt der Tiefe.

paradestrecke2

Der erste Versuch ist einfach nur knapp gehalten. Aber mit einer zu großen Anlagentiefe.

paradestrecke1

Gleisdreiecke

Nicht schön, aber möglich.

gleisdreieck1

gleisdreieck2

gleisdreieck3

gleisdreieck4

gleisdreieck5

gleisdreieck6

gleisdreieck7

gleisdreieck8

Gleisfünfecke

gleisfuenfeck1

gleisfuenfeck2

Hosenträger

standardhosentraeger


dreiweghosentraeger


doppelhosentraeger


hosentraegerseltsam


bogenweichenhosentraeger


nocheinhosentraeger

Vorbild

Industriekreuzungen

industriekreuzungen


industriekreuzungen2

06.10.2019

C++ Guns: acpl Histogram2D: Ordnungszahl vs. Atomgewicht

Filed under: Allgemein — Tags: — Thomas @ 13:10

Steigt das Atomgewicht mit der Ordnungszahl an? Hmmm. Lasst uns das in einem 2D Histogramm überprüfen!

ordnungszahlatomgewichthist2d

        PSE pse;

        std::vector<double> ordnungszahlen;
        for(uint32_t i=1; i <= pse.nElements(); ++i) {
            ordnungszahlen.push_back(i);
        }
        acpl::HistogramAxis Xaxis("Ordnungszahl", acpl::FixBinSize{50}, acpl::makeDataIntervalClosed(ordnungszahlen));

        std::vector<double> gewicht;
        for(uint32_t ordnungszahl=1; ordnungszahl <= pse.nElements(); ++ordnungszahl) {
            gewicht.push_back(pse.atomgewicht(pse.atomByOrdnungszahl(ordnungszahl)));
        }
        acpl::HistogramAxis Yaxis("Atomgewicht", acpl::FixBinSize{20}, acpl::makeDataIntervalClosed(gewicht));

        acpl::Histogram2D hist(Xaxis, ordnungszahlen, Yaxis, gewicht);
        std::cout << hist;

16.09.2019

C++ Guns: BIG UNICODE

Filed under: Allgemein — Tags: — Thomas @ 20:09

Vorheriger Post: Search C++ Guns: C++ && Unicode
Vorvorherige Post: Qt && Unicode

es gibt BIG unicodes
das sind die unicodes zahlen mit mehr als 4 digits
und da gibts tolle symbole
wie z.b. die spielkarten 1 2 3... bube könig ass und so
DIE WILL ICH HABEN :D
normal leitet man ein unicode charater mit \u ein
weil wir ja alle utf8 haben brauchen wir für UTF32 halt 8 digits
damit dass der compliler check, gibt es nun auch \U
also
u8"\U0001F0A1"
HELL is near

13.09.2019

Hydstruct Datenstruktur

Filed under: Allgemein — Thomas @ 09:09

class diagram

29.07.2019

C++ Guns: P1161R3 Deprecate uses of the comma operator in subscripting expressions

Filed under: Allgemein — Tags: — Thomas @ 14:07

Endlich.

ND Arrays in std C++ wir kommen

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1161r3.html

Don't forget GCC -Werror=unused-value

array[x]      // Ok
array[(x,y)]  // Ok, uses y as index/key
array[x,y]    // Deprecated, uses y as index/key

08.07.2019

C++ Guns: std::ofstream better err msg

Filed under: Allgemein — Tags: — Thomas @ 20:07

Folgender Fetzen Code gibt eine gescheite Fehlermeldung für streams (wann fixen die endlich streams & exceptions?)

    auto fileName = std::string(getenv("HOME")) + "/config/clusterprocessaccounting.dat";
    std::ofstream f(fileName);
    if(not f) throw std::system_error(errno, std::system_category(), "failed to open " + fileName + " ");

terminate called after throwing an instance of 'std::system_error'
what(): failed to open /home/ite/config/clusterprocessaccounting.dat : No such file or directory

04.07.2019

C++ Guns: Fingerübung: can convert double to int?

Filed under: Allgemein — Tags: — Thomas @ 09:07

Wir bekommen öfter mal große integer Zahlen als double gespeichert in den Daten. Beim konvertieren nach Text (andere story) mit 6 signifikanten Ziffern und wissenschaftlicher Darstellung fallen Ziffern weg. Obwohl die wissenschaftliche Darstellung mit einem Exponent bei ganzen Zahlen nicht nötig wäre.

Fingerübung: Schreibe eine Funktion die true zurück gibt, wenn die übergebene double Zahl in ein 32bit signed integer, ohne Verluste, passt.

Da es UB ist, eine zu große double Zahl einem int zuzuweisen (mit constexpr überprüft), ist die Aufgabe nicht ganz so trivial.

constexpr int xxx = std::numeric_limits<int>::max()+1.0; // error: overflow in constant expression

Noch dazu kann ein Integer mehr negative Zahlen als positive Speichern (Die Null zähl mit). Und es gibt natürlich noch Inf und Nan.
Nach drei Versuchen sieht der Code nun wie folgt aus. constexpr Test inklusive.

#include <limits>
#include <cmath>

constexpr inline bool canConvertToInt(double d) {
  if(std::isnan(d) or std::isinf(d)) return false;
  if(d > 0) {
    return d <= std::numeric_limits<int>::max() and d-int(d)==0;
  } else {
    return d >= std::numeric_limits<int>::min() and d-int(d)==0;
  }
}

  static_assert(canConvertToInt(std::numeric_limits<int>::max()-1));
  static_assert(not canConvertToInt(std::numeric_limits<int>::max()-1 + 0.5));
  static_assert(canConvertToInt(std::numeric_limits<int>::max()));
  static_assert(not canConvertToInt(std::numeric_limits<int>::max()+0.5));

  static_assert(canConvertToInt(std::numeric_limits<int>::min()+1));
  static_assert(not canConvertToInt(std::numeric_limits<int>::min()+1-0.5));
  static_assert(canConvertToInt(std::numeric_limits<int>::min()));
  static_assert(not canConvertToInt(std::numeric_limits<int>::min()-0.5));

  static_assert(not canConvertToInt(std::numeric_limits<double>::infinity()));
  static_assert(not canConvertToInt(std::numeric_limits<double>::quiet_NaN()));
  static_assert(not canConvertToInt(std::numeric_limits<double>::signaling_NaN()));
  static_assert(not canConvertToInt(std::numeric_limits<double>::denorm_min()));

Der Praxistest kann beginnen.

22.06.2019

C++ Guns: 2019-06 pre-Cologne Paper - funny one

Filed under: Allgemein — Tags: — Thomas @ 08:06

P1770R0: On vectors, tensors, matrices, and hypermatrices - Wirklich jeder sollte diese kurze Präsentation einmal durchschauen. Ich habe den Eindruck, als hätte mindestens ein Mensch auf der Welt Ahnung von dem Thema.

P1764R0: ssize Should be Named count - Kurz und kompakt

P0631R7: Math Constants ENDLICH!

P1768R0: Contiguous Containers Should Contain .data() - Ja

P1751R0: Numeric Type Families - Ich weiss nicht ob ich integer will die Overhead mitbringen

P1717R0: Compile­time Metaprogramming in C++ - Zu lang zum lesen jetzt

P1708R0: Simple Statistical Functions - Sehr gut! Im Kontrast zu acpl

P1709R0: Graph Data Structures - Wow, viel Stuff. Das muss ich mal mit acpl::Graph vergleichen

P1682R0: std::to_underlying for enumerations - Siehe auch std::underlying_type

P1680R0: Implementing Contracts in GCC - Nice! Unbedingt zeitnah mal ausprobieren

P1672R0: “Axiom” is a False Friend - !

P1429R2: Contracts That Work

p1744r0: Avoiding Misuse of Contract-Checking - To read

p1743r0: Contracts, Undefined Behavior, and DefensiveProgramming - To read

P1645R0: constexpr for algorithms constexpr ftw

P0037R7: Fixed-Point Real Numbers

P0267R9: A Proposal to Add 2D GraphicsRendering and Display to C++

P1467R1: Extended floating-point types 16bit floats, ARM, GPU

P1331R1: Permitting trivial default initialization in constexpr contexts

P1301R3: [[nodiscard("should have a reason")]] - Warum nicht

P1280R2: Integer Width Literals

P1068R1: Vector API for random number generation

P1050R1: Fractional Numeric Type

P1030R2:std::filesystem::path_view

P1021R4: Filling holes in Class Template Argument Deduction

P0784R6: More constexpr containers

P0533R5: constexpr for and

Mehr...
2019-06 pre-Cologne mailing available (1 of 2)
2019-06 pre-Cologne mailing available (2 of 2)

09.06.2019

C++ Guns: std::filesystem und std::regex

Filed under: Allgemein — Tags: — Thomas @ 07:06

Heute mache ich die ersten Versuche mit std::filesystem und std::regex. Der GCC 8.1 ist installiert. Die Doku liegt bereit. Es kann los gehen.

std::filesystem

Ich möchte bestimmte "Müll" Dateien im Projekt Verzeichnis auflisten und ihren Speicherplatzverbrauch summieren. Die Handhabung von std::filesystem ist wirklich erstaunlich einfach. Klar strukturiert. Es funktioniert. Etwas, dass böse Zungen von std::chrono ja nicht behaupten.

Eine Schleife über alle Dateien in einem Verzeichnis geht echt fix:

#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
for(auto& p: fs::recursive_directory_iterator("/", fs::directory_options::skip_permission_denied)) {
    if(p.is_regular_file()) {
        std::cout << p.path().filename() << " " << p.file_size() << '\n';
    }
}

Bis GCC 8 muss das Projekt noch explizit mit -lstdc++fs, ab GCC 9 dann nicht mehr.

Achtung: Beim GCC 8.1 und Netzlaufwerke hab ich festgestellt, dass is_regular_file() falsche Werte zurück gibt. Im Vergleich zu fs::is_regular_file(fs::status(p)), was das selbe macht. Ob das im GCC 9.1 auch so ist, muss ich noch prüfen.

Die Fehlerbehandlung ist auch nett gelöst. Man hat diesmal die Auswahl zwischen Exception und Error Code. Viele Funktionen kann ein error_eode Objekt übergeben werden (als Referenz nicht als Pointer woohoo!).

std::error_code ec;
for(auto& p: fs::recursive_directory_iterator("/", fs::directory_options::skip_permission_denied, ec)) {
if(e) {
    std::cout << e.message();

Oder mit Exception.

try {            
    if(fs::is_regular_file(fs::status(p))) {
    }
catch(fs::filesystem_error& err) {
    std::cerr << err.what() << "\n";
}

Als keiner Bonus hier meine std::filesystem::file_type ostream Funktion

std::ostream& operator<<(std::ostream& s, const std::filesystem::file_type type) {
    using std::filesystem::file_type;
    switch (type) {
    case file_type::none:      s << "none"; break;
    case file_type::not_found: s << "not_found"; break;
    case file_type::regular:   s << "regular"; break;
    case file_type::directory: s << "directory"; break;
    case file_type::symlink:   s << "symlink"; break;
    case file_type::block:     s << "block"; break;
    case file_type::character: s << "character"; break;
    case file_type::fifo:      s << "fifo"; break;
    case file_type::socket:    s << "socket"; break;
    case file_type::unknown:   s << "unknown"; break;
    }
    return s;
}

std::regex

Regex ist auch garnicht sooo schwer, wenn man es mal kann. Ich möchte alle Dateien dieser Form finden: dbg_0000 dbg_0001 u.s.w. Das passende Regex Objekt sieht dann so aus:

const std::regex dbg_regex("dbg_[[:digit:]]+");

for(auto& p: fs::recursive_directory_iterator("/", fs::directory_options::skip_permission_denied)) {
    if(p.is_regular_file()) {
       if(std::regex_match(p.path().filename().c_str(), dbg_regex)) {
           // found
       }
    }
}

Als Verbindung zwischen Dateiname und Regex dient C-String. Da es string_view hier (noch?) nicht gibt.

« Newer PostsOlder Posts »

Powered by WordPress