2017-02-19 6 views
1

Immer wenn ich diese Struktur ausführe, kann ich zu der Zeile gehen, in der Sie den Constitution Modifier eingeben würden und das Programm stürzt mit einem Popup Fenster ab, das lautet: "Die Anweisung bei 0x00000000775AFDE9 referenziert Speicher bei 0x000000007758D250 Speicher konnte nicht geschrieben werden. Zum Beenden OK drücken. " Hier ist die Struktur in Frage:Referenzierter Speicher konnte nicht geschrieben werden

struct player_info create_player(void); 
struct player_info{ 
    char name[30]; 
    int Level, Str, Dex, Con, Int, Wis, Cha; 
}; 

struct player_info create_player(void){ 
    struct player_info aPlayer; 
    { 
     char c; 
     int i; 
     printf("Enter Player Name: "); 
     scanf("%s",aPlayer.name); 
     i = strlen(aPlayer.name); 
     do{ 
      scanf("%c", &c); 
      aPlayer.name[i++] = c; 
     } 
     while (c != '\n'); 
     aPlayer.name[i - 1] = 0; 
    } 

    printf("Level: "); 
    scanf("%d",aPlayer.Level); 

    printf("Strength Modifier: "); 
    scanf("%d",aPlayer.Str); 

    printf("Dexterity Modifier: "); 
    scanf("%d", aPlayer.Dex); 

    printf("Constitution Modifier: "); 
    scanf("%d", aPlayer.Con); 

    printf("Intelligence Modifier: "); 
    scanf("%d", aPlayer.Int); 

    printf("Wisdom Modifier: "); 
    scanf("%d", aPlayer.Wis); 

    printf("Charisma Modifier: "); 
    scanf("%d", aPlayer.Cha); 
    return aPlayer; 
}; 

Und der Schreib-Bit:

int save_data(){ 
      FILE* PlayerFile = fopen("players.txt","w"); 
      int i = 0; 

      for (i = 0; i < 1; i++){ 
      struct player_info aPlayer = create_player(); 
      fprintf(PlayerFile, "%s %d %d %d %d %d %d %d\n", aPlayer.name, aPlayer.Level, aPlayer.Str, aPlayer.Dex, aPlayer.Con, aPlayer.Int, aPlayer.Wis, aPlayer.Cha); 
      } 
      fclose(PlayerFile); 
      return 0; 
      } 

nun klar sein, kann ich Eingang bis zur Geschicklichkeit Modifikator. Die nächste Zeile, die nach der Konstitution fragen sollte, wird nicht gedruckt, und das ist, wenn ich den Popup-Fehler erhalte.

Ich habe versucht, alles von der Verfassung Mod bis zum Charisma zu kommentieren, nur um zu sehen, und ich bekomme das gleiche Problem. Das Entfernen nur des Verfassungsteils funktioniert auch nicht. Ich bin mir nicht wirklich sicher, was hier vorgeht; Ich habe andere Beiträge gesehen, die etwas über einen falschen Zeiger sagten, aber ich sehe nichts dergleichen, außer es ist nur eines dieser Dinge, die du einfach vermisst und jemanden anderen brauchst, um es darauf hinzuweisen. Wie auch immer, jede Hilfe wird geschätzt.

+2

[Stellen Sie Ihre Warnungen auf pedantische Ebenen] (http://pastebin.com/zUvX0UQi). – WhozCraig

+0

Wenn Sie eine der 'scanf()' -Familien von Funktionen aufrufen, überprüfen Sie immer den zurückgegebenen Wert (nicht den Parameterwert), um sicherzustellen, dass der Vorgang erfolgreich war. – user3629249

+0

die Funktion: 'strlen()' gibt ein 'size_t' nicht ein' int' zurück – user3629249

Antwort

4

scanf erwartet die Adresse der Variablen, in die Sie schreiben möchten. Also das

scanf("%d",aPlayer.Level); 

sollte dies

scanf("%d", &aPlayer.Level); 

Für alle Ihre Statistiken. Die Art und Weise, wie Sie es eingerichtet haben, besteht nun darin, einen nicht spezifizierten ganzzahligen Wert an scanf zu übergeben (die Variable aPlayer.Level und die Firma sind nicht initialisiert), die dann als Adresse uminterpretiert wird, in die die Funktion zu schreiben versucht. Das Verhalten eines solchen Codes ist nicht definiert.

+0

Das habe ich komplett vergessen, danke. Ich habe sie alle geändert, aber wenn ich etwas nicht verpasst habe, bekomme ich immer noch denselben Fehler. – hego64

+0

@ hego64 - Beginne mit dem Ratschlag von WhozCraig. Und posten Sie eine andere Frage, wenn es nicht hilft. Das einzige andere verdächtig aussehende Ding in deinem Code ist die ganze do..while-Schleife mit 'aPlayer.name'. Aber Sie behaupten, dass es funktioniert, also werde ich es dabei belassen. – StoryTeller

+0

Ich habe das tatsächlich von einer anderen Frage, die ich hier gefragt habe. Dieser Code ist der, auf dem ich das aufgebaut habe. http://StackOverflow.com/a/41896154/7471023 Und wie genau kann ich die Warnungen, wie er vorgeschlagen, auftauchen? – hego64

Verwandte Themen