Daten suche wie
-
Juhu
es hat funktioniert danke das du mich auf die unterschiedlichen Schreibweisend aufmerksam gemacht hast. Leider hat es nicht lange Funktioniert.
Nachdem das Programm endlich mal wieder gestartet ist und ich einen Namen eingegeben habe und diesen nun suchen wollte hängte sich das Programm mit folgender Fehlermeldung auf.http://img191.imageshack.us/img191/6348/fehler6ph.th.jpg
Was jetzt woran könnte das liegen.
-
Bartonno schrieb:
Was jetzt woran könnte das liegen.
aufruf der funktion über einen 0-pointer?
-
Und das heißt in Anfängersprache jetzt was.

-
Also allgemein gesagt tritt so eine Speicherzugriffsverletzung auf, wenn das Programm versucht auf einen Speicher zuzugreifen, der ihm nicht gehört, meistens passiert sowas wenn ein Zeiger durch Zeigerarithmetik auf einen Speicherbereich ausserhalb eines Feldes zeigt.
MfG
-
Du könntest z.Bsp. mal in deinen Code schauen wo dein i belegt wird. Gibt es den Index auf den du zugreifen willst überhaupt?
Du würdest dir das Leben leichter machen, indem du auf deine Arrays verzichtest und statt dessen vector oder list nimmst.
-
Also ich glaube, der Fehler liegt in dieser for-Schleife:
for(n=1;n<i+1;n++); { if(name==Pers[Liste[n]]->ZeigName()) {wenn i dabei die Größe des Feldes ist (wie ich vermute) greifst du im letzten Schleifendurchlauf auf Liste[i] zu, die Indizes von arrays gehen aber grundsätzlich von 0 (!!!) - (arraygroesse -1) (!!!) das heißt du schießt über deine Arraygrenzen hinaus.
versuchs mal so
for(n=0;n<i;n++); { if(name==Pers[Liste[n]]->ZeigName()) { anzeige(n);MfG jasch
-
Okay
das verändernder for schleife hat soviel gebracht das die Fehlermeldung jetzt nicht mehr Auftaucht. Den wenn ich jetzt meine suche bestätigen will verschwindet das Fenster sofort bzw. es stürtzt ab.
Wie ist das möglich.
-
Schau nochmal hin. i wird nirgendwo belegt. Deswegen steht darin auch nicht die Größe deines Feldes.
-
Was meinst du mit belegt, i wird doch in jeder void verwendet.
-
Das der das Programm beendet liegt wohl daran, das du in der Funktion void anzeige(int i) am Ende nicht (wie bei void anzeige()) menu() aufrufst, somit springt das Programm raus und beendet sich und Braunstein hat recht, beim Drüberschauen ist mir auch keine Stelle aufgefallen wo i einen Startwert bekommt, ich glaube du solltest das mal nachholen, oder hab ich da was übersehen?
MfG jasch
-
Irgendwo muss mal sowas o.Ä. stehen.
i = 0;du deklarierst i bloß als int, aber du musst der Variable auch was zuweisen, bevor du lustig mit ihr rumrechnen kannst.
MfG jasch
-
jasch schrieb:
Irgendwo muss mal sowas o.Ä. stehen.
i = 0;du deklarierst i bloß als int, aber du musst der Variable auch was zuweisen, bevor du lustig mit ihr rumrechnen kannst.
MfG jasch
i ist eine statische nicht-lokale variable - und wird folglich beim programmstart zero-initialisiert (dass es nicht unbedingt guter stil ist - ist eine andere frage). das ganze programm ist schließlich in grässlicher verfassung :p
-
Habe menu() eingetragen und i eine Wert zugewiesen. Das Fenster schließt sich jetzt zwar nicht mehr aber anstatt endlich mal Suchergebnisse auszuspucken kehrt es bloß ins Menü zurück.
Und was heißt hier in grässlicher Verfassung
-
Das heißt das der Quellcode einfach nur ekelhaft aussieht. Kannst du den Code so wie er jetzt ist nochmal posten, dann kann ich mir das doch deutlich besser vorstellen, und wenns geht rück es ein wenig ein. Nicht vergessen keine code-Tags, sondern C++-Tags zu verwenden.
MfG
-
Null Problemo
Hier haste den Quellcode//Adressprogramm unter Verwendung objektorientierter Programme------- //Version 1.2 //---------------------------------------------------------------------------- #include <condefs.h> #include <fstream.h> #include <iomanip.h> #include <conio.h> #include "person.h" #include <string.h> #pragma hdrstop //--------------------------------------------------------------------------- USEUNIT("person.cpp"); //--------------------------------------------------------------------------- int i=0,n=0,a,k,Liste[500],x,y,name,hV,suchen; //Satzzähler int const m=500; Person *Pers[m]; ; struct Person PersDaten[100]; //---------------------------------------------------------------------------- void menu(); void eingabe(); void anzeige(); void sortieren(); void dataload(); void datasearch(); void anzeige(int n); void datasave(); void bearbeiten(int s); //--------------------------------------------------------------------------- void eingabe() { char a; string text; do { i++; clrscr(); Pers[i]= new Person; cout<<"Dateneingabe\n\n"; cout<<"Adresse von Person "<<i<<endl; cout<<"\nNachname : "; cin>>text; Pers[i]->SchreibName(text); cout<<"Vorname : "; cin>>text; Pers[i]->SchreibVorname(text); cout<<"Strasse : "; cin>>text; Pers[i]->SchreibStr(text); cout<<"Hausnummer : "; cin>>text; Pers[i]->SchreibNr(text); cout<<"Postleitzahl : "; cin>>text; Pers[i]->SchreibPlz(text); cout<<"Wohnort : "; cin>>text; Pers[i]->SchreibOrt(text); cout<<"Geburtstag : "; cin>>text; Pers[i]->SchreibGebDatum(text); cout<<"Telefonnummer : "; cin>>text; Pers[i]->SchreibTelNr(text); } while(a=='j'); menu(); } //--------------------------------------------------------------------------- void anzeige() { int m=1,n,j,s; char a; char text[20]; string Text; while(m<=i) { clrscr(); if(m+5>=i) j=i+1; else j=m+5; for(n=m;n<j;n++) { if(Pers[Liste[n]]->ZeigName()!="") { cout<<resetiosflags(ios::left)<<setw(3)<<Liste[n]<<" "; cout<<setiosflags(ios::left); cout<<setw(20)<<Pers[Liste[n]]->ZeigName()<<", "; cout<<setw(24)<<Pers[Liste[n]]->ZeigVorname()<<" Geb. am: "; cout<<Pers[Liste[n]]->ZeigGebDatum()<<endl; Text=Pers[Liste[n]]->ZeigStr()+" "+Pers[Liste[n]]->ZeigNr(); cout<<" "<<setw(20)<<Text; cout<<" "; cout<<Pers[n]->ZeigPlz()<<" "; cout<<setw(20)<<Pers[Liste[n]]->ZeigOrt()<<" Tel.Nr: "; cout<<Pers[Liste[n]]->ZeigTelNr()<<endl<<endl; } } cout<<" Weiter mit <+>, Zurück mit <->, Ende mit <x>, Bearbeiten mit <b> "; a=getche(); if(a=='+'&& m+5<=i) m=m+5; else if (a=='-'&& m-5>0) m=m-5; else if (a=='b') { cout<<"\nBitte Nummer des zu Bearbeitenden Datensatzes eingeben: "; cin>>s; bearbeiten(s); } else if(a=='x') m=i+1; } menu(); } //------------------------------------------------------------------------------------- void sortieren() { string name1,name2; for (x=1;x<i+1;x++) { for (y=1;y<i-x+1;y++) { name1=Pers[Liste[y]]->ZeigName(); name2=Pers[Liste[y+1]]->ZeigName(); if(name1>name2) { hV=Liste[y]; Liste[y]=Liste[y+1]; Liste[y+1]=hV; } } } cout<<"Liste sortiert"; getch(); for(y=1;y<i+1;y++) cout<<Liste[y]<<";"; getch(); menu(); } //---------------------------------------------------------------------------- void dataload() { int j; string text; char File[]="C:\\Daten\\Adressen"; cout<<"Lade Daten von "<<File<<endl; ifstream fin; fin.open(File,ios::in); if(!fin) { cout<<"Datei konnte nicht geoeffnet werden!"<<endl; getch(); menu(); } fin>>i; for(j=1;j<=i;j++) { Pers[j]=new Person; fin>>text; Pers[j]->SchreibName(text); fin>>text; Pers[j]->SchreibVorname(text); fin>>text; Pers[j]->SchreibStr(text); fin>>text; Pers[j]->SchreibNr(text); fin>>text; Pers[j]->SchreibPlz(text); fin>>text; Pers[j]->SchreibOrt(text); fin>>text; Pers[j]->SchreibTelNr(text); fin>>text; Pers[j]->SchreibGebDatum(text); } fin.close(); cout<<"Daten lesen ok "<<endl; getch(); menu(); } //--------------------------------------------------------------------------- void bearbeiten(int s) { char text[20]; cout<<"Unveraenderte Daten mit <Enter>bestaetigen\n"; cout<<"\nNachname : "<<Pers[s]->ZeigName()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibName(text); cout<<"\nVorname : "<<Pers[s]->ZeigVorname()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibVorname(text); cout<<"\nStrasse : "<<Pers[s]->ZeigStr()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibStr(text); cout<<"\nHausnummer : "<<Pers[s]->ZeigNr()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibNr(text); cout<<"\nPostleizahl : "<<Pers[s]->ZeigPlz()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibPlz(text); cout<<"\nOrt : "<<Pers[s]->ZeigOrt()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibOrt(text); cout<<"\nGeburtstag : "<<Pers[s]->ZeigGebDatum()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibGebDatum(text); cout<<"\nTelefonnummer : "<<Pers[s]->ZeigTelNr()<<" neu: "; cin.ignore(); cin.get(text,20); if (strlen(text)!=0) Pers[s]->SchreibTelNr(text); } //---------------------------------------------------------------------------- void datasearch() { string name; cin>>name; for(n=0;n<i;n++); { if(name==Pers[Liste[n]]->ZeigName()) { anzeige(n); // bearbeiten(), weitersuchen, beenden() } } menu(); } //---------------------------------------------------------------------------- void anzeige(int n) { cout<<resetiosflags(ios::left)<<setw(3)<<Liste[n]<<" "; cout<<setiosflags(ios::left); cout<<setw(20)<<Pers[Liste[n]]->ZeigName()<<", "; cout<<setw(24)<<Pers[Liste[n]]->ZeigVorname()<<" Geb. am: "; cout<<Pers[Liste[n]]->ZeigGebDatum()<<endl; cout<<" "<<setw(20)<<Pers[Liste[n]]->ZeigStr()+" "+Pers[Liste[n]]->ZeigNr(); cout<<" "; cout<<Pers[n]->ZeigPlz()<<" "; cout<<setw(20)<<Pers[Liste[n]]->ZeigOrt()<<" Tel.Nr: "; cout<<Pers[Liste[n]]->ZeigTelNr()<<endl<<endl; } //---------------------------------------------------------------------------- void datasave() { int j; string text; char File[]="C:\\Daten\\Adressen"; cout<<File; ofstream fout; fout.open(File,ios::out); if(!fout) { cout<<"Fehler:\n"; getch(); menu(); } fout<<i<<endl; for(j=1;j<=i;j++) { fout<<Pers[j]->ZeigName()<<endl; fout<<Pers[j]->ZeigVorname()<<endl; fout<<Pers[j]->ZeigGebDatum()<<endl; fout<<Pers[j]->ZeigStr()<<endl; fout<<Pers[j]->ZeigNr()<<endl; fout<<Pers[j]->ZeigPlz()<<endl; fout<<Pers[j]->ZeigOrt()<<endl; fout<<Pers[j]->ZeigTelNr()<<endl; } fout.close(); cout<<"Datensicherung OK:"; getch(); menu(); } //----------------------------------------------------------------------------- void menu() { char a; clrscr(); cout<<"\n\t Adressverwaltung fuer 500 Adressen DOS-basiert V 1.2\n"; cout<<"\n\n\t Copyright by ....\n\n"; cout<<"\n\n\t\t\t\t Hauptmenue"; cout<<"\n\t\t\t\t ==========\n\n"; cout<<"\t\t\t -1- Daten anzeigen und bearbeiten\n"; cout<<"\t\t\t -2- Neue Daten eingeben\n"; cout<<"\t\t\t -3- Daten abspeichern\n"; cout<<"\t\t\t -4- Daten einlesen\n"; cout<<"\t\t\t -5- Daten sortieren\n"; cout<<"\t\t\t -6- Daten Suchen\n"; cout<<"\t\t\t -0- Programm beenden\n"; cout<<"\n\t\t\t Bitte auswaehlen "; cin>>a; clrscr(); switch (a) { case '0':exit(0); break; case '1':anzeige(); break; case '2':eingabe(); break; case '3':datasave(); break; case '4':dataload(); break; case '5':sortieren(); break; case '6':datasearch(); break; default :menu(); break; } } //----------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[]) { for(x=1;x<501;x++) Liste[x]=x; menu(); return 0; } //---------------------------------------------------------------------------
-
das ist mehr als eine frage des aussehens.
- uralt header
- sinnlose pragmas
- fehlende strukturierung ('spaghetti')
der kommentar über objektorientierung ist völlig sinnlosabgesehen davon: eine menge code für so wenig (inhalt)
-
@camper: Du hast völlig recht. (wenigstens nicht auch noch void main() :D). Aber nach eigenen Angaben kann er ja zum Großteil nichts dafür.
@Bartonno:
Das ist Quatsch:if(name==Pers[Liste[n]]->ZeigName())Du vergleichst strings mit == dass ist Pfui. Da du bloß prüfst, ob die beiden Strings identisch sind, nicht gleich. das machst du mit compare, wenn du Stringklassen benutzt, was du ja tust. Müsste denk ich so aussehen können:
if(name.compare(Pers[Liste[n]]->ZeigName())==0)Siehe dazu hier
http://www.cppreference.com/cppstring/compare.htmlMfG jasch
-
Du vergleichst strings mit == dass ist Pfui.
Warum das? string hat einen operator== und kann somit auch so verglichen werden. Vorausgesetzt, dass ZeigName() einen string liefert.
-
OK, mein Fehler. Bei char * war das meines Wissens nach so, das man das mit strcmp vergleichen musste, weil man ja so die Pointer verglichen hätte. Hatte da jetzt ein wenig einen Blackout. Aber so wie ich seinen Lehrer einschätze hat ZeigName() als Rückgabewert kein string.
MfG jasch.
-
jasch schrieb:
Aber so wie ich seinen Lehrer einschätze hat ZeigName() als Rückgabewert kein string.
was aber keine rolle spielt. ein string kann nicht implizit in ein const char* konvertiert werden - umgekehrt geht das wohl. folglich wird op== auch dann funktionieren, wenn nur ein (const) char* zurückgeliefert wird. op == zu benutzen ist also genau richtig und allemal expressiver als irgendwelche funktionsaufrufe.