![]() |
Übertragungsfehler eines Strings (?)
noch immer gleiches Projekt (LAN-Schach), aber andere Stelle:
Ich überprüfe nach jedem Schachzug, auf Bedrohung (CheckSign = '+'), auf Matt (CheckSign = '#') und auf Patt (CheckSign = 'XX'). Bei einem 'normalen' Zug (also ohne den vorherigen Situationen) ist CheckSign = ''. Bei dem, der gerade gezogen hat und wo das ganze gleich überprüft wird, funktioniert das ganze wunderbar. Aber sobald bei dem Empfänger das empfangene Checksign > '' ist, kommt eine Zugriffsverletzung. Hier werden die Daten versandt:
Delphi-Quellcode:
Hier das Empfangen der Daten:
procedure TBoardForm.SendGameFiles(FSrc, FDest: TPoint; FNewFig: String);
var AFiles: RSendFiles; begin AFiles.DoEnPassant:=DoEnPassant; AFiles.EnPassant:=IsEPPossible(FSrc,FDest); AFiles.Src:=FSrc; AFiles.Dest:=FDest; AFiles.DoCastle:=DoCastle; AFiles.CheckSign:=CheckSign; //wenn ich übrigens CheckSign absolut definiere: AFiles.CheckSign:='#' funktioniert es!?? Obwohl die Variable CheckSign ebenfalls '#' enthält! AFiles.NewFig:=FNewFig; // AFiles enthält korrekte Eingaben, hab ich schon öfters überprüft try if TcpClient.Connect then begin TcpClient.Sendln('GameFiles#'); TcpClient.SendBuf(AFiles,sizeof(AFiles));; end; finally TcpClient.Disconnect; end; // auch das Senden funktioniert, ebenfalls überprüft DoCastle.QWing:=False; DoCastle.KWing:=False; DoEnPassant:=False; EnPassant.Possible:=False; { CheckSign überprüfen / Rückgabewert: Spiel aus (True / False) } if (CheckCheckSign(UserWhite)) then exit; ChangeTurn; end;
Delphi-Quellcode:
procedure TBoardForm.TcpServerAccept(Sender: TObject;
ClientSocket: TCustomIpClient); var ReceivedLn: String; i: Integer; ReceivedKind: String; ReceivedInfo: String; AGameFiles: RGameFiles; AFiles: RSendFiles; begin (...) ReceivedLn:=ClientSocket.Receiveln; i := Pos('#', ReceivedLn); ReceivedKind := Copy(ReceivedLn, 1, Pred(i)); if (ReceivedKind = 'OpenGame') then (...) if (ReceivedKind = 'GameFiles') then begin ClientSocket.ReceiveBuf(AFiles,sizeof(AFiles)); UpdateGame(AFiles); //das Problem ist, ich kann AFiles nicht gleich überprüfen, weil bei den überprüften Ausdrücken immer steht 'nicht verfügbarer Wert'. Wenn ich jedoch CheckSign beim Senden absolut definiere, kann ich hier per Ausdrucksüberprüfung zugreifen exit; end; if (ReceivedKind = 'Info') then (...); end;
Delphi-Quellcode:
procedure TBoardForm.UpdateGame(FFiles: RSendFiles);
var AWhite: Boolean; begin AWhite:=not(UserWhite); //sobald das Programm diese Routine erreicht, kommt die Zugriffsverletzung und eben nur, wenn CheckSign > '' ist und ich es nicht absolut definiere CheckSign:=FFiles.CheckSign; DoEnPassant:=FFiles.DoEnPassant; EnPassant:=FFiles.EnPassant; MoveFigure(Field,FFiles.Src,FFiles.Dest,False,True,FFiles.DoCastle,AWhite, FFiles.NewFig); DoEnPassant:=False; { CheckSign überprüfen / Rückgabewert: Spiel aus (True / False) } if (CheckCheckSign(not(UserWhite))) then exit; ChangeTurn; end; *Verzweiflung* |
Re: Übertragungsfehler eines Strings (?)
RSendFiles ist anscheinend ein Record, kannst du uns mal bitte die Definition des selbigen geben? Ich glaube dass dort nur vom Typ String definiert wurde und nicht ShortString oder String[3]; o.ä. und somit steht in dem Record dort nur eine Adresse und keine Stringdaten. Naja, egal, gib mal bitte die Definition von RSendFiles.
|
Re: Übertragungsfehler eines Strings (?)
Ok, da hast du recht:
Delphi-Quellcode:
Also reicht es einfach String[3] zb zu schreiben?
type
RCastling = record QWing: Boolean; KWing: Boolean; end; REnPassant = record Pos: TPoint; Possible: Boolean; end; RSendFiles = record Src: TPoint; Dest: TPoint; DoCastle: RCastling; EnPassant: REnPassant; DoEnPassant: Boolean; CheckSign: String; NewFig: String[1]; end; |
Re: Übertragungsfehler eines Strings (?)
Ja, weil dann ist es kein AnsiString mehr, der in dem Record nur seine Adresse ablegen würde anstatt dem Inhalt des Strings. Mit String[3] hast du im Endeffekt 3 einzelne Char's in dem Record, und somit stehen dann auch die gewünschten Daten an ihrer richtigen Stelle in dem Record. (@other: ich weiss, Längenbyte mal bitte vernachlässigen)
|
Re: Übertragungsfehler eines Strings (?)
Aja, hab's gerade ausprobiert und es funktioniert!
Vielen Dank! Wusste nicht, dass da nur eine Adresse drinnensteht, aber, wenn man sich's so überlegt, is es auch irgendwie logisch ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz