problem mit char-array pointer und funktionsparametern
-
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...
-
zeig mal bitte den Code wo sowas passiert dann kann ich dir auch sagen wie du das machen musst

-
im ersten post xD
-
chris' schrieb:
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..
Du musst dann halt den Inhalt des einen Array's in den anderen Array KOPIEREN...
Entweder mit strcpy() oder selber in einer schleife das array durchgehen und kopieren
-
also eine direkte übergabe wie bspw bei int is nich mögliche? also a = b?
dankö
-
Wie schon gesagt sind einzeln die Namen von Array die Adressen und bei zuweisen (ich wollt schon gleichsetzen schreiben :D) zeigt einfach das andere da genau auf das selbe Array und das hat den Nachteil wenn du eins änderst das automatisch das andere mit geändert wird, kommt eigentlich auch darauf an was du machen willst, aber sonst ist das kopieren sicher

Mir wäre immer noch lieb wenn du mal genau den Code zeigen würdest wo du was mit was machen willst

-
jo danke dann für die erklärung

also ist dann eine membervariable, die ich in einer memberfunktion benutze, nicht mehr als ein zeiger auf die richtige membervariable? oder gilt das nur in bezug auf arrays?
sorry für die blöden fragen^^ aber versuche halt den zusammenhang genau zu verstehen.steht übrigens immer noch im ersten post was ich damit machen wollte

-
chris' schrieb:
also ist dann eine membervariable, die ich in einer memberfunktion benutze, nicht mehr als ein zeiger auf die richtige membervariable?
äääh, ja ... Verstehe es jetzt irgendwie nicht. Der Zeiger ist doch deine Membervariable

Zu deinem Code, hier ein Bespiel.
Soweit ichs verstanden habe willst du ja mit zeigeAuto() einfach hersteller anzeigen!void zeigeAuto(const Auto& Auto1) { cout <<Auto1.getAuto(); }const char* getAuto() const { return m_chHersteller; }Wieso der Rückgabetyp von getAuto so aussieht ?
Würdest du einfach char* mach dann könntest du es ja woanders in dem du die Funktion aufrufst dein m_chHersteller über eine andere Varaible ändern, weil du ja dann deinem Programm zeigst wo sich deine Membervariable befindet, also gib niemals ein Handle auf interne Daten zurück... Um dann zu gewährleisten das niemand deine Daten dann ändern kann schreibst du einfach ein const char* hin
Und das const zum Schluss sagt nur das deine Elementfunktion nichts an deiner Klasse ändern darf und das tut sie ja auch nicht...
Aber näheres zu dem const Geschichte findest du hier http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=constcor#Answ
(Ich muss jetzt mal was essen gehen
)Und wenn du in zeigeAuto mit m_chHersteller rumspielen willst dann so:
void zeigeAuto(const Auto& Auto1) { char hersteller[21]; strcpy(hersteller,Auto1.getAuto()); //mach was mit hersteller }Aber denke daran das du da nicht die Variable im deinem Objekt änderst !!! Weil du ja die Werte in eine andere kopiert hast...