Hey, beim folgenden Programm habe ich ein Problem. Die abfrage wie viele Studenten, wie der erste heißt und welche Nte der erste geschrieben hat, klappen, aber ab dort bricht das programm ab und es wird mir angezeigt: "Segmentation fault(Speicherabzug geschrieben." Da mir googeln auch nicht wirklich weitergeholfen hat, wollte ich hier mal nachfragen, ob mir jemand eine Lösung vorschlagen kann und am besten noch den Fehler erklären kann... Danke im Voraus. #include <stdio.h> #include <stdlib.h> struct Studenten { char Name[15]; float Note; }; int Anzahl, N; float bestenote = 6.0; struct Studenten *Student; struct bestenote *NOTE; void Einlesen() { Student = (struct Studenten *) malloc(sizeof(struct Studenten)); printf("Wieviele Studierende sind es?\n"); scanf("%d", &Anzahl); for(N=0; N<Anzahl; N++) { printf("\nWie lautet der Name des %d. Studierenden?\n", N+1); scanf("%s", Student->Name); printf("\nWelche Note hat er/sie geschrieben?\n"); scanf("%f", Student->Note); } } void Ausgabe() { struct Studenten *pointer; for(N=0; N<Anzahl; N++) { if(Student[N].Note < bestenote) { bestenote = Student->Note; } } for(N=0; N<Anzahl; N++) { if(Student[N].Note == bestenote) { printf("\n\n %s hat die beste Note %f geschrieben.\n", pointer->Name , pointer->Note); } } } int main() { Einlesen(); Ausgabe(); return 0; }
Geh den Code doch mal schrittweise durch und guck dir an, was die Schleife beim einlesen macht und was beim ausgeben. Nimm einfach ein Blatt Papier und N=2...
Beitrag #5945868 wurde von einem Moderator gelöscht.
Hallo, ein paar Hinweise: - Segmentation Fault deutet fast immer auf einen Buffer Overflow hin, sei from das du eine MMU hast - ist ein Array die geeignete Datenstruktur für eine variable Anzahl an Studenten? - wieviel Speicherplatz reserviert Dein malloc und für wieviele Einträge reicht der? - was passiert wenn Name länger als 14? - was passiert wenn N>0
Bero408 schrieb: > und am besten noch den Fehler > erklären kann... Du musst die Compileroption für Magic und Gedankenlesen aktivieren. Dann weiß der Computer was du möchtest. Sonst macht er nur, was du im sagst/schreibst.
Also, hab den Fehler jetzt korrigiert.. Jedoch funktioniert das Programm nun nur, wenn ich einen Studenten eingebe. Die Lösung wird sogar richtig ausgegeben. Wenn ich jedoch mehrere studenten eingebe, kommt als Antwortsatz kein Name und die bestnote 0.0..... Wieso funktioniert das mit einem Studenten aber nicht mit mehreren? Neuer Code: #include <stdio.h> #include <stdlib.h> struct Studenten { char Name[15]; float Note; }; int Anzahl, N; float bestenote = 6.0; struct Studenten *Student; struct bestenote *NOTE; void Einlesen() { Student = (struct Studenten *) malloc(sizeof(struct Studenten)); printf("Wieviele Studierende sind es?\n"); scanf("%d", &Anzahl); for(N=0; N<Anzahl; N++) { printf("\nWie lautet der Name des %d. Studierenden?\n", N+1); scanf("%s", Student->Name); printf("\nWelche Note hat er/sie geschrieben?\n"); scanf("%f", &Student->Note); } } void Ausgabe() { struct Studenten *pointer; for(N=0; N<Anzahl; N++) { if(Student[N].Note < bestenote) { bestenote = Student[N].Note; } } for(N=0; N<Anzahl; N++) { if(Student[N].Note == bestenote) { printf("\n\n %s hat die beste Note %f geschrieben.\n", Student[N].Name , Student[N].Note); } } } void loescheTastaturpuffer() { int c; while( ((c = getchar()) != EOF) && (c != '\n') ) ; } int main() { Einlesen(); Ausgabe(); return 0; }
Was an deinem Code lässt dich denn glauben, dass Du irgendwo Informationen über mehrere Studenten an einen unterschiedlichen Ort im Speicher legst? So dass Du diese Informationen später wieder abrufen kannst.
Sorry aber anstatt mich so provokant vorzuführen, könntest du dich nützlich machen und mir einfach einen Lösungsvorschlag machen, wenn du doch soo schlau bist.
Das ist ganz offensichtlich eine Hausaufgabe. Du solltest dich also ein klein wenig damit beschäftigen. Und wenn Du mal schrittweise deine Schleife bei der Eingabe durchgehst
1 | for(N=0; N<Anzahl; N++) |
2 | {
|
3 | printf("\nWie lautet der Name des %d. Studierenden?\n", N+1); |
4 | scanf("%s", Student->Name); |
5 | printf("\nWelche Note hat er/sie geschrieben?\n"); |
6 | scanf("%f", &Student->Note); |
7 | }
|
dann wirst Du sehen, dass Du in jedem Durchgang deinem einen Studenten einen Namen und eine Note zuweist. Jetzt darfst Du wieder selber denken.
Ich probier es mal: dein malloc ist falsch und dein Program hat undefiniertes Verhalten wenn du etwas machst was falsch ist - z.B. auf Speicher zugreifen den du gar nicht allokiert hast, und stürzt zu Glück schnell ab
Das war keine Hausaufgabe, sondern ist eine Klausurvorbereitung. :) Jedenfalls habe ich den Fehler nun gefunden, danke jedenfalls. Trotzdem kann man seine Hilfe netter formulieren und nicht so herablässig über Leute, die sich noch nicht so gut auskennen, lustig machen. Danke trotzdem und schönen Abend noch.
Bero408 schrieb: > if(Student[N].Note < bestenote) Du speicherst in der Eingabe alles unter der selben Adresse Student. In der Ausgabe verwendest du das als Array, welches nur an Index 0 existiert. leo
Das hat nichts mit herablassend zu tun, aber gerade bei Anfängern ist das "Rubber Ducking" die Debug-Methode Nummer 1. https://de.wikipedia.org/wiki/Quietscheentchen-Debugging Deswegen der Hinweis, deinen Code Zeile für Zeile mit Stift und Papier durchzugehen. Dann wäre dir dein Fehler sofort aufgefallen.
jo schrieb: > Das hat nichts mit herablassend zu tun, aber gerade bei Anfängern ist > das "Rubber Ducking" die Debug-Methode Nummer 1. Zitat:
1 | Beim Quietscheentchen-Debugging erklärt der Programmierer den Programmcode Zeile für Zeile ... zum Beispiel einer Person, die nichts vom Programmieren versteht |
Den allermeisten Anfängern fehlt dafür der Programmierer, der ihnen das Programm Zeile für Zeile erklärt. Deshalb kommen die ja hier her. Oliver
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.