2D-Array mit variabler zeitverzögerter Ein- und Ausgabe
-
Hallo, ich bin ein C++ Anfänger und neu hier

Set up:
Ich arbeite mit einem Programm, welches eine eigene, jedoch an C++ angelehnte Programmiersprache hat (EcosimPro). C++ Funktionen mit Wertübergabe sind auch möglich.Problem:
Ich möchte das Programm um eine Speicherwalze erweitern. Es sollte ein Array sein, welches kontinuierlich einen Inputwert nach einer variablen Zeitverzögerung wieder ausgibt.Beispiel:
Z.B. Wasser wird in einen Behälter eingespritzt und die Verdampfungszeit ist variabel, d.h. von 0.0001 bis 0,1 Sekunden. D. h. der Wassermassenstrom verdampft variabel und zur unterschiedlichen Zeit wird eine unterschiedliche Menge an verdampftem Wasser generiert.
Frage:
-Kann ich das Problem mit einem dynamischen 2- Dimensionalem Array lösen? Wasser[zeit,masse]
-Der Zeitschritt des Solvers ist nicht konstant. Wie vermeide ich, dass der Massenwert in die gleiche Zeitzeile geschrieben wird und diese überschreibt?
-Wie groß kann array werden (Zeilenzahl für die Zeit) und wie verschiebe ich die Werte, wenn die oberen Zeilen frei geworden sind?
-Der Solver kann in der Zeit zurückgehen, wenn die Lösung nicht konvergiert. Wie beachte ich das?Ich hoffe, ihr könnt mir helfen. Ich würde mich schon über Ansätze freuen
Grüße
Reneking
-
reneling schrieb:
Hallo, ich bin ein C++ Anfänger und neu hier

Set up:
Ich arbeite mit einem Programm, welches eine eigene, jedoch an C++ angelehnte Programmiersprache hat (EcosimPro). C++ Funktionen mit Wertübergabe sind auch möglich.Kannst du etwas genauer sagen, was möglich ist und was nicht? Steht die C++-Standardbibliothek zur Verfügung? STL? Stehen alle C++-Sprachmittel zur Verfügung?
Problem:
Ich möchte das Programm um eine Speicherwalze erweitern.Was ist das?
Google: Speicherwalze
Bitte übersetz nicht eigenständig englische Fachwörter. Ich habe keine Ahnung, was gemeint sein soll.Es sollte ein Array sein, welches kontinuierlich einen Inputwert nach einer variablen Zeitverzögerung wieder ausgibt.
Immer noch nicht ganz klar. Meinst du eine (FIFO-)Queue?
http://en.wikipedia.org/wiki/Queue_(data_structure)
Was ist hier mit Zeit gemeint? Echte Zeit, wie sie auf der Systemuhr vergeht? Bloß die richtige Reihenfolge?Allgemein: Wenn du eine Datenstruktur suchst, dann guck erst einmal in die STL, falls die zur Verfügung steht. Es klingt vage so, als suchtest du eine deque oder list, vielleicht auch den queue-Adaptor. Arrays sind in C++ selten eine gute Antwort auf Fragen nach komplexen Datenstrukturen.
-
Kannst du etwas genauer sagen, was möglich ist und was nicht? Steht die C++-Standardbibliothek zur Verfügung? STL? Stehen alle C++-Sprachmittel zur Verfügung?
EcosimPro übersetzt die Eingabe in C++ und kompiliert den Code mit GNU Compiler. C++ ist die tatsächliche Sprache.
Was ist das?
Google: Speicherwalze
Bitte übersetz nicht eigenständig englische Fachwörter. Ich habe keine Ahnung, was gemeint sein soll.Ich habe mich falsch ausgedruckt. Ich habe an einen Ringpuffer mit einer festen Größe gedacht. Allerdings muss im Puffer der Wert immer wieder nach der Zeit einsortiert werden.
Zeit...Verzögerung.....Massenstrom Wasser
1.........2....................Wert löschen=Speicher freigeben
2.........2....................Wert löschen=Speicher freigeben
3.........1....................1Wert (Ausgabe bei t=3)
4.........5....................2Wert (Ausgabe bei t=4) +3 Wert (Ausgabe bbei t=4)
5
7
8
11........1....................4Wert (Ausgabe sollte bei t=9 erfolgen)Die Zeit ist hier der Zeitschritt des Solvers und ist variabel. Die Verzögerung ist die Verdampfungszeit des Wassersr und der Wert beinhaltet den Massenstrom des Wassers. Die frei gewordenen Zeilen werden freigegeben bzw =0 gesetzt. Wenn der Stack voll ist, soll ein Rücksprung auf Zeile 1 erfolgen.
So habe ich mir den Stack als Laie vorgestellt. Kann man das umsetzten? Stackgröße: 10e5? Verzögerung: von 0,00001 bis 0,1 Sekunden. Zeitschritt des Solvers=unbekannt.
Ich danke dir SeppJ
Grüße Reneking
-
Wenn es wirklich ein Ringpuffer sein soll, dann musst du dir den selber programmieren (oder aus externen Bibliotheken nehmen). Aber wieso auf eine feste Größe beschränken? Nimm doch eine deque und häng die neuen Werte hinten dran und nimm die alten Werte bei Bedarf vorne weg (Wann sollen die alten Werte eigentlich verschwinden? Das ist mir unklar).
Das mit der Zeit und der Verzögerung bin ich mir nicht sicher, ob ich das verstanden habe. Haben deine Daten einen Zeitstempel? Falls ja, dann speicher in der Datenstruktur ein Wertepaar/tripel aus Zeitstempel, Verzögerung und dem eigentlichen Wert.
Zeit...Verzögerung.....Massenstrom Wasser
1.........2....................Wert löschen=Speicher freigeben
2.........2....................Wert löschen=Speicher freigeben
3.........1....................1Wert (Ausgabe bei t=3)
4.........5....................2Wert (Ausgabe bei t=4) +3 Wert (Ausgabe bbei t=4)
5
7
8
11........1....................4Wert (Ausgabe sollte bei t=9 erfolgen)Warum wird denn nun der Wert bei Zeit 11 bei t=9 ausgegeben, der Wert von Zeit 4 bei t=4 und der Wert von Zeit 3 bei t=3? Oder hat die Zeit nix mit dem t zu tun? Was hat die Verzögerung in dieser Tabelle zu bedeuten?
-
Wenn es wirklich ein Ringpuffer sein soll, dann musst du dir den selber programmieren......
Wenn ich das wüsste...Ich habe solche Ansätze in Fortran-Code gesehen.
Zeit...Verzögerung.....Massenstrom Wasser
1e-5.........2e-5....................Wert löschen=Speicher freigeben
2e-5.........2e-5....................Wert löschen=Speicher freigeben
3e-5.........1e-5....................1Wert (Ausgabe bei t=3e-5)
4e-5.........5e-5....................2Wert (Ausgabe bei t=4e-5) +3 Wert (Ausgabe bbei t=4e-5)
5e-5
7e-5
8e-5
11e-5........1....................4Wert (Ausgabe sollte bei t=9 erfolgen)Aber wieso auf eine feste Größe beschränken?
Die Länge des Arrays sollte die größtmögliche Verdampfungsverzögerung abdecken. Ich dachte man muss bei jedem Array die Anzahl der Zeilen/Spalten vorgeben.
Beispiel: die Solverzeit ist bei 3e-5. Lese den aktuellen Wert für das verdampfte Wasser=1 Wert. Lösche die Zeile. Die Verzögerung ist 1,4563e-5. Schreibe den Wert bei Zeit =3e-5+1,4563e-5= 4,4563e-5 (Abrunden und in die nächste Zeile oder eine Zeile einfügen?)
Ich möchte die Werte/Zeit-Tabelle auswerten, um z.B. ein Wert dazwischen zu schreiben.Haben deine Daten einen Zeitstempel?
Ja, aber ich möchte diese sortiert hineinschreiben, da sonst bei dem nächsten Zeitschritt der Wert an falscher Stelle steht.
Datenstruktur ein Wertepaar/tripel aus Zeitstempel, Verzögerung und dem eigentlichen Wert
Wie sortiere ich dann? Ist es möglich?
Danke an SeppJ
Grüße
Fabia Reneking
-
reneling schrieb:
Aber wieso auf eine feste Größe beschränken?
Die Länge des Arrays sollte die größtmögliche Verdampfungsverzögerung abdecken. Ich dachte man muss bei jedem Array die Anzahl der Zeilen/Spalten vorgeben.
Du bist so sehr auf Arrays fixiert, das zeigt auch dein Fortran-Hinweis. In C++ hast du schon von der Standardbibliothek viele verschiedene Datenstrukturen für unterschiedliche Zwecke optimiert. Es gibt keinen Grund, künstlich einem Array eine andere Struktur aufzudrücken, weil das nicht die einzige Datenstruktur ist, die in C++ einfach zu nutzen ist.
Beispiel: die Solverzeit ist bei 3e-5. Lese den aktuellen Wert für das verdampfte Wasser=1 Wert. Lösche die Zeile. Die Verzögerung ist 1,4563e-5. Schreibe den Wert bei Zeit =3e-5+1,4563e-5= 4,4563e-5 (Abrunden und in die nächste Zeile oder eine Zeile einfügen?)
Ich möchte die Werte/Zeit-Tabelle auswerten, um z.B. ein Wert dazwischen zu schreiben.Ehrlich gesagt verstehe ich es immer noch nicht.
Haben deine Daten einen Zeitstempel?
Ja, aber ich möchte diese sortiert hineinschreiben, da sonst bei dem nächsten Zeitschritt der Wert an falscher Stelle steht.
Datenstruktur ein Wertepaar/tripel aus Zeitstempel, Verzögerung und dem eigentlichen Wert
Wie sortiere ich dann? Ist es möglich?
Es gibt selbstsortierende Datenstrukturen, z.B. ein set. Suchst du das? Ansonsten kannst du auch versuchen, an der richtigen Stelle in einem der sequence containers einzufügen, was jedoch unter Umständen nicht sehr performant ist - kommt auf die Nebenbedingungen an.
Ich hoffe übrigens mal, dass du dir inzwischen mal durchgelesen hast, welche Datenstrukturen es in C++ alle schon fix und fertig gibt:
http://en.wikipedia.org/wiki/Associative_containers_(C%2B%2B)
http://en.wikipedia.org/wiki/Sequence_container_(C%2B%2B)
http://stackoverflow.com/questions/10699265/how-can-i-efficiently-select-a-standard-library-container-in-c11 (Lies nicht nur das bild in der Frage, sondern mindestens auch die Antwort von Matthieu M.)