Hallo ich hoffe die C-Speziallisten können mir bei folgendem Probleme helfen. Ich möchte double Zahlen aus der Textdatei m.txt auslesen. Die Datei möchte ich mit der Funktion MessdatenLesen(datei, messwA); öffnen. Wenn ich das versuche kommt diese Fehlermeldung: Unbehandelte Ausnahme bei 0x6ca060a6 in messdaten.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00000000. Ich vermute einen Zeigerfehler hab aber schon in einigen Büchern die Kapitel über Zeiger und Arrays gelesen und nichts gefunden was mir hilft. Dateien sind hochgeladen Vielen Dank Marcel
while(fscanf_s(mDatei,"%f",mW)!=EOF) mW muss als Adresse übergeben werden -> @mW
so weiter:
du speicherst deine Daten überhaupt nicht im Array.
> if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN))
ret ist hier die falsche variabel, müsste i sein.
1 | for(i=0; i<ret; ++i) |
2 | {
|
3 | if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN)) |
4 | {
|
5 | ++n; |
6 | }
|
7 | }
|
8 | retA=i/(ret/100); |
9 | return retA; |
wozu die schleife wenn du n überhaupt nicht verwendest?
So soll die Schleife aussehen.
1 | double Auswertung(double messwA[], int ret) |
2 | { |
3 | double retA; |
4 | |
5 | int i, n=0; |
6 | for(i=0; i<ret; ++i) |
7 | { |
8 | if((messwA[ret]<=OBEN) && (messwA[ret]>=UNTEN)) |
9 | { |
10 | ++n; |
11 | } |
12 | } |
13 | retA=(n/ret)*100; |
14 | return retA; |
15 | } |
danke für den Hinweis. Leider sind meine Programmierfähigkeiten noch sehr schlecht ich setze alles dran dazu zulernen.
Marcel S. schrieb: > So soll die Schleife aussehen. dann ist sie aber immer noch falsch, lies mir mein Hinweis noch mal durch.
Hallo Peter, vielen Dank für die hilfreichen Tipps. Das Programm funktioniert jetzt. Ich würde mich sehr freuen wenn ihr mir sagt was ich noch verbessern kann. Ich möchte durch eure Kritik dazulernen. Gruß Marcel
Ich würde eine Kommandozeilen-Applikation draus machen, die den Dateinamen über die Kommandozeile erhält. Wozu ist as system("PAUSE") am Ende gut?
Uhu Uhuhu schrieb: > Wozu ist as system("PAUSE") am Ende gut? Ohne wird das DOS Fenster in Windows immer geschlossen, bevor ich die Ausgabe erkennen kann. Gibt es da eine elegantere Lösung?
Marcel S. schrieb: > Gibt es da eine elegantere Lösung? Wenn du das Kommandozeilenfenster zuerst öffnest und dort den Aufruf reinschreibst, bleibt es offen. Dein Programm, so wie es jetzt ist, ist ein GUI-Programm ohne GUI.
Marcel S. schrieb: > Hallo Peter, > > vielen Dank für die hilfreichen Tipps. > > Das Programm funktioniert jetzt. Ich würde mich sehr freuen wenn ihr mir > sagt was ich noch verbessern kann. Ich möchte durch eure Kritik > dazulernen. ABgesehen von der GUI Diskussion: gets ist eine "Funktion non grata". Also eine Funktion die du NIEMALS benutzen solltest. Immer fgets benutzen! Du hast keine Kontrolle darüber, was dein Benutzer an der Tastatur alles aufführt. Der kann dir da eine Eingabe von
1 | kkkkkkkkkkkkkkkkkkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaallllllllllllllllllllllddddddddddddddddddddd |
reinpfriemeln, welche gets versucht in dein Array zu stopfen. Was natürlich schief geht, weil dein Array nur 31 Elemente groß ist. D.h. gets, bzw. dein Benutzer schaffen es mit links, dass sich dein Programm selber die Variablen zerschiesst. gets kann dich davor nicht schützen. fgets kann es. gets ist eine Funktion, die es so wie sie ist, nie in den C-Standard hätte schaffen sollen. Deine beste Option ist es, völlig zu vergessen bzw. zu verdrängen, dass diese Funktion überhaupt existiert. Streiche sie aus deinem 'Wortschatz'.
1 | fgets( datei, sizeof(datei), stdin ); |
Marcel S. schrieb: > Ich möchte durch eure Kritik > dazulernen. > return (n*100)/anzahl; ist noch fehlerhaft. Diese Rechnung wird mit int gemacht, damit werden hier niemals kommastellen rauskommen. Damit man der Return double keinen sinn.
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.