PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Empfehlung GUI Toolkit sowie Stringmanipulation von C/C++ Dateien


pajofego
2011-08-14, 12:57:44
Hallo zusammen,

die open source Simulationssoftware openFOAM besteht in typischer unix/linux Manier aus einer Ansammlung von ausführbaren tools. Um diese ausführen/benutzen zu können ist eine bestimmte Projektordnerstruktur notwendig. Die dort beinhaltenen Dateien haben C/C++ format. Jetzt ist es so, dass für jedes Tool zig hunderte Einstellmöglichkeiten gibt. Der geübte Anwender weiß auf Grund seiner Erfahrung wo er was zu ändern hat. Ich persönlich finde es manchmal nervig, dass ich in 20 Dateien Änderungen vornehmen muss. Es kommt auch vor, dass nicht alle Optionen dokumentiert sind und der nicht so erfahrene Anwender seine Mühen hat entsprechendes Projekt zu starten. Mir wäre eine bequeme GUI, die die Projektverwaltung übernimmt und alle Einstellmöglichkeiten aufzeigt lieb. Da es sowas zwar mal gab, aber auch irgendwelchen Gründen nicht mehr verfolgt wird, würde ich sowas gerne selbst angehen. Die GUI sollte Plattformübergreifend sein, wobei der Schwerpunkt ganz klar auf Linux liegen muss. Mir fallen das spontan GTK+, Qt und evt. Mono ein. Bei letzterem bin ich mir nicht so sicher, bin aber offen für alle Vorschläge. Kopfzerbrechen bereitet mir das Thema die ganzen C/C++ Dateien mit Leben zu füllen. Mit welcher Methode/Library oder gibt es Ansätze über Vorlagen lassen sich C/C++ Dateien reicht einfach manipulieren? Letzte Frage: Welche Sprache empfiehlt ihr für eine solche Aufgabe? Ich bin für alles offen, außer Java. Mag ich nicht so!

Für Tipps wäre ich euch dankbar.

Danke und Gruß
pajofego

Marscel
2011-08-14, 15:15:07
Fürs Frontend ist bei Crossplatforming Qt schon ganz handlich.

Ich weiß nicht, was du in den Dateien ändern willst, aber vielleicht reichen ja reguläre Ausdrücke dafür (Qt, Boost, ...).

pajofego
2011-08-14, 21:32:38
An Qt und regulären Ausdrücken hatte ich auch als erste Lösung im Kopf. Ich frage mich ob es nicht einfachere Lösungen gibt. Gibt es parser extra für C/C++ typische Dateiformate? Ich meine auch schon des öfteren automatische Codegeneratoren gesehen zu haben. Wie arbeiten diese? Setzen alle tools auf reguläre Ausdrücke?!? Zu ändern wäre vereinzelte Codeabschnitte die teilweise nicht länger als zwei drei Zeilen sind. Dies kann sich über mehrere male wiederholen auch in unterschiedlichen Dateien.

Coda
2011-08-14, 22:01:27
Definiere "C/C++ Format".

pajofego
2011-08-14, 22:08:45
Guter Einwand!

Hier ein Beispiel


/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.7.1 |
| \\ / A nd | Web: www.OpenFOAM.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

ddtSchemes
{
default steadyState;
}

gradSchemes
{
default Gauss linear;
grad(p) Gauss linear;
grad(U) Gauss linear;
}

divSchemes
{
default none;
div(phi,U) Gauss linearUpwind Gauss linear;
div(phi,nuTilda) Gauss linearUpwind Gauss linear;
div((nuEff*dev(grad(U).T()))) Gauss linear;
}

laplacianSchemes
{
default none;
laplacian(nuEff,U) Gauss linear corrected;
laplacian((1|A(U)),p) Gauss linear corrected;
laplacian(DnuTildaEff,nuTilda) Gauss linear corrected;
laplacian(1,p) Gauss linear corrected;
}

interpolationSchemes
{
default linear;
interpolate(U) linear;
}

snGradSchemes
{
default corrected;
}

fluxRequired
{
default no;
p ;
}


// ************************************************************************* //


alles was in den { } kann bzw. soll von außen verändert werden.

Coda
2011-08-14, 22:12:51
Musst du wirklich die Semantik der Dateien verstehen, oder reicht "search/replace"?

Regexps sind halt nur für kontextfreie Sachen geeignet, wie dir sicher bewusst ist.

pajofego
2011-08-14, 22:32:07
Nein, dass übernimmt openFOAM. Die Syntax muss am Ende stimmen. Ob's sinnvoll ist stellt sich am Ende heraus. Die Idee wäre, der Anwender kann alle Einstellmöglichkeiten auswählen, diese werde wie im o.g. file abgespeichert. Eine Art config file. Heute würde man so etwas eher in einer xml Datei abspeichern. Keine Ahnung wieso die Macher ein C/C++ Format ausgewählt haben. Ich denke da waren mehr Physiker und weniger Informatiker dran.

Marscel
2011-08-14, 22:38:38
Ich dachte, das wären irgendwelche C++-Header, aber wenns nur das ist:

An deiner Stelle würd ichs einparsen, von der syntaktischen Komplexität sieht es nun nicht so schwer aus, und im Falle einer Änderung einfach neu schreiben.

Abgeschätzt (wenn sich das nur im Bereich des Samples bewegt): from scratch weniger Aufwand als ein JSON-Parser - und das ist keine große Sache.

Coda
2011-08-14, 22:40:41
Ich würde auch tendenziell eher parsen. Wahrscheinlich ist das sogar so einfach, das sich nichtmal ein Parser-Generator wie ANTLR lohnt.

pajofego
2011-08-14, 22:45:32
Ja,

das o.g. Beispiel ist representativ für alle anderen Input-Dateien. Dann werde ich mich bzgl. Parsen schlau machen. Habt ihr gute Links über gute Beispielimplementierungen in C++?

Auf die Schnelle habe ich schon mal diesen hier gefunden:
http://jsoncpp.sourceforge.net/

Bud Spencer
2011-08-14, 22:52:11
Muss es C++ sein? Java hat sicher schon Fertigklassen für sowas. Es kommt immer an den Anwendungsfall an, welche Programmiersprache man besser verwendet. Aber Dateien in einem bestimmten Format abzuspeichern hört sich sehr unabhängig an von der Programmiersprache. Tue dir daher besser selbst einen Gefallen und verwende Java.

Marscel
2011-08-14, 22:52:38
Gibt da ~zwei Möglichkeiten: Entweder du parst einmal alles ein und hast dann so einen Objekt-Attribut-Baum, den du durchgehen kannst oder aber du nutzt einen Callback-getriebenen.

Ersterer Weg ist u.U. einfacher zum Zurückschreiben, letzterer lohnt sich bei riesiegen Datenmengen.

Eine Übersicht für so ein paar Parserimplementierungen findest du hier: http://json.org/

pajofego
2011-08-14, 23:17:14
Datenmenge ist eher klein. D.h. max. 20-30 Dateien in der Größe des o.g. Beispiel. Der Parser sollte flexible sein, bzw. erweitbar. Weil jedes Jahr ein Update heraus kommt und da können schon einige Änderungen dabei sein.

C++ muss nicht sein, bin offen für alles, wenn's sein muss auch Java. Letzteres nur wenn ich eine Lib finde, die mir die größte Arbeit abnimmt. Meine Erfahrung lehrt, meistens gibt's auch eine Lösung für C++. Es sollte nach Möglichkeit einen großen Kreis an Programmierer ansprechen, da ich sowas als open source einstellen werde.

Bud Spencer
2011-08-14, 23:52:33
Hmm, dies erfordert ein bissl Recherchearbeit.
Es gibt viele Parserlibs in Java, sehe ich gerade.
Z.B. http://jsapar.tigris.org/
Man muss sich etwas mit jedem beschäftigen um sicher sagen zu können, dass es deine Anforderungen erfüllt.

Marscel
2011-08-15, 00:12:19
Es sollte nach Möglichkeit einen großen Kreis an Programmierer ansprechen

Na dann PHP. :ulol: Nein ernsthaft, dein Projekt, deine Skills - wird genügend geben, die dein Projekt unabhängig von deiner Wahl bearbeiten können.

Hmm, dies erfordert ein bissl Recherchearbeit.
Es gibt viele Parserlibs in Java, sehe ich gerade.

Ich meine, das erfordert bloß einen istream (oder Äquivalente) und minimalstes State-Transition-Denken.

Sonst hast du zus. wieder Abhängigkeiten, ggf. Lizenzbindungen und verbringst bei diesem einfachen Sample möglicherweise genauso viel Zeit damit, dich in die Beschreibungssprache der Lib einzuarbeiten wie es selbst umzusetzen.

Ectoplasma
2011-08-15, 08:40:27
Ja,

http://jsoncpp.sourceforge.net/

Genau, nimm die Lib als Vorlage und schau dir an, wie ein Parser funktioniert. Den Rest baust du dir selbst. Das Foam Format sieht ja schon fast wie JSON aus. Für eine Lösung in Java würdest du genau so lange brauchen.