Archiv verlassen und diese Seite im Standarddesign anzeigen : Konfigurationsdateien in C++
Hiho^^,
ich bin grad dabei mein erstes eigenes Programm (wenn man die "Projekte" aus der Ausbildung mal ausser Acht lässt) zu erstellen. Dieses soll sich auch einige Dinge merken (Pfadangaben und evtl. andere Einstellungen).
Jetzt frag' ich mich, wie ich am Besten eine Konfigurationsdatei erstelle und die im Nachhinein wieder richtig auslese.
Das Schreiben in und das Lesen aus Dateien sollte dabei das geringere Übel sein.
Nur irgendwie müsste ich die geschriebenen Werte ja den Variabeln im Programm zuordnen...
Crash-Override
16.07.2006, 14:19
Ich würd mir INI oder XML Routinen suchen/schreiben. Für den Anfang ist INI allerdings leichter, wobei XML logischerweise ne Menge mehr kann.
Und nach der Methode:
Zeichenfolge im Stream (Datei) suchen und den Wert, der danach Folgt, auslesen.
geht's nicht?
Ich hab mich (heute Nacht) mal mit dem Thema .ini "rumgeschlagen". Ganze Parser findet man da... wieso muss das alles immer so komplex und aufgeblasen sein?^^
Eine ganz simple Konfig... mehr will ich doch garnicht^^ (für V1 meines Programms...sagt ja keiner, dass es nicht komplexer werden darf)
Wo ist das Problem? Einfach die Datei öffnen und beispielsweise mit fscanf() auswerten. Schon hast du die Informationen aus der Datei.
PS: Ist allerdings waschechtes C.
freundliche Grüße, Rolus
Entweder du arbeitest an einer Stelle die ganze Datei ab und setzt entsprechend alle deine Variablen, oder du arbeitest jedes mal, wenn du einen speziellen Wert aus der Datei brauchst, die Datei zeilenweise ab, bis du den Wert findest, den du benoetigst, oder (die bessere Variante) du liest die ganze Datei in einen Speicherblock ein und roedelst dann auf dem Speicherblock an Stelle der Datei rum.
Was ist genau dein Problem ? Das Ein-/Auslesen, das Finden eines bestimmten Bezeichners und seines Wertepaares, oder die Verwaltung deiner Variablen ?
Mein Problem ist momentan das Lesen und Schreiben in Dateien... ich hab' das zwar schonmal gemacht (ergo: Ich wusste mal wie's geht^^)... aber irgendwie wills mit "ofstream" und "ifstream" nicht so recht werden... es sei vielleicht dazu gesagt, dass ich den CBuilder1 verwende (von der Ausbildung aus).
Crash-Override
16.07.2006, 17:48
Du kannst wenn du nur Windows verwendest scheinbar auf WinAPI Funktionen zurückgreifen: http://www.c-plusplus.de/forum/viewtopic-var-t-is-39388.html (2. letzter Post) oder wenn du es selbst machen willst kannst du dir ja mal http://c.snippets.org/snip_lister.php?fname=ini.c ansehen.
wenn du es selbst machen willst kannst du dir ja mal http://c.snippets.org/snip_lister.php?fname=ini.c
Ziemlich derbes C^^
Ist ja schon größer als mein Projekt^^
Schau dir einfach mal die Funktionsweise von fscanf() an. Wird zum Beispiel hier (http://www.pronix.de/pronix-786.html) erklärt. Damit kannst du deine Konfigurationsdatei recht schnell selbst auswerten, ohne unnötig viel fremden Code nutzen zu müssen. Geht dann so nach dem Prinzip:
char path[96];
FILE * file;
file = fopen ("config.ini","r");
fscanf (file, "Pfad=%s\n", &path);
freundliche Grüße, Rolus
thx, endlich mal eine Seite, die mir weiterhilft. Obwohl diese "ini.c" an sich ja nicht schlecht ist. Für dieses (noch) kleine Projekt aber wohl (noch) zu viel.
Reine Frage aus interesse... eine Konversion des Ganzen nach C++?
Und: muss ich was beachten, wenn ich mit AnsiStrings arbeite?
Teelicht
17.07.2006, 11:16
Eine Konversion in C++ ist ja gar nicht notwenig, da du es einfach so in einem C++ Programm benutzen kannst. Zudem ist mir keine C++ Funktion wie fscanf bekannt, aber das hat nicht unbedingt was zu sagen.
Bei Ansistrings gibt es nicht viel zu beachten. Probier mal aus, ob statt dem Character-Array auch ein Ansistring funktioniert, wenn nicht kannst du den Charakter Array ja einfach in einen Ansistring umformen:
std::string cppstring;
char cstring[80];
strcpy (cstring, "Hallo Welt");
cppstring = cstring;
std::cout << cppstring << std::endl;
Du solltest vielleicht noch beachten, am Ende nochmal fclose zu benutzen, damit es auch vollständig ist.
Gruß, Micha <><
So~,
hab' mich heute, nach se~hr langer Zeit, mal wieder an das Programm gesetzt und die paar Zeilen "eingehackt", wie mein Lehrer zu sagen pflegt.
Es funktioniert zwar alles, ich möchte dennoch sichergehen, dass ich da keinen Schwachsinn geschrieben habe. Ausserdem gefallen mir die beiden Char-Arrays beim Auslesevorgang nicht. Wegbekommen kann ich sie allerdings auch nicht. Vielleicht hab' ich was übersehen?
Hab's übrigens erstmal in ein Testprogramm geschrieben. Also nicht wundern...
.cfg schreiben:
void __fastcall TForm1::WriteBtnClick(TObject *Sender)
{
FILE *cfg;
AnsiString path;
path = PathEdt->Text;
cfg = fopen("emp.cfg", "w+");
fprintf(cfg, "path = %s\n", path);
fclose(cfg);
}
.cfg auslesen:
void __fastcall TForm1::ReadBtnClick(TObject *Sender)
{
FILE *cfg;
char varValue[255], varName[255];
AnsiString path;
cfg = fopen("emp.cfg", "r");
fscanf(cfg,"%s = %s\n", varName, varValue);
path = varValue;
PathLbl->Caption = path;
fclose(cfg);
}
'varName' und 'varValue' existieren eigentlich, damit ich später die einzelnen Variablen in der .cfg erkennen kann. Aber irgendwie klappte die Abfrage bist jetzt noch nicht (hatte es mit einem 'if' versucht...)
Hm, sieht ja echt borländisch aus, dein Code. Aber der Code geht eigentlich einigermaßen, wenn man mal davon absieht, dass du C und C++ wild mischst. Ist zwar nicht verboten, aber dann musst du wohl auch mit Char-Arrays arbeiten. Du könntest dich natürlich auch für pures C oder C++ entscheiden. Das heißt z.B. wenn du dich für C++ entscheidest, dass du für die Dateioperationen die fstream-Methoden nutzt. Also das Erstellen könnte z.B. so aussehen (vom Prinzip her):
#include <fstream>
using namespace std;
// ...
void __fastcall TForm1::WriteBtnClick(TObject *Sender)
{
ofstream outfile("emp.cfg");
outfile << "path " << PathEdt->Text << endl;
}
Und das einlesen etwa so:
void __fastcall TForm1::ReadBtnClick(TObject *Sender)
{
AnsiString varName,path;
ifstream infile("emp.cfg");
infile >> varName; // hier wird "path" gelesen (bis zum Leerzeichen)
infile >> path; // hier der tatsaechliche Pfad
PathLbl->Caption = path;
}
Allerdings kann's sein, dass Borlands C++ Builder da noch seine speziellen Eigenarten hat.
freundliche Grüße, Rolus
Mal sehen, ob ich das so umgeschrieben bekomme (sollte das kleinere Übel sein).
Nun ist mir leider was Anderes aufgefallen. Bekommt eine Variable einen Pfad per Öffnen-Dialog (ich weiß nicht, ob Borland da über die WinAPI geht) kann ich die zumindest mit
fprintf(cfg, "path = %s\n", varValue)
nicht schreiben. Trag' ich den Pfad von Hand ein geht's. Jedoch nach dem Versuch den per Öffnen-Dialog übergebenen Pfad zu speichern, schlägt auch die Handeingabe fehl (sprich er erstellt keine Datei bzw. überschreibt die Alte nicht). Irgendwas muss da ja (aufgrund eines unsichtbaren (halt ungültigen) Zeichens, was weiß ich) blockieren.
Hatte mich zunächst geärgert und gewundert, da es im Testprogramm 1A funktionierte. Da hatte ich den Pfad auch nur per Hand übergeben, was wohl mein Fehler war...
Irgendwelche Ideen?http://www.multimediaxis.de/images/smilies/old/1/gruebel.gif
(ich weiß nicht, ob Borland da über die WinAPI geht)
Letztendlich sicher, eine andere Möglichkeit hat Borland ja gar nicht.
Jedoch nach dem Versuch den per Öffnen-Dialog übergebenen Pfad zu speichern, schlägt auch die Handeingabe fehl (sprich er erstellt keine Datei bzw. überschreibt die Alte nicht). Irgendwas muss da ja (aufgrund eines unsichtbaren (halt ungültigen) Zeichens, was weiß ich) blockieren.
Hatte mich zunächst geärgert und gewundert, da es im Testprogramm 1A funktionierte. Da hatte ich den Pfad auch nur per Hand übergeben, was wohl mein Fehler war...
Irgendwelche Ideen?http://www.multimediaxis.de/images/smilies/old/1/gruebel.gif
Ja, sieht ganz so aus, als ob bei dem Dialog das Problem liegen würde. Also würde ich mir mal die Dokumentation zu der entsprechenden Funktion anschauen, damit du siehst, ob du den Dateinamen richtig abfragst. Ansonsten poste mal den entsprechenden Code.
freundliche Grüße, Rolus
Die WinAPI stellt zum oeffnen, lesen, schreiben und bearbeiten von Dateien saemtlich eigene Funktionen zur Verfuefung. Wenn du also Dateinamen jenseits von 8.3 Zeichen verwenden willst, solltest du nicht die standard C-Funktionen unter Windows nutzen, sondern die Dateifunktionen und -handler der WindowsAPI, vor allem, wenn du ohnehin schon sowas wie den Oeffnen-Dialog von Windows verwendest. Als alte Faustregel gilt, mische so wenig wie moeglich Code von verschiedenen Quellen, d.h. fprintf/<< fuer die Console und CreateFile/OpenFile/ReadFile/WriteFile fuer WindowsAPI GUIs.
Ich bin damit auch mal auf die Nase geflogen ...
Also, fang' ich mal von Vorne an.
Den Dialog hatte ich ja auch schon als "Fehlerquelle" ausgemacht. Die CBuilder Doku sagt dazu ja Folgendes:
Header
vcl/dialogs.hpp
TOpenDialog erzeugt ein Dialogfeld, in dem der Benutzer eine Datei auswählen kann.
Beschreibung
TOpenDialog erzeugt ein Windows-Dialogfeld, in dem der Benutzer eine Datei auswählen und öffnen kann. Das Dialogfeld wird zur Laufzeit erst angezeigt, wenn es mit der Methode Execute aktiviert wird. Wenn der Benutzer auf öffnen klickt, wird das Dialogfeld geschlossen, und die ausgewählten Dateien werden in der Eigenschaft File gespeichert.
Wobei die Eigenschaft 'File' nicht existiert sondern nur 'FileName'.
Geöffnet und abgefragt wird der Öffnen-Dialog bei mir folgendermaßen:
void __fastcall TMainForm::ChangePathBtnClick(TObject *Sender)
{
OpenDlg->Filter = "Ausführbare Dateien | *.exe";
if(OpenDlg->Execute());
{
PathEdt->Text = OpenDlg->FileName;
playerPath = PathEdt->Text;
}
}
Stand, glaube ich, sogar so in der beiliegenden Hilfe.
@ine
Eigentlich hatte ich vor, so weit weg von der WinAPI zu arbeiten wie möglich. Was mir schon mit der verwendung von 'ShellExecute()' leider nicht geglückt ist (gibts einen anderen Weg ausser über 'system()'?). Ich möchte das Programm später eventuell mal auf Linux testen(weiß nich nicht mal, wie ich mir da die Oberfläche zusammenschnibbeln muss).
Ich hatte ja ausserdem selbst nicht vor verschiedenen Code zu mischen und fragte daher auch schon dach einer vergleichbaren Funktion von 'fprintf()' und 'fscanf()' in C++.
Zudem wollte ich eigentlich nur zur Übung abseits der Ausbildung ein Programm schreiben, da ich mich mit Programmieren ansonsten wohl nie beschäftigen würde (leider bin ich irgendwie noch nicht so weit, dass ich mich einfach vor ein gutes, das Thema betreffende, Buch setze anstatt drauf los zu Programmieren).
Wenn du portabel arbeiten willst, dann ist der Borland CBuilder eine gaaaaanz schlechte Wahl. Borland CBuilder ist zu C(++) das selbe, was Delphi zu ObjectPascal ist.
Fuer Portabilitaet empfehle ich einzig und allein die GCC und ein unabhaengiges GUI Toolkit. Borland CBuilder und Windows ist praktisch untrennbar.
Ich weiß, das habe ich schon zu Ausbildungsbeginn von meinem Lehrer erfahren. Deswegen schrieb ich ja auch, dass ich noch nicht weiß, wie ich mir da die Oberfläche zusammenbauen soll. Auf'm Amiga haben die das mit einem extra Editor gelöst. Die damit erstellte Datei ließ sich einfach in's Projekt einbinden.
(Memo an mich: am Programm weiterarbeiten.)
Das problem mit dem Öffnen-Dialog besteht übrigens auch bei Verwendung von 'ofstream'. Oder ich mach' einfach irgendwas falsch.
Schau dir doch einfach einmal GTK an. Das ist eine wunderschoene objektorientierte API in C geschrieben, die ziemlich plattformunabhaengig ist. Die Lizens ist auch ziemlich entwicklerfreundlich.
btw ist der ifstream und der ofstream in fstream zusammengefasst.
Lysandros
17.08.2006, 16:56
Wenn du lieber auf C++ stehst, kannst du dir auch Qt anschauen, was ich übrigens gerade mache.^^ Neben Tutorials auf der Homepage von Trolltech, habe ich auch noch ein eBook (http://cartan.cas.suffolk.edu/moin/OopDocbook) dazu gefunden und es gibt auch ein deutsches Forum (http://www.qtforum.de/forum/).
Hmmm... ich häng' immernoch bei dem Problem mit dem Öffnen-Dialog... keiner mehr ne Idee? Um die Portierung (oder eher um das Umschreiben um das zu ermöglichen) wollte ich mich eigentlich erst kümmern, wenn die WinVersion läuft... möglich muss es ja sein, da genügend Leute ihre Pfade in irgendwelche Configs schreiben lassen.
Hmmm... ich häng' immernoch bei dem Problem mit dem Öffnen-Dialog... keiner mehr ne Idee? Um die Portierung (oder eher um das Umschreiben um das zu ermöglichen) wollte ich mich eigentlich erst kümmern, wenn die WinVersion läuft... möglich muss es ja sein, da genügend Leute ihre Pfade in irgendwelche Configs schreiben lassen.
Pruef einmal den Typ; vll ist das irgend ein dynamischer String.
Ne, ich bin so dumm... ich bin sowas von dumm. Der Öffnen-Dialog ändert leider auch den aktuell benutzten Pfad. Sprich, er schreibt schon in die Konfigurationsdatei. Er legt sie nur im Pfad der zuletzt ausgewählten Datei an... hmmm es müsste doch ne Möglichkeit geben (wird es wahrscheinlich auch) den aktuellen Anwendungspfad beim Starten des Programms abzufragen, oder?
Irgendwann hatte ich das mit dem Öffnen-Dialog schon gelesen... allein, dass ich das total verpennt hab ist schon schlimm *ärger*...
GetModuleFileName() sollte es tun. Das ist aber Windows-only. Das ganze gibt den Pfad+Programmname zurueck. Mit etwas RegExp sollte das aber np sein.
Könnt ich ja für die Win Version so übernehmen... müsste dann immer nur den Programmnamen "abschneiden". getcwd() ist ja wieder eine C-Funktion, soweit ich weiß...
Ich brauch' echt mal'n Buch^^
Könnt ich ja für die Win Version so übernehmen... müsste dann immer nur den Programmnamen "abschneiden". getcwd() ist ja wieder eine C-Funktion, soweit ich weiß...
Ich brauch' echt mal'n Buch^^
schau dir lieber msdn an. Das was du brauchst passt inhaltlich unmoeglich in ein Buch. Du brauchst blos eine Funktionsreferenz, und musst lernen damit umzugehen. ^^
Msdn?
Das ist das einzig gute das ich MS ehrlich eingestehe. ^^
http://msdn2.microsoft.com/en-us/default.aspx
Eine huebsche Funktionsliste die ziemlich alles beinhaltet, das in der WinWorld wichtig ist.
Eu, reichhaltiges Nachschlagewerk. Und was mach ich, wenn ich mich von Win lösen will? Hab' ja auch schon selbst nach Referenzen generell zu C++ gesucht. Aber an sich nur irgendwelche E-Books, die einem die Konzepte der Sprache und generell das OO-Programmieren beibringen sollen, Referenzen zu den standart C-Libs oder einzelne Code Schnipsel gefunden durch die ich irgendwie noch weniger blicke. Gibts nicht sowas wie:
Diese funktion [...] dient hier und dazu, befindet sich in Bibliothek [...], wird so und so aufgerufen und hat diesen oder jenen Rückgabewert.
Beispiel
Wären Funktionen in der CBuilder hilfe drin wär's ja kein Problem... vielleicht suche ich auch nur falsch... oder bin anderweitig zu blöd...kA...
Eu, reichhaltiges Nachschlagewerk. Und was mach ich, wenn ich mich von Win lösen will? Hab' ja auch schon selbst nach Referenzen generell zu C++ gesucht. Aber an sich nur irgendwelche E-Books, die einem die Konzepte der Sprache und generell das OO-Programmieren beibringen sollen, Referenzen zu den standart C-Libs oder einzelne Code Schnipsel gefunden durch die ich irgendwie noch weniger blicke. Gibts nicht sowas wie:
Diese funktion [...] dient hier und dazu, befindet sich in Bibliothek [...], wird so und so aufgerufen und hat diesen oder jenen Rückgabewert.
Beispiel
Wären Funktionen in der CBuilder hilfe drin wär's ja kein Problem... vielleicht suche ich auch nur falsch... oder bin anderweitig zu blöd...kA...
ALso, wer Funktionen auf die Art erklaert hat schon ziemlich in Punkto Uebersicht verlohren. ^^
Funktionsreferenzen gibt es viele; wenn du dir eine Lib hinunterladest hast du meistens einen doc-folder, oder etwas dergleichen. Einen Blick darein zu werfen kann schonmal nicht schaden.
Sonst braucht man eh nur die Standartlibs; da ist halt die Frage zu welchem Standart.
boost.org hat ja mit der boost-lib schon mal einen Fuss in die Tuer der Standartisierung gemacht; da findest du eine wunderschoene Dokumentation auf der Seite.
Willst du ne GTK-Doc, geh einfach auf die GTK-Seite und schau dort under Documentation.
Google hat auch noch niemanden weh getan. ^^
Google hat auch noch niemanden weh getan. ^^
Was meinst' wo ich gesucht hab (neben metacrawler...)^^...
Was meinst' wo ich gesucht hab (neben metacrawler...)^^...
Dann suchst du wohl falsch.
Suchstring:
+"ANSI C" +Reference
erster Treffer:
http://www.acm.uiuc.edu/webmonkeys/book/c_guide/
Das funktioniert doch wunderbar. ^^
Schau dir einmal die Google Schluesselwoerter und Operatoren an. Genauere Suchbegriffe lernt man dann mit der Zeit kennen.
*hust* C++... fstream.h, iostream.h und Konsorten... zu C hab ich ja genug gefunden...
*hust* C++... fstream.h, iostream.h und Konsorten... zu C hab ich ja genug gefunden...
Ich werde dir jetzt etwas sagen, dass dich ziemlich anpissen wird:
Ich habe den selben Suchstring genommen, C durch C++ ersetzt und etwas passendes auf der ersten Seite gefunden. ^^
Das Problem ist, C bzw C++ kommt nur mit einer minimalistischen Grundlagenbibliothek an. Selbst solche sachen, wie printf oder cout sind nur mehr oder weniger ein innerer Pseudostandard. Original C hatte nicht mal Ein- und Ausgabefunktionen, das waren alles mal urspruenglich Fremdbibliotheken. Daher ist es heute nicht ganz einfach einzugrenzen, was zum Standard C/C++ dazugehoehrt, und es gibt darueber sicherlich genau so viele Meinungen, wie es C-Compiler gibt. Eine gute Richtlinie ist die gcc mit dem g++ und die ANSI-C Norm. Ansonsten wird mit C++ ueberall auch die STL, die Standard Template Library, zum Standard berechnet.
Alles andere, ob es nun Bibliotheken wie connio.h (enthaellt einen Befehl zum Bildschirmloeschen) unter Borland C-Compilern, (n/PD)curses zum Arbeiten auf der Console, GUI Toolkits wie GTK oder 3D Engines wie Irrlicht sind, sind nicht Teil des C/C++ Standards, und damit ist deren Dokumentation nirgendwo zentral zusammengefasst. Wie sollte das auch gehen, da es mehere hunderttausend verschiedener Bibliotheken gibt, wovon die meisten sich sogar in ihren Aufgaben ueberschneiden nur dabei ganz verschiedene Konzepte verfolgen.
Selbst solche auf den meisten Systemen vorhandenen Bibliotheken wie time.h, unistd.h, math.h sind eigentlich kein wirklicher allgemeiner C/C++ Standard, sondern ein Standard fuer GNU C/C++, der auf allen POSIX kompatiblen Betriebssystemen eingehalten wird. Hier fangen auch schon die Probleme an, da Windows, egal in welcher Version, nicht wirklich POSIX konform ist, und versucht wird, dieses Manko durch die mingw (minimalistic GNU for Windows) Emulation zu beseitigen, indem den C/C++ Programmen vorgegaukelt wird, es wuerde sich um ein POSIX System handeln. Aber selbst damit kann man schnell auf die Nase fallen, da nicht alle Implementationen der "Standardbibliotheken" (und davon gibt es auch einige, fuer jeden Compiler mindestens eine) den GNU-Standard vollstaendig erfuellen. Und da der Standard selber noch nicht fertig ist und weiter entwickelt wird, kann es dir passieren, dass du schon in grauenhafte Probleme kommst, wenn du nur von einer Version des gcc auf eine andere (aeltere) Version des gcc wechselst. Kurzum, es ist ein totales Chaos ...
Doch genug des Schwafelns ...
Alle Dinge, an die du dich beim CBuilder gewoehnt hast, wie GUI Elemente (Dialogfenster, Listboxen) oder auch nicht sichtbare Objekte, wie Stringlisten etc, sind idR NICHT STANDARDKONFORM. Der CBuilder hat fuer sowas in der Regel die selben Klassen und Hierarchien wie Delphi. Der CBuilder ist mehr oder weniger ein Delphi mit C/C++ Syntax. Das Wissen, was du mit dem CBuilder gesammelt hast, kannst du mehr oder weniger komplett mit ALLEN ANDEREN Compilern vergessen, da es ueberall sonst komplett anders gemacht wird. Daher sind die Programme des CBuilders auch untrennbar mit Windows verbunden. Der CBuilder forciert standardmaessig naemlich die Benutzung der borlandeigenen Bibliotheken, die du nirgendwo sonst finden wirst. Dadurch kann man es schon fast als einen eigenen C++ Dialekt bezeichnen.
In allen anderen Compilern wirst du dir das meiste erst selber zusammenzimmern muessen oder dich an die Verwendung von Fremdbibliotheken gewoehnen muessen, die dir diese Aufgabe bereits abgenommen haben. Ein guter Anfang stellt hier die STL dar, die quasi zum C++ Standard dazugehoehrt. Sie beinhaltet Strukturen zur Speicherung und Ein- und Ausgabe von Daten. Hierzu zaehlen solche elementaren Dinge, wie Strings, Streams, ein und mehrfach verkettete Listen, Hashtabellen, dynamische Arrays (Vektor genannt), Queues, Stacks und Bitmaps, sowie diese bearbeitende effiziente Algorithmen, wie z.B. fuer Sortieren, Suchen, usw. Das besondere an der STL ist, dass sie vollstaendig auf Templates aufbaut und streng zwischen Daten und Algorithmen trennt. Templates sind Datenstrukturen, die vom Compiler automatisch an den verwendeten Datentyp der zu speichernden Daten angepasst werden. Um z.B. ein dynamisches Array ueber int Werte zu machen wuerde man eine Variable vom Typ vector<int> erzeugen. Fuer ein dynamisches Array ueber TSomething Objecte waere es eine Variable vom Typ vector<TSomething>. In dem einen werden Ints gespeichert und in dem anderen TSomething Objekte. Die Algorithmen sind von den Datenstrukturen strickt getrennt. Um dies zu gewaehrleisten wurde mit der STL das sehr leistungsfaenige Konzept der Iteratoren eingefuehrt, die eine Art Zaehlindex innerhalb einer Datenstruktur darstellen und als eine Art Pointerersatz dienen koennen. Die Algorithmen bedienen sich ausschliesslich der Iteratoren innerhalb einer Datenstruktur, und das einzige, was sie fordern, ist die Definition einer kleiner-Vergleichs-Operation, dem < Operator. (ja, um sinnvoll mit der STL arbeiten zu koennen muss man sich mit Operatorenueberladung beschaeftigen). Sind diese zwei Komponenten erfuellt, kann man die Algorithmen auf die Datenstrukturen loslassen, und braucht sich nicht mehr um die eigentliche Struktur zu kuemmern. Das klingt jetzt alles sehr umstaendlich und abstrakt, aber das ist es auch. Das Problem ist, dass man um mit der STL zu arbeiten sehr viele neue und abstrakte Konzepte wirklich verstanden haben muss. Objektorientierte Programmierung (inklusive Vererbung, dem ueberladen von Methoden und objektbeschraenkter Typdeklarationen), Templates, Operatorenueberladung und Iteratoren sind dabei das mindeste, denn man braucht dies alles gleichzeitig und durcheinander, um wirklich zu verstehen, was man da schreibt. Andererseits tuts vielleicht ein wenig Copy'n'Paste fuer den Anfang auch, wenn man damit einfach nur arbeiten will ...
Mit Teilen der STL wirst du schon gearbeitet haben. Hierzu zaehlen naemlich auch die Ein- und Ausgabestreams cout, cin und die Dateistroeme ifstream und ofstream, welche die Operatoren << und >> ueberladen.
Eine gute kurze Referenz (!) fuer die STL ist unter http://www.cppreference.com/index.html zu finden. Eine umfassendere und wissenschaftlichere Referenz ist unter http://www.sgi.com/tech/stl/stl_index.html zu finden. Hierbei handelt es sich um (Nachschlage-) Referenzen, und es wird einem NICHTS erklaehrt, wie man mit dem Zeug arbeiten kann.
Fuer den allgemeinen Umgang mit der STL gibt es allerdings vielfaeltige Tutorials im Netz.
Zum einen waere da die wissenschaftliche und pseudooffizielle Referenz von SGI : http://www.sgi.com/tech/stl/
Eine andere brauchbare Einfuehrung (mit vielen Bildern und Beispielen) scheint http://www.cs.brown.edu/people/jak/proglang/cpp/stltut/tut.html zu sein.
Eine brauchbar aussehende Beschreibung von (einstmals ?) gebraeuchlichen zusaetzlichen Bibliotheken fuer C++ jenseits der STL findet man unter http://www.trumphurst.com/cpplibs1.html
Ein recht umfassend erscheinener Ueberblick ueber verschiedene GUI Toolkits inclusive Wertung findet man unter http://www.free-soft.org/guitool/
Und hier noch eine Seite, die ich schnell mit Google gefunden habe, die viele weitere nuetzliche Links zu interessanten Themen rund um C/C++ bietet: http://www.ba-stuttgart.de/~boehm/NoBugs/
So .. ich hoffe, diese Links helfen die ein klein wenig weiter, dich durch den undurchdringbaren Dschungel der C/C++ Programmierung zu kaempfen.
Alle Dinge, an die du dich beim CBuilder gewoehnt hast, wie GUI Elemente (Dialogfenster, Listboxen) oder auch nicht sichtbare Objekte, wie Stringlisten etc, sind idR NICHT STANDARDKONFORM. Der CBuilder hat fuer sowas in der Regel die selben Klassen und Hierarchien wie Delphi. Der CBuilder ist mehr oder weniger ein Delphi mit C/C++ Syntax. Das Wissen, was du mit dem CBuilder gesammelt hast, kannst du mehr oder weniger komplett mit ALLEN ANDEREN Compilern vergessen, da es ueberall sonst komplett anders gemacht wird. Daher sind die Programme des CBuilders auch untrennbar mit Windows verbunden. Der CBuilder forciert standardmaessig naemlich die Benutzung der borlandeigenen Bibliotheken, die du nirgendwo sonst finden wirst. Dadurch kann man es schon fast als einen eigenen C++ Dialekt bezeichnen.
Yo, wurde von meinem Lehrer in sehr abgespeckter Form so erwähnt^^
<fehlerdiagnosemodus>
In anbetracht dessen, was wir in diesem Jahr in der Ausbildung gemacht haben ist's kein Wunder, wie's bis jetzt abgelaufen ist. Was hab' ich denn schon großartig gemacht? Arbeiten auf der Konsole. Eingabe, Ausgabe, verschiedene kleine Rechenspielereien, Algorithmik und Klassen (denke das war alles). Eigentlich doch etwas, dass sich mit jedem Compiler nachbilden lässt (wobei mir schon leichte Unterschiede bei der Verwendung von Code:: Blocks auffielen..., aber an sich nur Formsachen...). Einer meiner Fehler war's wohl, mich ausserhalb der Ausbildung nicht weiter mit C++ zu beschäftigen und nur das in der Ausbildung gelernte zu werwenden. So, als ob man etwas Feststehendes und Eindeutiges (was generell C ja nun nicht zu sein scheint) lernen würde (nach dem Schema: So und so ist das, dies und das gibt es und das ist möglich).
Ich freue mich über den Post. Ich hoffe ich weiß jetzt, wie ich ab jetzt bei der Verwendung von C/C++ zu Arbeiten habe.
Insofern bedanke ich mich^^ http://www.multimediaxis.de/images/smilies/old/sm_12.gif
</fehlerdiagnosemodus>
Steht der Text eigentlich schon im "Wichtig: >>> "Programmieren - wie fange ich an?" aka "Lies' mich zuerst" <<< LESEN!"? Könnte für Anfänger (zu denen ich mich auch Zähle, und noch lange zählen werde) sehr nützlich sein...denke ich.
EDIT: Was GUI Toolkits anbelangt, hab ich mich vor einiger Zeit, als ich ein wenig mit Ruby rumgespielt hab', mit wxWidgets anfreunden können (obwohl's da noch so einige Sachen gibt, sie ich nicht ganz verstehe). Da wxWidgets auch für C++ verfügbar (sogar drin geschrieben, oder?) ist wär' das ja naheliegend...
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.