Problem bei der Ausgabe (Dynamische Speicherverwaltung)
-
der benutzer gibt das ja nicht vor, das mache ich im programm
-
was für ne variable soll ich in der funktion anlegen, ich brauch doch da garkeine mehr, wofür soll ich die nehmen?
-
sarah1986 schrieb:
der benutzer gibt das ja nicht vor, das mache ich im programm
In deiner Schleife wird der Nutzer gefragt, ob er weiter machen will oder nicht.
-
sarah1986 schrieb:
was für ne variable soll ich in der funktion anlegen, ich brauch doch da garkeine mehr, wofür soll ich die nehmen?
Der Parameter ist eine lokale Kopie des übergebenen Wertes - d.h. wenn du dort etwas mit new zuweist, ändert sich der Wert im Hauptprogramm überhaupt nicht. Deshalb solltest du aus der Anlegen-Funktion die mit new erhaltene Adresse nach außen zurückgeben (entweder mit return oder indem du den Parameter als "Verwaltung*& Pers" deklarierst).
Ein weiterer logischer Fehler ist, daß du bei jedem Aufruf von Arbeiterneu ein neues Array anlegst und das alte irgendwo im Speicher vergisst.
PS: Und ich bin immer noch der Meinung, daß du lieber einen STL-Container verwenden solltest statt "dynamisch" mit Arrays rumzuschießen.
-
das prob ist, dass wir das in der schule gemacht haben, und ich das irgendwie können muss.
-
Hm du solltest echt schauen, dass du jemanden in deiner Klasse findest, der dir das erklärt. Am besten mit Bildchen und aufmalen usw. Du hast da noch ein Verständnisproblem, und langsam gehen mir auch die Ideen aus, wie ich das noch anschaulich schreiben soll^^ Is nicht böse gemeint.
-
no prob. aber ich bin so schon sehr froh und sehr dankbar, dass ihr euch alle mühe gegeben habt, um mir zu helfen. ist wirklihc super lieb!!!
-
Heute hat ein Arbeitskollege mir gesagt, dass ich das Prog im Grunde total falsch programmiert habe, da ich zwar ein Pointer-Array angelegt habe, aber dies nicht wirklich integriert habe.
Ich habe es jetzt so verändert, dass es passen müsste:
#include <iostream> #include <conio.h> #include <stdlib.h> #include <string> using namespace std; struct Verwaltung { string Name; int Nummer; }; void Arbeiterauflisten(Verwaltung*,int); int Arbeiterneu(Verwaltung*,int); void Arbeiteraendern(); void Arbeiterloeschen(); int main() { int Anzahl=0; const int n=100; char Eingabe; Verwaltung *Personen[n]; do { system("cls"); cout << "\tPersonalverwaltung"; cout << "\n\t~~~~~~~~~~~~~~~~~~\n\n"; cout << "1 --> Vorhandene Arbeiter ansehen"; cout << "\n2 --> Arbeiter hinzufuegen"; cout << "\n3 --> Arbeiter aendern"; cout << "\n4 --> Arbeiter loeschen"; cout << "\n\n0 --> Programm beenden"; cout << "\n\nIhre Eingabe:\t"; cin >> Eingabe; switch (Eingabe) { case '1': Arbeiterauflisten(Personen,Anzahl); break; case '2': Anzahl=Arbeiterneu(Personen,n); break; case '3': Arbeiteraendern(); break; case '4': Arbeiterloeschen(); break; } } while (Eingabe != '0'); return 0; } void Arbeiterauflisten(Verwaltung *Pers[],int v) { system("cls"); cout << "\tIhre Arbeiter:"; cout << "\n\t~~~~~~~~~~~~~"; cout << "\n\nSie haben folgende Datensaetze eingegeben:\n"; for (int x=0; x<v; x++) { cout << "\n\nName, Person " << x << ":\t\t"; cout << Pers[x]->Name; cout << "\nNummer, Person " << x << ":\t"; cout << Pers[x]->Nummer; } } int Arbeiterneu(Verwaltung *Pers[],int v) { char Eing=' '; system("cls"); cout << "\tNeuer Arbeiter:"; cout << "\n\t~~~~~~~~~~~~~~"; int x=0; do { Pers[x]=new Verwaltung; cout << "\nName, Person " << x << ":\t\t"; cin >> Pers[x]->Name; //alternativ: (*Personen[x]).Name cout << "Nummer, Person " << x << ":\t"; cin >> Pers[x]->Nummer; v++; x++; cout << "Moechten Sie einen weiteren Datensatz einlesen?"; cin >> Eing; } while (x<v && Eing=='j'); getch(); return v; } void Arbeiteraendern() { system("cls"); cout << "\tIhre Arbeiter:"; cout << "\n\t~~~~~~~~~~~~~~"; /*for (int x=0; x<AnzSaetze; x++) { cout << "\n\nName, Person " << x << ":\t\t"; cout << Personen[x]->Name; cout << "\nNummer, Person " << x << ":\t"; cout << Personen[x]->Nummer; }*/ getch(); } void Arbeiterloeschen() { system("cls"); cout << "\tIhre Arbeiter:"; cout << "\n\t~~~~~~~~~~~~~~"; /*for (int x=0; x<AnzSaetze; x++) { cout << "\n\nName, Person " << x << ":\t\t"; cout << Personen[x]->Name; cout << "\nNummer, Person " << x << ":\t"; cout << Personen[x]->Nummer; }*/ //delete Personen[x]; //Personen[x]=NULL; getch(); /*Personen=new Verwaltung[n]; for (int x=0; x<n; x++) { cout << "\nName, Person " << x << ":\t\t"; cin >> Personen[x].Name; cout << "Nummer, Person " << x << ":\t"; cin >> Personen[x].Nummer ; } delete[] Personen;*/ }jetzt bekomme ich zwei Fehlermeldungen, mit denen ich nichts anfangen kann. Ich hoffe, ihr könnt mir helfen.
error C2664: 'Arbeiterauflisten': Konvertierung des Parameters 1 von 'Verwaltung *[100]' in 'Verwaltung *' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.error C2664: 'Arbeiterneu': Konvertierung des Parameters 1 von 'Verwaltung *[100]' in 'Verwaltung *' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Mit Typumwandlung habe ich noch nichts gemacht, und in einem Beispiel ist es so verwirklicht, wie ich es auch hab. (Beim Funktionsaufruf nur der Name des Pointer-Arrays übergeben, und in der Funktion einen Namen dafür vergeben mit [] aber ohne Inhalt, und mit Stern davor, eben wie bei mir)
-
Du hast deine Prototypen nicht richtig deklariert:
void Arbeiterauflisten(Verwaltung*,int); //... void Arbeiterauflisten(Verwaltung *Pers[],int v) { //... }Das heißt, in der main() erwartet der Complier, daß die Funktion einen Pointer auf ein einzelnes 'Verwaltung'-Objekt erhält, wärhend du ein Array von Pointern übergeben willst (die Definition kommt später und ist in dem Moment noch nicht bekannt.
Richt wären:
void Arbeiterauflisten(Verwaltung*[],int); int Arbeiterneu(Verwaltung*[],int);(und nebenbei sollten die übrigen beiden Funktionen auch schon die richtigen Parameter bekommen, auch wenn sie (noch) nichts machen.