Daten suche wie



  • Und wie behebe ich das jetzt habe keine Ahnung bin so teilweise Anfänger.



  • du schreibst einfach eine zweite Funktion mit der Signatur

    void anzeige(int n);
    

    mit der du nur den einen Datensatz ausgibst, der gefunden wurde. Und für suchen schreibst du entweder eine neue Funktion oder du nimmst datasearch() anstatt von suchen().

    Die Suchfunktion sieht eigentlich schon so aus, dass sie funktionieren könnte, ist halt wahrscheinlich bei größeren Datensätzen nicht so performant, durch die sequenzielle Suche, ich glaube binäre Suche wäre etwas schneller, aber da du ja wahrscheinlich damit nicht Gigabytes an Datensätzen durchsuchen willst, wird es so auch nicht merklich langsamer sein. Ich persönlich würde nach allen Ergebnissen in der Liste suchen und die dann auf einen Stapel legen.

    Ach ja, es gibt in diesem Forum nicht nur die code-Tags, sondern auch die hübschen C/C++-Tags, die haben ein formschönes Syntaxhighlighting. Die Übersicht in deinem Code ist doch eher mau, auch durch die zu sparsam eingesetzten Einrückungen. Und die globalen Variablen am Anfang des Quellcodes sind auch nicht gerade günstig für jemanden, der sich in den Code einlesen will. teilweise definierst du Schleifenvariablen, die auch direkt in der for Schleife definiert werden könnten global und dann muss man eben jedesmal wieder nach oben scrollen, und sehen, was das eigentlich für eine Variable ist.

    MfG jasch



  • Könntest du das mit der zweiten Funktion Void anzeige genauer erläutern bzw. den quelltext schreiben zu der void weil im moment blick ich nicht durch da ja schon eine void anzeige existiert. Also wenn ihr denn Quelltext gleich hinschreiben könnten wäre das klasse. 🙄



  • Hab grad keine Entwicklungsumgebung zur Hand, deshalb entschuldige, wenn fehler auftreten, aber ich probiers einfach mal, ist größtenteils aus deiner Funktion rauskopiert.

    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; 
     }
    

    Hmm, könnte evtl. klappen. Wie gesagt ist völlig ungetestet, und bloß kurz aus deiner anderen Funktion zusammen gesetzt. Aber wenn deine anderen Funktionen, die hier aufgerufen werden funktionieren, ist es durchaus möglich, das das funktioniert, am besten nach den Präprozessoranweisungen ein

    void anzeige(int n);
    

    einfügen und dann die Funktion von oben irgendwo reinkopieren.

    Den Vorgang nennt man im Übrigen Überladen, der Compiler stört sich nicht an der selben Bezeichnung, solange Art und/oder Anzahl der Parameter der beiden Funktionen mit dem gleichen Namen verschieden sind. Zu einer näheren Erklärung siehe Wikipedia.

    MfG



  • Danke für die Antworten
    Werde sie morgen gleich ausprobieren und berichten ob es geklappt hat.



  • Bartonno schrieb:

    Und wie behebe ich das jetzt habe keine Ahnung bin so teilweise Anfänger.

    Ich würde eher sagen der Code ist nicht von dir 😉
    Sonst könntest du solche Fehler ohne Probleme beheben, wenn du das alles selbst geschrieben HÄTTEST....

    Nicht bööse gemeint 😃



  • Ja stimmt der Code ist größtenteils von meinem Lehrer nur kleinigkeiten wie die sortierfunktion sind von mir.



  • Habe das gemacht was oben mir mal erklärt wurde klappt bestimmt auch wenn nur diese Fehlermeldung nicht da wäre

    [Linker Fehler] Unresolved external 'bearbeiten(int)' referenced from C:\DOKUMENTE UND EINSTELLUNGEN\ADMIN\DESKTOP\ADRESSSTRUKTUR NEU\UNIT1.OBJ

    Hähhh was soll das den nun bitte bedeuten wie ich aus dem Text entnehmen kann
    stimmt irgend etwas mit bearbeiten(int) nicht nur was.
    Ich hoffe ihr kennt eine Antwort in der Zwischenzeit versuche ich selber mein Glück



  • Schau dir mal die Schreibweise von bearbeiten in Deklaration und Definition an. Die sind bei dir unterschiedlich.



  • Hallo,
    wenn der Code zum größten Teil von deinem Lehrer stammt kannst du ihm ja bei Gelegenheit mal verklickern das er einen der unübersichtlichsten Programmierstile hat, die ich seit langem gesehen hab, bevor man sowas verwenden kann muss man ja erstmal astyle drüberlaufenlassen, damit man wenigstens ein bisschen Struktur sieht und mal mehr als 2 Einrückungen hat. Ich hoffe auch, das diese ganzen globalen Zählvariablen nicht von dir stammen, sowas ist gelinde gesagt einfach unschön.

    MfG jasch



  • 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.


  • Mod

    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


Anmelden zum Antworten