Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

PD

unregistriert

1

23.01.2006, 15:00

Zufällige Access violations?!?

Ich habe seit gestern wirklich merkwürdige probleme.... ich bekomme mehr oder weniger zufällige Access violations und finde einfach keine Lösung... ich zeig euch einfach mal meinen code der mir Kopfschmerzen bereitet:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        if(input.wasKeyboardKeyPressed(DIK_A)) c = 'a';
        else if(input.wasKeyboardKeyPressed(DIK_B)) c = 'b';
        else if(input.wasKeyboardKeyPressed(DIK_C)) c = 'c';
        else if(input.wasKeyboardKeyPressed(DIK_D)) c = 'd';
        else if(input.wasKeyboardKeyPressed(DIK_E)) c = 'e';
        else if(input.wasKeyboardKeyPressed(DIK_F)) c = 'f';
        else if(input.wasKeyboardKeyPressed(DIK_G)) c = 'g';
        else if(input.wasKeyboardKeyPressed(DIK_H)) c = 'h';
        else if(input.wasKeyboardKeyPressed(DIK_I)) c = 'i';
        else if(input.wasKeyboardKeyPressed(DIK_J)) c = 'j';
        else if(input.wasKeyboardKeyPressed(DIK_K)) c = 'k';
        else if(input.wasKeyboardKeyPressed(DIK_L)) c = 'l';
        else if(input.wasKeyboardKeyPressed(DIK_M)) c = 'm';
        else if(input.wasKeyboardKeyPressed(DIK_N)) c = 'n';
        else if(input.wasKeyboardKeyPressed(DIK_O)) c = 'o';
        else if(input.wasKeyboardKeyPressed(DIK_P)) c = 'p';
        else if(input.wasKeyboardKeyPressed(DIK_Q)) c = 'q';
        else if(input.wasKeyboardKeyPressed(DIK_R)) c = 'r';
        else if(input.wasKeyboardKeyPressed(DIK_S)) c = 's';
        else if(input.wasKeyboardKeyPressed(DIK_T)) c = 't';
        else if(input.wasKeyboardKeyPressed(DIK_U)) c = 'u';
        else if(input.wasKeyboardKeyPressed(DIK_V)) c = 'v';
        else if(input.wasKeyboardKeyPressed(DIK_W)) c = 'w';
        else if(input.wasKeyboardKeyPressed(DIK_X)) c = 'x';
        else if(input.wasKeyboardKeyPressed(DIK_Y)) c = 'y';
        else if(input.wasKeyboardKeyPressed(DIK_Z)) c = 'z';
        else if(input.wasKeyboardKeyPressed(DIK_SPACE)) c = ' ';
        else if(input.wasKeyboardKeyPressed(DIK_BACK)) c = '\b';
        else c = 0;

switch(c) {
            case '\b':
                if(!text.empty()) text.resize(text.size()-1);
                break;

            default:
                if(input.isKeyboardKeyDown(DIK_LSHIFT) || input.isKeyboardKeyDown(DIK_RSHIFT)) c -= 32;
                if(c > 0) text += string(1, c);
                break;
        }


Ok, soweit nichts ungewöhnliches (die input klasse ist aus davids 2D Framework). c, eine vordefinierte char Variable (kein pointer oder so) bekommt einen Wert, jenachdem welche Taste gedrückt wird. Unten werden dann entsprechende Steuerzeichen behandelt, oder im default wird der Buchstabe einem std::string namens text hinzugefügt. Bis hierhin dürfte es nicht viel geben was man falsch machen kann... aber offensichtlich schon. Ich möchte mal eine kleine Zusammenfassung von gestern Abend und der letzten Stunde abgeben:

Zunächst hatte ich statt eines einfachen chars ein char arry mit 2 elementen da mein erster gedanke war "string addition erfordert ein char array"... also element 0 = gedrückter buchstabe, element 2 = \0. Ok, soweit alles klar, hatte dann ne normale string addition ohne das die shift tasten oder da \b abgefragt wurden. Da bekam ich ne access violation... ich rum geforscht und auskommentiert was das zeug hielt... ich also erstmal die Zuweisung des char arrays zum std::string auskommentiert... und es klappte. Testweise wollte ich das char array in ner MessageBox ausgeben -> Error. Hum... Ergo -> Benutzung des char arrays = Access violation. o_O Nagut, ich bin ja net ganz doof (denk ich mal) und probier weiter rum. Nun wollte ich das array los werden und hab obrige Variante getestet... mit einem normalen char. Hab dann glücklicherweise std::string::append gefunden. Also fix ein text.append(1, c) rein gehauen -> access violation... ooook... es ging und ging einfach nicht. Also fing ich an zu überlegen "liegts vielleicht an der input klasse?"... also fix alle input abfragen auskommentiert -> läuft. Na herrlich... wieder eingebaut -> Error... die input klasse klappt doch sonst irgendwo... auch die methode... also einfach mal nur einen teil der tastenabfragen auskommentiert. Hatte am ende nurnoch die Tastenabfragen von a - c drin und es lief! den teil für d wieder rein genommen -> error... o_O Also hab ich erstmal das handtuch geworfen. Hab mich dann grade wieder dran gesetzt. Einfach mal zum testen d wieder rein genommen und es kllappte! Weitere tests eröffneten mir das nun alles klappt... solange ich die Abfragen von y bis \b auskommentiere... wenn ich allerdings statt z.B. c = 'y' ein c = 0 hinschreibe gehts... im Klartext... ich kann c dort also nix zuwesein ohne Fehler (hab diverse Werte verscuht).

Zusammengefasst:

- Ab nem gewissen punkt im code kann ich c keinen Wert != 0 mehr zuwesein
- Diese Stelle scheint aber von Gestern auf Heute zu variieren
- Compiler (Dev-C++) jammert nicht... nur access violation bei ausführung
- ein text.append(1,c) führt auch zum absturz

Also... kann das denn wahr sein? Ich mein... mach ich was falsch? Spielt mir mein PC nen streich? Hat jemand irgend eine Idee woran sowas liegen kann? Es ging doch sonst alles... ???

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

23.01.2006, 15:30

Hmmm... eine Frage: Wieso verwendest du die DIK-Konstanten... Hat die DirectInput-Klasse nicht eigene Makros... TB_KEY_A - TB_KEY_Z oder?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Lemming

Alter Hase

Beiträge: 550

Beruf: Schüler

  • Private Nachricht senden

3

23.01.2006, 15:40

Zitat von »"Black-Panther"«

Hmmm... eine Frage: Wieso verwendest du die DIK-Konstanten... Hat die DirectInput-Klasse nicht eigene Makros... TB_KEY_A - TB_KEY_Z oder?
naja das DIK steht soweit ich weiß für DirectInputKey und die TBs kommen von Davids TriBase...
Es gibt Probleme, die kann man nicht lösen.
Für alles andere gibt es C++...

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

23.01.2006, 15:48

Hast du nicht gesagt, dass du mit Davids Tribase arbeitest?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

PD

unregistriert

5

23.01.2006, 16:32

Ne, David hat auch ein 2D Framework gemacht (für die DUS) welche die DIK Konstanten verwendet.

PD

unregistriert

6

24.01.2006, 18:11

Sorry wegen Doppelpost, aber seit ihr etwa alle so ratlos wie ich? ^^"

Werbeanzeige