Access Violation Error
-
Entweder
fwrite(kolonie, sizeof(struct stadt), 21, datei); // 21 mal struct stadt schreiben
oder
fwrite(kolonie, sizeof(kolonie), 1, datei); // 1 mal kolonie schreiben
-
#include <stdio.h> #include <string.h> struct stadt { char Name[30]; int Einwohner; char Region[30]; char Nation[30]; char Mutterstadt[30]; }; int main() { int lesen_schreiben_eingabe; int array_groesse = 21, index = 21; char stadt_eingabe[30]; printf("Wollen Sie Daten einlesen oder eintragen? (lesen = 1/schreiben = 2)\n\n\n"); scanf("%d", &lesen_schreiben_eingabe); printf("\n"); FILE * datei; datei = fopen("staedte.txt", "r"); stadt Regionen[array_groesse]; int i, stadt_zaehler; if (lesen_schreiben_eingabe == 1) { printf("Welche Stadt wollen sie ansehen?\n\n"); for (i = 0, stadt_zaehler = 1; i<array_groesse; i++, stadt_zaehler++) { fread(&Regionen, sizeof(stadt), array_groesse, datei); printf("Stadt : %s = %d\n", Regionen[i].Name, stadt_zaehler); } scanf("%s", &stadt_eingabe); }}
jop
und nun wollte ich diese Datei verwenden für ein anderes Programm wo leider wieder ein Fehler auftaucht, den ich nicht so ganz verstehe. der Compiler meldet keinen Fehler aller dings wird beiprintf("Stadt : %s = %d\n", Regionen[i].Name, stadt_zaehler);
nur der Name der ersten Stadt ausgegeben für die 2. und die 3. Stadt werden nur merkwürdige zeichen ausgegeben die restlichen Städte tragen dann wieder den richtigen Namen. Wenn ich den Namen der 2. oder 3. Stadt mit einer anderen normalen printf() funktion ausgebe steht allerdings der name so wie er in der Datei steht da, also liegts schonmal nicht an der datei sondern irgendwo in dem in der for Schleife.
danke schonmal!
-
Das fread gehört vor die Schleife.
Beachte, dass vor Regionen kein & gehört, da Regionen ein Array ist.
fread(Regionen, sizeof(stadt), array_groesse, datei); printf("Welche Stadt wollen sie ansehen?\n\n"); for (i = 0; i<array_groesse; i++) { printf("Stadt : %s = %d\n", Regionen[i].Name, i+1); } scanf("%s", &stadt_eingabe);
-
ah danke DirkB für die schnelle Hilfe
-
Moin mal wieder
also habe nun ein weiteres Programm das auf dem vorher geposteten aufbaut.
ich bekomme wieder diesen Error hier die Stelle an der das Problem auftaucht:for(;;) { datei_lesen = fopen("staedte.txt", "r"); Array_groesse = RaiseArrayGroesse(Array_groesse); Array_groesse = GetArrayGroesse(Array_groesse); stadt Regionen_neu[Array_groesse]; stadt Regionen_kopieren[1]; fread(Regionen_neu, sizeof(stadt), Array_groesse, datei_lesen); fclose(datei_lesen); FILE * datei_lesen; datei_lesen = fopen("staedte.txt", "w"); printf("Geben sie die Werte der Stadt ein, die sie einlesen möchten! Um das Programm zu beenden geben sie \"Exit\" ein!"); printf("Geben sie den Namen der Stadt ein :"); scanf("%s", Regionen_kopieren[0].Name); printf("Geben sie die Einwohnerzahl der Stadt ein :"); scanf("%d", Regionen_kopieren[0].Einwohner); printf("Geben sie die Region ein, in der die Stadt liegt :"); scanf("%s", Regionen_kopieren[0].Region); printf("Geben sie die Nation ein, der die Stadt angehört :"); scanf("%s", Regionen_kopieren[0].Nation); printf("Geben sie die Mutterstadt ein, die die Stadt gegründet hat :"); scanf("%s", Regionen_kopieren[0].Mutterstadt); strcpy(Regionen_neu[(Array_groesse-1)].Name, Regionen_kopieren[0].Name); Regionen_neu[Array_groesse-1].Einwohner = Regionen_kopieren[0].Einwohner; strcpy(Regionen_neu[(Array_groesse-1)].Region, Regionen_kopieren[0].Region); strcpy(Regionen_neu[(Array_groesse-1)].Nation, Regionen_kopieren[0].Nation); strcpy(Regionen_neu[(Array_groesse-1)].Mutterstadt, Regionen_kopieren[0].Mutterstadt); fclose(datei_lesen); }
der Error tritt auf, wenn man die Einheitenzahl eingibt.
mfg Ghost
-
Beseitige erst mal die Warnungen vom Compiler. Erhöhe den Warning-Level wenn keine auftauchen.
Fehler (vor allem logische) sind nicht immer dort programmiert, wo sie auftauchen.Access Violation Error bedeutet: Zugriff auf einen verbotenen Bereich.
I.A. ein Zeiger der falsch zeigt (oder ein Adressoperator an der Falschen Stelle)."Einheitenzahl"? In welcher Zeile? Und was gibst du dort ein?
-
Einwohner meinte ich ähm in Zeile 27,28 und ich gebe da eine gerade Zahl ein also einen Integer. Das mit dem Warning-Level werd ich mal probieren.
-
Falls du die Einwohner meinst:
Bei dem scanf für einen Skalar (z.B. %d) brauchst du wieder den Adressoperator.
-
Hm mist da hätt ich aber auch selbst drauf kommen können -.- sind immer die einfachsten Sachen die man übersieht. Danke DirkB
-
Der Compiler sollte eine Warnung in der Zeile 28 geben. In der Art "Datentyp passt nicht zum Formatspecifier bei Parameter 1"
Zudem kann das Problem bei scanf auftauchen, das scanf das Zeilenende (die Enter-Taste) im Eingabepuffer stehen lässt.
Das Forum ist voll von diesem Problem. Hier gleich eine Lösung: http://www.c-plusplus.net/forum/viewtopic.php?t=39349
-
hm ich bekomme keinerlei Warnungen komischerweise aber ich weiß auch nicht wie ich das warning level erhöhen kann habe Dev-C++ habe gelesen das es dabei keine solchen level gibt. also der Adressoperator hatte bei mir das problem gelößt...
-
Dev-C++ wird seit 6 Jahren (in Worten: sechs Jahren) nicht mehr weiterentwickelt.
-
hm oh gott
wusst ich nicht...
kannst du einen empfehlen? nach möglichekeit kostenfrei?mfg Ghost
-
Zu den Warnings: als Suchbegriff bei Google bietet sich "How can i change the warning level in Dev C++" an
Zu den Entwicklungsumgebungen:
Code::Blocks nutzt auch den GCC.Microsoft VisualStudio Express ist auch kostenfrei.
Forensuche
(die fetten Begriffe mal bei Wikipedia eingeben)
-
hm hab mir nun code::blocks geholt
noch eine letzte frage ^^ kennst du eine möglichkeit um einen tastendruck auf der tastatur dierekt einzulesen ? habs mit der Funktion getchar() probiert, doch da haben viele verschiedene tasten den selben wert. was natürlich nicht sehr gut ist
-
Ghostrider schrieb:
hm hab mir nun code::blocks geholt
noch eine letzte frage ^^ kennst du eine möglichkeit um einen tastendruck auf der tastatur dierekt einzulesen ? habs mit der Funktion getchar() probiert, doch da haben viele verschiedene tasten den selben wert. was natürlich nicht sehr gut istDas passiert sicherlich bei Funktionstasten (Fxx, Cursor).
Ich mein mich dunkel zu erinnern, das der Wert 27 ist.Dann musst du ein zweites mal getch() bemühen. Dann kommt der Unterscheidungscode.