Probleme mit Char-Arrays, Pointern und Objekten!?



  • Hallo zusammen...

    Ich hab zwar schon paar kleine Sachen mit C++ programmiert, allerdings habe ich häufig noch Probleme mit Pointern, Arrays usw ...

    Folgendes konkretes Problem, welches mich ein wenig um den Verstand bringt:
    Ich habe ein Objekt. In diesem existiert ein privates Char-Array. In einer Funktion dieses Objekts (Methode?) wird dieses Array gefüllt.

    Jetzt möchte ich den gesamten Inhalt dieses privaten Char-Arrays in ein weiteres Char-Array Programmteil bekommen (also "außerhalb" des Objekts. Das bekomme ich aber nicht hin.

    Ich hatte mir das so vorgestellt:

    char ZuFuellen[20];
    
    Objekt test;
    test.Funktion(ZuFuellen);
    

    In der Objektfunktion steht dann sowas:

    void Objekt::Funktion(char *Pointer)
    {
       // Bereich der das private Element char Buffer[20] füllt
    
       *Pointer=*Buffer;
    }
    

    Allerdings wird da nur das erste Feld im Array richtig geschrieben. Im Rest steht Müll..
    Wo liegt mein Denkfehler und wie bekomm ichs hin?

    Würde mich sehr über euere Hilfe freuen! 🙂



  • Mandel schrieb:

    Allerdings wird da nur das erste Feld im Array richtig geschrieben. Im Rest steht Müll..
    Wo liegt mein Denkfehler und wie bekomm ichs hin?

    Pointer und Buffer sind jeweils Zeiger auf das erste Element des jeweiligen Arrays, d.h. du kopierst auch tatsächlich nur das erste Element.

    Du musst alle Elemente kopieren (z.B. mit einer Schleife).



  • Ich dachte immer, dass bei Feldern die Adressen der Elemente 1,2,3,... die Folgeadressen des 0ten Elements sind. Wenn ich also nur die Adresse des nullten Felds kopiere sucht das Prog. automatisch die weiteren Felder in den Folgeadressen...
    Gibts keine elegantere Lösung als jede Adresse des Arrays zu kopieren?


  • Administrator

    Mandel schrieb:

    Gibts keine elegantere Lösung als jede Adresse des Arrays zu kopieren?

    Nein. Das einzige was du machen kannst, ist so eine Aufgabe an eine Funktion auslagern. Dafür gibt es in C memcpy und in C++ std::copy :
    http://www.cplusplus.com/reference/clibrary/cstring/memcpy/
    http://www.cplusplus.com/reference/algorithm/copy/

    Vielleicht noch zur Erklärung, warum es hier kein "Automatismus" gibt. Zum einen kann man Arrays an sich gar nicht kopieren, zudem sind sie sehr flüchtig. Das eigentlich Array Objekt ist also schnell mal verloren. Wenn du ein Array anlegst, dann wird nirgends die Länge gespeichert, zumindest nicht für dich ersichtlich. Du musst die Länge somit selber mitführen oder einen Standardbibliothek Container nehmen.
    Wenn du nun das Array an die Funktion übergibst, dann geschieht da tatsächlich eine implizite Konvertierung in einen Zeiger auf das erste Element. In der Funktion selber ist nichts mehr bekannt darüber, ausser dass hier ein Zeiger auf ein char Objekt vorliegt. Ob dahinter nun ein Array liegt oder nur ein einzelnes Objekt, diese Information ist nicht mehr vorhanden. Ein Zeiger ist halt nur ein Zeiger und mehr nicht.

    Grüssli



  • speziell für C-Strings (also char-Arrays) gibts auch noch strcpy() aus <cstring>

    Wenn du allerdings noch so ganz am Anfang bist wie es scheint, empfehle ich statt des char-Arrays einen std::string zu benutzen, den kannst du auch problemlos mit einer einfachen Zuweisung kopieren (intern macht er auch nichts anderes als die Zeichenweise Kopie eines char-arrays). Außerdem nimmt std::string dir die Sorge der Speicherverwaltung bei dynamischen char-Arrays bzw. der Längenbeschränkung bei char-arrays fester Länge.



  • Danke erstmal für euere Beiträge! 🙂
    Dann werd ich das Ganze wohl wirklich Elementweise machen müssen. Das kam mir nur sehr Umständlich vor.

    Und ich war auch irgendwie der Meinung, dass ich mal an einem Programm rum gespielt habe in dem folgendes realisiert war (oder zumindest etwas in der Richtung):
    Es gab eine Funktion, die hat Einträge in irgend ein Array gemacht un dann die Adresse des Arrays zurück gegeben. Die Adresse konnte man dann einem Pointer(oder auch Array?) zuweisen und dann damit arbeiten, als hätte man das Array aus der FUnktion vor sich liegen...



  • Im Grunde ist eine Arrayadresse nur ein Pointer auf das erste Element. Wenn du ein Array an eine Funktion übergibst macht der Compiler darasu die Adresse des ersten Elements. Allgemein heißt der Ausdruck a[i] nichts anderes als *(a + i), wobei a ein pointer ist, i eine Zahl - a+i ist also ein pointer der "ein paar Plätze weiter rechts zeigt".

    Lies mal im Buch/Tutorial deiner Wahl das komplette Kapitel über Arrays sowie über Pointerarithmetik.

    Mandel schrieb:

    Danke erstmal für euere Beiträge! 🙂
    Dann werd ich das Ganze wohl wirklich Elementweise machen müssen. Das kam mir nur sehr Umständlich vor.

    Wie schon gesagt, es gibt mehrere verschiedene Funktionen die das Elementweise Kopieren für dich übernehmen können.


  • Administrator

    Mandel schrieb:

    Es gab eine Funktion, die hat Einträge in irgend ein Array gemacht un dann die Adresse des Arrays zurück gegeben. Die Adresse konnte man dann einem Pointer(oder auch Array?) zuweisen und dann damit arbeiten, als hätte man das Array aus der FUnktion vor sich liegen...

    Du konntest es einem Zeiger zuweisen und dann mit der Zeigerarithmetik auf die einzelnen Element zugreifen. Bei einem C Array liegen die Werte schliesslich hintereinander im Speicher. Vielleicht solltest du dir mal dieses Tutorial durchlesen, vor allem der Bereich über "Pointers and arrays".
    http://www.cplusplus.com/doc/tutorial/pointers/

    Grüssli


Anmelden zum Antworten