Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 09, 2025 02:05

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: SDL Net AccessViolation
BeitragVerfasst: Di Nov 06, 2007 13:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Nov 29, 2005 21:11
Beiträge: 88
Wohnort: Bonn
Moin!

Ich programmiere an einem kleinen Netzwerk-Spiel in SDL.
Es hat soweit alles schön geklappt, ich programmierte fröhlich vor mich hin, als mir plötzlich eine AccessViolation um die Ohren gehauen wird.
Das ganze passiert bei SDLNet_CheckSockets, was mich wundert, weil die Funktion doch eigentlich keinen Grund hat mit Exceptions zu wwrfen...

Der Quelltext beim Client:
Code:
  1.  
  2.   // Event-Handler
  3.   running := true;
  4.   while running do
  5.   begin
  6.     // Check socket for activity
  7.     if (SDLNet_CheckSockets(mySocketSet, 100) > 0) then
  8.     begin
  9.       bytesrecv := SDLNet_TCP_Recv(mySocket, @cmd, 4);
  10.       if (bytesrecv > 0) then
  11.       begin
  12.         WriteLn(inttostr(cmd));
  13.         case cmd of
  14.           100: begin
  15.                  Write('Receiving Map... ');
  16.                  SDLNet_TCP_Recv(mySocket, @width, 4);
  17.                  SDLNet_TCP_Recv(mySocket, @height, 4);
  18.                  WriteLn(inttostr(width) + 'width');
  19.                  WriteLn(inttostr(height) + 'height');
  20.                  SetLength(myMap, width, height);
  21.                  bytesrecv := SDLNet_TCP_Recv(mySocket, @myMap, width*height);
  22.                  WriteLn(inttostr(bytesrecv) + 'bytes received');
  23.                  WriteLn('ok');
  24.                end;
  25.           200: begin
  26.                  WriteLn('Start Game...');
  27.                  //screen := SDL_SetVideoMode(width*32, height*32, 16, SDL_SWSURFACE OR SDL_HWPALETTE);
  28.                  //SDL_WM_SetCaption('Panzerschwein', nil);
  29.  
  30.                  //drawScene;
  31.                end;
  32.         end;
  33.       end;
  34.     end;
  35.  


Und hier der vom Server...
Code:
  1.  
  2.   Write('Sending Map... ');
  3.   cmd := 100;
  4.   for i := 0 to userCount-1 do
  5.   begin
  6.     SDLNet_TCP_Send(myClientSockets[i], @cmd, 4);
  7.     SDLNet_TCP_Send(myClientSockets[i], @width, 4);
  8.     SDLNet_TCP_Send(myClientSockets[i], @height, 4);
  9.     bytesrecv := SDLNet_TCP_Send(myClientSockets[i], @myMap, width*height);
  10.     WriteLn(inttostr(bytesrecv) + 'bytes send');
  11.   end;
  12.   WriteLn('ok');
  13.  
  14.   WriteLn('Starting Game');
  15.   cmd := 200;
  16.   for i := 0 to userCount-1 do
  17.   begin
  18.     SDLNet_TCP_Send(myClientSockets[i], @cmd, 4);
  19.   end;
  20.   WriteLn;
  21.  


Bevor ich die "case cmd of" beim client eingebaut habe, funktionierte alles bestens
allerdings habe ich danach noch ein paar sachen geändert, ich kann nicht mehr nachvollziehen, welche änderung für den fehler verantwortlich ist.

und die accessviolation tritt nur auf, wenn ich die daten auch vom socket lese. wenn ich die zeilen im cmd:100 case auskommentiere, passiert nichts

Ich hoffe, dass hier jemand unterwegs ist, der neben openGl auch ein bisschen SDL Ahnung hat - vielleicht ist es ja auch ein grundsätzlicher fehler, der mir da unterluafen ist...
aber im moment steh ich voll aufm Schlauch

:?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 06, 2007 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also mit SDL_net kenne ich mich gar nicht aus. Aber das Problem klingt für mich eher so als ob du dir einen Speicherbereich zerschießt. Ich gehe mal davon aus, dass myMap ein dynamisches Array ist? Dann versuch mal folgendes @myMap[0]. Damit erzwingst du die Benutzung des Datenbereiches des Arrays. Denn ein dynamisches Array ist normal auch nur ein Pointer. Und wenn die Variable in der Nähe von dem Soket definiert wurde liegen die Speicherbereiche ziemlich nebeneinander. Wenn du jetzt an die Adresse von myMap Daten schreibst überschreibst du auch andere Variablen. Und nicht die Daten auf die er zeigt.

So ist zum Beispiel diese beiden Sachen auch unterschiedlich.
Code:
  1. FillChar(DynArray, count, wert);  // geht nicht dynarray ist anschließen tot
  2. FillChar(DynArray[0], count, wert); // geht


Du kannst das auch selber im Debugger überprüfen. Einfach mal vor SDLNet_TCP_Recv einen Haltepunkt setzen und dir anschauen ob der wert (Poiner) von mySocket verändert wurde.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 10 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.015s | 17 Queries | GZIP : On ]