Zugriffsverletzung beim Schreiben an Position



  • Hey Leute, bin grad dabei n Spielchen zu schreiben habe allerdings Probleme beim Schreiben der Namen in ein Struct Objekt.

    struct sSpieler
    	{
    		char	cName[16];
    		float	fGeld;
    		int		iPosition;
    		bool	bAussetzen;
    		int		iAusgeschieden;
    	};
    
    	sSpieler S1 = { "Spieler 1", 6000000.0F, 1, false, 1 };
    	.
    	.
    	.
    	.
    	.
    	sSpieler S10 = { "Spieler 10", 6000000.0F, 1, false, 1 };
    sSpieler aSpieler[10] = { S1, S2, S3, S4, S5, S6, S7, S8, S9, S10 };
    

    Jetzt will ich aber nicht dass der Spieler- Spieler 1 heißt sondern
    das jeder Spieler sich selbst einen Namen geben kann. dann wollte ich das mit

    printf("\nGeben sie Spieler %i's Namen ein ->", 1);
    	scanf_s("%s", &aSpieler[0].cName); fflush(stdin);
    

    lösen. Quasi nur mal vom ersten Spieler den Namen ändern.
    Aber nach der eingabe gibts ne Fehlermeldung.

    Ausnahme ausgelöst bei 0x0F4AC71D (ucrtbased.dll) in Monopoly2.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x00CE1000.
    

    Aber warum? Versteh ich irgendwie nicht 😃

    Hoffe mir kann jemand helfen und auch das Problem dahinter erklären

    Grüße klixxx 🙂



  • Benutze std::string statt char-Arrays.
    Benutze std::vector statt array.
    Benutze iostream statt printf/scanf.

    Microsoft schrieb:

    Anders als scanf und wscanf erfordern scanf_s und wscanf_s eine Angabe der Puffergröße für alle Eingabeparameter

    Wo ist das bei dir?



  • &aSpieler[0].cName sollte &aSpieler[0].cName[0] oder aSpieler[0].cName sein.



  • manni66 schrieb:

    Benutze std::string statt char-Arrays.
    Benutze std::vector statt array.
    Benutze iostream statt printf/scanf.

    std::string und std:vector sind mir ehrlicherweiße gar kein Begriff.
    Studiere gerade Informatik im ersten Semster und unser Prof bringt uns das halt mit den Methoden bei, wie ich sie geschrieben habe.

    manni66 schrieb:

    Microsoft schrieb:

    Anders als scanf und wscanf erfordern scanf_s und wscanf_s eine Angabe der Puffergröße für alle Eingabeparameter

    Wo ist das bei dir?

    Unser Prof meinte dass das scanf_s von microsoft eingeführt wurde weil das scanf normal zu unsicher gewesen sei. Wir sollen entweder _crt_secure_no_warnings in den Präprozessor als Ausnahme hinzufügen oder halt scanf_s benutzen. Da von der zitierten Nachricht von Microsoft nix von scanf angegeben war hab ich oben besagtes getan - die Ausnahme hinzugefügt und scanf anstatt scanf_s benutzt. Jetzt funktioniert es auch.

    for (int i = 0; i < iAnzahlSpieler; i++)
    	{
    		printf("\nGeben sie Spieler %i's Namen ein ->", i+1);
    		scanf("%s", aSpieler[i].cName); fflush(stdin);
    	}
    
    	for (int i = 0; i < iAnzahlSpieler; i++)
    	{
    		printf("\nSpieler: %s", aSpieler[i].cName);
    	}
    

    Liegt das daran dass ich keine Puffergröße definiert habe? Wenn ja was ist das überhaupt?

    Grüße klixxx 🙂

    PS. Dank dir tausend mal, ohne dich wäre ich da womöglich nicht drauf gekommen 😃



  • YAIT (yet another incompetent teacher)

    Liegt das daran dass ich keine Puffergröße definiert habe? Wenn ja was ist das überhaupt?

    Ja. Das ist der Witz an scanf_s: du sagst, wieveiele Zeichen überhaupt in das Array passen. Gibt der Benutzer mehr ein, gibt es trotzdem keinen Überlauf.

    Bei mir generiert der Compiler eine Meldung:

    scan.cpp(7): warning C4473: 'scanf_s' : not enough arguments passed for format string
    scan.cpp(7): note: placeholders and their parameters expect 2 variadic arguments, but 1 were provided
    scan.cpp(7): note: the missing variadic argument 2 is required by format string '%s'
    scan.cpp(7): note: this argument is used as a buffer size



  • manni66 schrieb:

    YAIT (yet another incompetent teacher)

    Sehr vorschnelles Urteil.
    Da überhaupt nichts c++ ist, könnte der Beitrag auch lediglich im falschen Unterform sein.

    Also Threadsteller, C oder C++? Was macht ihr?



  • Jockelx schrieb:

    manni66 schrieb:

    YAIT (yet another incompetent teacher)

    Sehr vorschnelles Urteil.
    Da überhaupt nichts c++ ist, könnte der Beitrag auch lediglich im falschen Unterform sein.

    Also Threadsteller, C oder C++? Was macht ihr?

    Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin. 🙂

    manni66 schrieb:

    YAIT (yet another incompetent teacher)

    Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt 😃

    manni66 schrieb:

    Ja. Das ist der Witz an scanf_s: du sagst, wieveiele Zeichen überhaupt in das Array passen. Gibt der Benutzer mehr ein, gibt es trotzdem keinen Überlauf.

    Das hab ich auch schon bemerkt, habs grad ausprobiert, mit 1 bei Scanf_s und er hat den kompletten Namen trotzdem ohne zu meckern genommen. Vielen lieben Danke für deine Hilfe! 🙂



  • klixxx schrieb:

    Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin. 🙂

    manni66 schrieb:

    YAIT (yet another incompetent teacher)

    Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt 😃

    Das, was du hier schreibst, hat mit (modernem) C++ absolut gar nichts mehr zu tun.

    Zu der Kompetenz des Professors möchte ich mich mal nicht äußern. Es kommt halt nur sehr oft vor, dass Professoren ihre Vorlesungsunterlagen einmal erstellen und dann die nächsten 30 Jahre verwenden, ohne darauf zu achten, ob der Inhalt noch zeitgemäß ist.

    Und dass er eine eigene Firma hat, muss nichts heißen. Kann sein, dass er da seine Angestellten hat, die die Programmierarbeit übernehmen und er selbst nur bei der Architektur arbeitet. Kann aber auch sein, dass da knallhart C programmiert wird 😉



  • daddy_felix schrieb:

    klixxx schrieb:

    Wir lernen im allgemeinen C++, zumindest steht das in allen Vorlesungsunterlagen drin. 🙂

    manni66 schrieb:

    YAIT (yet another incompetent teacher)

    Ich denke er hat schon Ahnung, er hat seine eigene Firma die diverse Sachen Programmieren. Aber das sei mal dahin gestellt 😃

    Das, was du hier schreibst, hat mit (modernem) C++ absolut gar nichts mehr zu tun.

    Zu der Kompetenz des Professors möchte ich mich mal nicht äußern. Es kommt halt nur sehr oft vor, dass Professoren ihre Vorlesungsunterlagen einmal erstellen und dann die nächsten 30 Jahre verwenden, ohne darauf zu achten, ob der Inhalt noch zeitgemäß ist.

    Und dass er eine eigene Firma hat, muss nichts heißen. Kann sein, dass er da seine Angestellten hat, die die Programmierarbeit übernehmen und er selbst nur bei der Architektur arbeitet. Kann aber auch sein, dass da knallhart C programmiert wird 😉

    Das kann natürlich alles zutreffen, ich berichte in 7 Semstern wenn ich meinen Abschluss habe, ob ich was aufm Arbeitsmarkt taug oder nicht 😛 😃

    Danke an alle die mir geholfen haben 🙂


Anmelden zum Antworten