problem mit char-array pointer und funktionsparametern
-
hio!
also folgendesautohaus.cpp:
void zeigeAuto (Auto Auto1) { char *p_chHersteller = new char[21]; Auto1.getAuto (p_chHersteller); cout << *p_chHersteller << endl; delete p_chHersteller; p_chHersteller = 0; }auto.hpp:
class Auto { private: // Membervariablen char m_chHersteller[21]; public: // Memberfunktionen (deklaration) void getAuto (char *Hersteller); };auto.cpp:
void Auto :: getAuto (char *Hersteller) { *Hersteller = m_chHersteller; }also was passieren soll ist halt, das die funktion zeigeAuto () aus der main heraus aufgerufen wird, sich dann den aktuellen wert von m_chHersteller per getAuto () der Auto-Class holt...
allerdings habe ich schon dauernd probleme mit pointern die auf char-arrays zeigen in funktionen zu übergeben..so komme ich dann auf diesen fehler:invalid conversion from `char*' to `char'
wie muss ich getAuto bzw zeigeAuto nun ändern das es passt? hab schon alles mögliche ausprobiert, aber wie gesagt, das sitzt noch nich 100prozentig mit pointern auf char-arrays.
danke
-
Plub... Am einfachsten wie immer std::string zu verwenden, trotzdem sollte jeder C++-Programmierer wissen was ein C-String ist und wie man mit ihm umgeht.
http://tutorial.schornboeck.net/c_string.htm
Gruß
-
Die Variable "Hersteller" ist ein Zeiger auf ein char. Dereferenzierst Du das Ding, bekommst Du ein char. m_Hersteller ist ein char-Array, welches sich in dem Fall wie ein Zeiger auf ein char verhält. Du versuchst also einem char einen Zeiger zuzuweisen, was nicht geht.
Verwende mal lieber std::string. Pointer sollten normalerweise nicht benutzt werden. Dann sieht das etwa so aus:
autohaus.cpp:
using namespace std; void zeigeAuto (Auto Auto1) { string p_chHersteller; p_chHersteller = Auto1.getAuto (); cout << p_chHersteller << endl; }auto.hpp:
class Auto { private: // Membervariablen std::string m_chHersteller; public: // Memberfunktionen (deklaration) std::string getAuto () const; };auto.cpp:
std::string Auto :: getAuto () const { return m_chHersteller; }Es gibt sicherlich noch ein paar Dinge, die man optimieren kann, aber Du siehst, daß das ganze mit std::string viel natürlicher aussieht. Der Profi würde die get-Methode inlinen und eine konstante Referenz liefern, aber bleiben wir mal bei der einfachen Übung.
Tommi
-
nuja, das problem is nun nur, das ich m_chHersteller in getAuto nich einfach returnen kann, da ich das ganze hier nur vereinfacht hingeschrieben habe (ok, konntet ihr natürlich nicht wissen).
im ganzen code gibts neben hersteller nämlich noch modell, farbe, hubraum und leistung.
also muss ich es entweder mit dem "return m_chHersteller" umgehen oder für jede variable eine get-funktion schreiben...
was meint ihr dazu, was die bessere lösung wäre?
-
Deklariere zeigeAuto am besten so:
void zeigeAuto(const Auto& Auto1);Also mit einer Referenz auf ein const-Objekt

-
chris' schrieb:
wie muss ich getAuto bzw zeigeAuto nun ändern das es passt? hab schon alles mögliche ausprobiert, aber wie gesagt, das sitzt noch nich 100prozentig mit pointern auf char-arrays.
geht doch enfacher:
class Auto { private: // Membervariablen char m_chHersteller[21]; public: // Memberfunktionen (deklaration) const char *getHersteller() const { return m_chHersteller; } }; void zeigeAuto (const Auto &Auto1) { cout << Auto1.getHersteller() << endl; }p.s. ich würde selber std::string nutzen
-
jo, das is mir schon klar wie das mit dem return bei ner get-funktion funktioniert..allerdings habe ich in meinem komplettem projekt mehr als nur m_chHersteller...
sonder auch noch:m_chHersteller[21] m_chModell[21] m_chFarbe[11] m_Hubraum m_Leistungund wenn ich den wert ja nun mit ner get-funktion nur returne, brauche ich pro variable ne get-funktion..also
const char *getModell() const { return m_chModell; }etc...stattdessen möchte ich eben alles in einer "get"-funktion haben..
und das geht doch nur mit pointern oder nicht?
-
wie stellst du dir das denn vor?
sollen dann in einem char* alle daten hintereinander stehen, also in etwa so:
BMW 5er 5000PS 8lHubraumoder wie willst du alle daten mit einem mal bekommen?
-
Du willst also ne get-Funktion die nen char* für jeden Bezeichner hat?
Dann mach es so:void getAll( const char* modell )
{
//Kopiert die Adresse von m_Modell nach modell
//Besser wäre eine Kopie, aber dann wärst du mit std::string besser bedient
modell = m_Modell;
}
-
Also so wie ich das sehe gibt es keine Möglichkeit mit einer get-Funktion alle Werte auf einmal zurückzugeben. Du brauchst also für jede Variable auch ne get-Funktion weil ja alle Funktionen nur jeweils einen Rückgabetyp haben. Aber das is ja denk ich auch Standard, das man für jede Variable ne eigene get-Funktion hat um mit der Variable nich irgenwelchen Mist machen zu können.
Mfg Jan
-
Bau doch in deine Klasse einfach eine funktion ein die dazu da ist alles aufeinmal auszugeben. So ne Art "mega"get

Du könnstest ja auch noch operator<< überladen

-
naja ok, schreib ich halt für jede variable ne get-funktion...
was ich aber dennoch wissen wollte ist:
wie übergebe ich denn nun ein char-array per pointer richtig an eine funktion, sodass ich das array dann in der funktion auch ändern/neu zuweisen kann etc?
jetzt mal unabhängig von meinem problem hier...danke für die hilfe

edit:
@freak_coder:so sah mein programm bisher ja aus:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-122349.html
ich wollte nun die ganze klasse halt so schreiben, das sie unabhängig von der console ist, wie mir in dem thread auch vorgeschlagen wurde...
-
Nun wenn du es ändern willst, dann musst du die Länge des Arrays mit übergeben, um in der Funktionn verhindern zu können, über das Array hinaus zu schreiben.
-
chris' schrieb:
wie übergebe ich denn nun ein char-array per pointer richtig an eine funktion, sodass ich das array dann in der funktion auch ändern/neu zuweisen kann etc?
jetzt mal unabhängig von meinem problem hier...Das was du am Anfang geschrieben hast, war ja schon eigentlich fast richtig:
void Auto :: getAuto (char *Hersteller) { *Hersteller = m_chHersteller; }Nur das du Hersteller nicht wiede derefenzieren darfst, d.h. nicht nochmal ein * davor.
In der Parameterliste hast du ja ein zeiger "char Hersteller".
Schreib dann das * am besten zu char also so "char Hersteller".Dann ist ja deine variable Hersteller ein Zeiger !
Und deine Membervariable m_chHersteller ja auch, also reicht ein einfaches:Hersteller = mchHersteller;Du hast ja ein * noch vor Hersteller geschrieben, also beziehst du dich nicht mehr auf die Speicheradresse des Zeigers sondern dahin wo der Zeiger hinzeigt !!!

Und der zeigt an eine Stelle wo du char, also einzelne Zeichen speichern kannst hin, deswegen funktioniert:*Hersteller = m_chHersteller;ja auch nicht, weil... DU KANNST JA NICHT EINE ADRESSE IN EINEN SPEICHERBEREICH SCHREIBEN WO ZEICHEN HINGEHÖREN

Ich hoffe mal das war verständlich

-
ya, fast^^
es geht mir aber um char-arrays..das mit einfachen chars is ja einfach.
was mir nur nich rein will is die übergabe von char-arrays sodass ich sie verändern nue zuweisen kann...das das mit strings und so einfacher geht is richtig, aber ich möchte den weg auch gern verstehen
-
also ich habs nun mit strings und einzelnen get&set funktionen umgesetzt...nun aber folgendes:
void erstelleAuto (Auto& Auto1) { // Variablen std::string sHersteller; std::string sModell; std::string sFarbe; int Hubraum; int Leistung; std::cout << "Hersteller : "; std::getline(std::cin, sHersteller); Auto1.setHersteller(sHersteller); std::cout << "Modell : "; std::getline(std::cin, sModell); Auto1.setModell(sModell); std::cout << "Farbe : "; std::getline(std::cin, sFarbe); Auto1.setFarbe(sFarbe); std::cout << "Hubraum in ccm: "; std::cin >> Hubraum; Auto1.setHubraum(Hubraum); std::cout << "Leistung in ps: "; std::cin >> Leistung; Auto1.setLeistung(Leistung); } // erstelleAutowenn diese funktion gerufen wird, sieht die ausgabe so aus:
Hersteller : Modell :
also ich komm gar nicht zu der möglichkeit hersteller einzugeben..stattdessen werd ich nur direkt nach dem modell gefragt..woran kann das liegen?
-
chris' schrieb:
die übergabe von char-arrays
Es gibt 3 Möglichkeiten ein Array an eine Funktion zu übergeben, wenn du das einmal geschafft hast kannst du sie ganz normal wie auch vorher in der Funktion benutzen...
1.)
void getArray(char* myarray); //Aufruf wie folgt ... char *lali = "hahahah"; char dudi[8] = "ztztztt"; /* Das soll jetzt nur zeigen das es egal ist wie du dein Array deklarierst ;) Wie du wahrscheinlich schon weißt oder wissen solltest ist allein der Name des Arrays auch gleichzeitig die Adresse des ersten Elements */ /* Und deine Funktion erwartet ja ein Adresse also: */ getArray(lali); getArray(dudi);2.)
/* Die Übergabe ist wieder gleich nur die Parameter der Funktion können anders aussehen: */ void getArray(char myarray[]); /* Also dem Compiler nur zeigen das da ein Array erwartet wird */3.)
/* Eigentlich fast die Selbe wie 2. nur das du auch noch die Größe angeben kannst... */ void getArray(char myarray[10]);Und am meisten wird Form 1. verwendet

Zu deinem Posting danach:
Wieso ist erstelleAuto() nicht der Konstruktor bzw eine Elementfunktion der Klasse
-
chris' schrieb:
also ich komm gar nicht zu der möglichkeit hersteller einzugeben..stattdessen werd ich nur direkt nach dem modell gefragt..woran kann das liegen?
Vielleicht steht ja noch im Puffer was drin ???

Einfach mal mit sync() leeren
Genaures weiß ich auch nicht

-
Freak_Coder schrieb:
chris' schrieb:
also ich komm gar nicht zu der möglichkeit hersteller einzugeben..stattdessen werd ich nur direkt nach dem modell gefragt..woran kann das liegen?
Vielleicht steht ja noch im Puffer was drin ???

Einfach mal mit flush() leeren
flush() existiert nur für ostreams.
Für istreams kannst du den Puffer z.B. über cin.sync() leeren. Eine andere Möglichkeit ist
void clear_istream_buf(istream& is) { is.clear(); // eventuelle Fehlerflags löschen is.ignore(is.rdbuf()->in_avail()); // Den gesammten aktuellen Buffer-Inhalt ignorieren. }Das steht aber auch alles in der Dos und Win32-Konsole FAQ.
Gruß Caipi
-
Heheh, upps sry habs schnell umgeändert aber danke für den Hinweis

-
Freak_Coder schrieb:
chris' schrieb:
die übergabe von char-arrays
Es gibt 3 Möglichkeiten ein Array an eine Funktion zu übergeben, wenn du das einmal geschafft hast kannst du sie ganz normal wie auch vorher in der Funktion benutzen...
danke dir

so, nun nur noch eines..sagen wir ich habe ein array[12] das in eine funktion übergeben werden soll, um in der dortigen funktion einem anderen array den inhalt zu übergeben..wie geht das nun? dabei stoße ich dauernd auf alle möglichichen compiler-warnings...und weshalb ich das nich als eine memberfunktion mache hat den grund, das die klasse unabhängig vond er konsole ist...
sonst müsste ich ja wieder das cout etc mit in die memberfunktion nehmen. oder eben wissen wie man arrays übergibt und dann andern arrays ihren inhalt zuweist...