Char Array Zeiger Verwirrung



  • Hallo,

    ich sitze hier gerade an einer Sache, die ich gestern noch durch supides Rumprobieren gelöst habe. Aber ich verstehe es nicht so recht:

    Definition:

    char *array[10];
    

    Initialisierung:

    *array = "12345678";
    

    Aufruf:

    cout << *array << endl;
    

    So, wie gesagt habe ich das durch bloßes Rumprobieren erreicht. Mir unverständlicherweise funktioniert es anders nicht. Ich benutze die in einer Klasse, wobei das Array an eine völlig andere Funktion noch übergeben wird. Diese nimmt komischerweise nur diese Lösung an (stammt nicht von mir und 100%ig konnte ich die noch nicht nachvollziehen). Wenn ich es auf diverse andere Arten mache, steht zwar in der Konsole durchaus das korrekte Array, aber die Funktion funktioniert so nicht.

    Was ich eigentlich nicht verstehe ist, dass ich bei der Definition jegliche Größen (außer null) angeben kann, es wird nicht zu viel oder zu wenig reserviert. 😕

    Dazu sei gesagt, ich bin wahrlich kein C++-Profi, würde mich eher als fortgeschrittenen Anfänger bezeichnen. Vor allem mit Zeigern stehe ich ein wenig auf Kriegsfuß 🙄

    Vielleicht hat jemand dafür eine Erklärung 🙂

    Grüße



  • Du hast nichts gelöst, sondern Code erzeugt, von dem glaubst, er tut das was du möchtest, der aber etwas ganz anderes tut.
    Man kann einem char-Array nach der Definition nicht mit = einen String zuweisen. Benutze std::string und ein anständiges Lehrbuch.



  • Ich erkläre mal, was du gemacht hast:

    const char *array[10];   // Ein Array mit 10 char-Zeigern.
    	*array = "12345678";     // Literale sind konstant. Machen wir daraus mal const. Der erste Zeiger des Arrays zeigt nur auf das Literal "12345678". *array entspricht array[0].
    	cout << *array << endl;  // array[0] ausgeben.
    

    Hilft dir das weiter?



  • Hallo out,

    wenn ich *array[0] ausgebe, wird "1" angezeigt. *array gibt "12345678" aus. Also irgendwas kann da nicht stimmen?

    Mit std::string funktioniert es komischerweise nicht. Das ist es ja gerade, was ich nicht verstehe.

    Am liebsten hätte ich eigentlich ein Stringarray, von welchem ich das benötigte Element übergebe. Mit cout geht das auch, aber nicht bei der Übergabe an die Funktion.

    Also so:

    string cabinstring[2];
    cabinstring[0] = "123";
    cabinstring[1] = "456";
    cout << cabinstring[0] << endl;
    cout << cabinstring[1] << endl;
    font2->print(Font::ALIGN_CENTERED, "%s" , cabinstring[1]);
    

    cout, kein Problem.
    print, geht nicht. Dabei wird in ein OGL Fenster geschrieben. Die Funktion an sich sollte imo nicht das Problem sein. Das ist übrigens besagte Funktion (Methode wäre wohl richtiger), die nicht von mir ist. Bislang schon oft benutzt und ich hatte noch keinerlei (unüberwindbare) Probleme damit.

    Jedoch kommt bei der Methode folgendes an: "`þe456". Und das will sich mir nicht erschließen.

    print hat eine variable Anzahl von Argumenten, das habe ich mir noch nicht im Detail (da noch nicht notwendig) angeschaut, werde ich aber mal gerade nachholen. Kann es in irgeindeiner Weise daran liegen?

    Hier mal der, wie ich denke, relevante Ausschnitt:

    void Font::print(alignment align, const char *expression, ...) const
    {
    	char text[256];
    	va_list	ap;					// Pointer To List Of Arguments
    
    	if (expression && *expression)
    	{
    		va_start(ap, expression);	//Phrase Text
    	    vsprintf(text, expression, ap);
    		va_end(ap);
    

    Grüße



  • Das sollte gehen

    font2->print(Font::ALIGN_CENTERED, "%s" , cabinstring[1].c_str());
    

    Kennt die Font-Klasse keine Funktion, um std:string auszugeben?



  • Mr Joe schrieb:

    wenn ich *array[0] ausgebe, wird "1" angezeigt. *array gibt "12345678" aus. Also irgendwas kann da nicht stimmen?

    Natürlich stimmt das. mit *array greifst du auf das erste Element deines Arrays zu. Das erste Element ist "12345678". Und wenn du nun *array[0] machst, dann sprichst du das erste Element dieser Zeichenkette an, nämlich die 1. Eigentlich ganz logisch, oder nicht?

    Mr Joe schrieb:

    Mit std::string funktioniert es komischerweise nicht. Das ist es ja gerade, was ich nicht verstehe.

    Naja, du musst schon zwischen char*[] (Zeigerarray), char* (Zeiger), char[] (Chararray) und char[][] (Stringarray) unterscheiden, das ist alles nicht das Gleiche.

    Mr Joe schrieb:

    Am liebsten hätte ich eigentlich ein Stringarray, von welchem ich das benötigte Element übergebe. Mit cout geht das auch, aber nicht bei der Übergabe an die Funktion.

    Nimm doch einfach std::vector<std::string> .



  • Hey, danke manni, das funktioniert.

    Wenn Du mir das jetzt noch kurz erklären kannst, bin ich hochglücklich 😃

    Soweit ich weiß, gibt das doch lediglich einen pointer zurück, oder? Warum funktioniert das damit und vorher nicht?

    Grüße



  • Mr Joe schrieb:

    Hey, danke manni, das funktioniert.

    Wenn Du mir das jetzt noch kurz erklären kannst, bin ich hochglücklich 😃

    Soweit ich weiß, gibt das doch lediglich einen pointer zurück, oder? Warum funktioniert das damit und vorher nicht?

    Grüße

    Nun, eine variable Anzahl an Argumenten via ... als Argument, ist aus C und (wie so vieles anderes aus C auch) nicht typsicher.
    Das heißt, wenn im Formatstring als n-tes Formatzeichen ein %s steht, versucht die Funktion aus dem n-ten Argument der variablen Argumentliste einen C-String zu erzeugen. Dabei wird der Speicherbereich des n-ten Arguments als C-String interpretiert. Da std::string u.U. (das heißt eigentlich immer), nicht den C-String selber als Member hat, sondern einen Pointer darauf und ggf. noch ein Größenangabe o.ä., kommt als Ergebnis auch nciht das Ergebnis des strings raus.
    Mit c_str() holt man sich die Implementierung als char-Array, da kommt dann auch das char-Array selber heraus.



  • Hallo Nathan,

    alles klar, verstanden.

    Danke für eure Hilfe 🙂

    Grüße


Log in to reply