Problem mit 2dimensonalem Array in einer Klasse



  • Hi!

    Ich habe eine Klasse, in der ich ein 2dimensionales Array (char StrTokenType[40][15]) benötige. Die Werte im Array will ich im Konstruktor initialisieren. Ich will nur nicht jeden einzelnen Buchstaben setzen!

    Habe folgenden Code:

    *.h File:

    class CToken
    {
    private:
     	char StrTokenType[40][15];
    
    	.........
    
    public:
    
    	.........
    
    	CToken();
    };
    

    *.cpp File:

    CToken::CToken()
    {
    
    	.........
    
    	//folgendes funktioniert, nur ist das ein lokales array! *mpf*
    	char StrTokenType[40][15] = {		"Var",
    							"Integer",
    							"GreatEqual",
    							.
    							.
    							.
    							.
    							"LeftParent",
    							"RightParent"
    	};
    	//folgendes funktioniert nicht:
    	this->StrTokenType[40][15] = {	"Var",
    							"Integer",
    							"GreatEqual",
    							.
    							.
    							.
    							.
    							"LeftParent",
    							"RightParent"
    	};
    	//funktioniert (logischerweise) auch nicht:
    	this->StrTokenType[0][0] = "Var";
    }
    

    Also meine Frage, wie kann ich das mit einem char-array lösen?! Pointer wären schlecht aber möglich, eine Lösung mit der String-Klasse macht mir dann woanders erhebliche Probleme.

    Sebo



  • Hi,

    direkte Zuweisungen gehen nicht. Da wirst Du schon strcpy(char *ziel,char*quelle) aus der <cstring> dafür nehmen müssen.

    warum geht das nicht mit std::string?

    grüße Con@n



  • Hi!

    Danke für die Antwort! Ja, des ist mir auch schon eingefallen, nur hatte ich gedacht / gehofft, dass es noch eine einfachere Möglichkeit gibt. Werd's jetzt wohl so machen.
    Mit std::string geht's nicht weil ich den Spass in Dateien schreibe und das aber mit den C Funktionen über eigene Buffer. Wenn ich std::string verwenden würde müsste ich den ganzen krampf umschreiben.



  • #include <string>
    #include <fstream>
    
    int main()
    {
        std::string message("Hello world!");
        std::ofstream file("myMessage.text");
    
        file << message;
    }
    

    Wirkt das allzu kompliziert? Lies Dir mal die entsprechenden FAQ-Beiträge durch, das lohnt sich echt!



  • Ist ja ganz nett, nur brauche ich die Datei an einer anderen Stelle Byteweise! Und das ist mit char-arrays einfacher und was wichtiger ist auch schneller! Den Spass brauch' ich für 'ne Zeitkritische Anwendung! Trotzdem Danke!



  • [quote="SeboStone"]Ist ja ganz nett, nur brauche ich die Datei an einer anderen Stelle Byteweise!

    Und was hindert Dich daran die strings Byteweise durchzulaufen?

    [quote="SeboStone"]
    Und das ist mit char-arrays einfacher und was wichtiger ist auch schneller!

    Ich bezweifle, daß das einfacher ist.
    Und wo zur Hölle haben eigentlich immer alle dieses char-Arrays sind schneller her? Sie sind, wenn man damit umzugehen weiß wohl nicht langsamer, aber schneller ist wohl eher selten.

    MfG Jester



  • char-Arrays sind schneller! Zumindest wenn auf Pointer verzichtet wird. STD ist eine Klasse und jeder weiss (spätestens nach dem Artikel über Programiersprachen in einer ct' diesen Jahres) dass C++ erhebliche Probleme mit der Geschwindigkeit objektorientierter Programmierung hat! Soll mit irgendwelchen Altlasten zu tun haben! Sogar Delphi ist bei diesem Test 50% schneller gewesen!



  • STD(eigentlich std) ist keine Klasse sondern ein Namensraum, das kostet garnichts. Den Code aus dem c't Artikel konnte ich durch wenige Veränderungen auf etwa 1/5 der Zeit drücken. Die c't-Leute können schlicht kein C++. Schade nur, daß sie so tun und es ihnen einige Leute auch noch abkaufen.



  • *mpf* stimmt, ist keine Klasse, was soll's! *gg* Der größte Grund ist wohl, dass ich keinen Bock habe 1200 Zeilen Code dementsprechend anzupassen! 🙂

    Wenn wir schon dabei sind, wie kann ich mit STD auf die einzelnen Bytes Zugriff nehmen? Mit xx[index]?



  • Was meinst Du eigentlich mit STD? Reden wir von der Standardbibliothek?
    Wenn Du std::string verwendest kannst Du mit str[index] auf das Zeichen an Position Index zugreifen, ja.

    Schau Dir die Standardbibliothek mal in Ruhe an und schick sie nicht gleich zum Teufel, nur weil irgendeiner bei der c't gesagt hat das sei nix.
    Da sind viele nützliche Funktionen drin, die vor allem auch sehr flott sind. Da muß man von Hand erstmal gegenan kommen. Eine kleine Unaufmerksamkeit und schon hat man gnadenlos verloren was die Effizienz angeht.

    Gut, okay da wären 1200 Zeilen Code zu ändern. Die Frage ist die:

    Wie groß wird das Projekt? Fehlen nur noch ein paar Zeilen und es ist dann fertig? Dann lohnt sich umschreiben natürlich nicht.
    Wenn das Projekt aber doch noch größer wird, dann lohnt sich ein umschreiben schon, denn der Code wird dadurch viel leichter lesbar und wahrscheinlich auch um einiges kürzer, weil string so viele Hilfs-Funktionen bietet.

    MfG Jester



  • Ja, ich meine std::string.

    Ja, ich weiss von den vielen nützlichen Funktionen. Hab' Sie bisher entweder nicht gebraucht oder irgendwie anders hinbekommen. Lesbarkeit ist da weniger mein Problem.

    Ja, das Teil ist kurz vor der Vollendung, es fehlt nur noch eine Bereichsüberprüfung von Integer und float: http://www.c-plusplus.net/forum/viewtopic.php?t=57041

    Ich hab' bisher eher mit Delphi Windows-Programme geproggt. Ansonsten C für Microkontroller-Zeugs, daher auch mein Faible für char-Arrays!



  • @Sebo, Jester: Welche Ausgabe der c't ist das genau? Der Artikel würde mich mal interessieren.



  • Kann ich Dir grad nicht sagen, leider geht auch die Suchfunktion gerade nicht. Aber wenn die wieder fit ist, dann such einfach mal danach. Es gab hier vor ein paar Wochen (muß so Anfang Oktober gewesen sein) nen Thread der sich damit befaßt hat. Da war auch irgendwo ein Link zum Source-Download und eine Umbau-Anleitung von Hume für deutlichen Performance-Gewinn. Mit ein paar kleinen Tricks wurde es dann nochmal etwas flotter.

    Der runtergeladene Code war übrigens zunächst mal garnicht übersetzbar, weil fehlerhaft. Keine Ahnung wie die damit irgendwas gemessen haben.

    MfG Jester



  • Ok, vielen Dank. Ich schau morgen dann mal danach und such in der Firma die entsprechende Ausgabe. 😉


Anmelden zum Antworten