![]() |
Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzung???
Hallo liebe Delphi Gemeinde,
Und zwar Prüfe ich über einen Timer (Interval 500ms), wer gerade im Teamspeak auf einem Channel auf dem Man connected ist spricht! Soweit so gut, es klappt auch, nur nach ca. 15 - 20 Minuten wird immer eine Exception ausgelöst. und zwar eine Zugriffsverletzung in meiner Programm.exe Könntet Ihr euch den Code bitte mal ansehen, vielleicht endeckt ihr ja einen Fehler, oder den Grund für dieses Verhalten Hier der Code:
Delphi-Quellcode:
function GetTSSpeaker : pchar;
Function DisplayResult( Res: Integer ) : Boolean; Var ErrorMessage: array[0..1023] of Char; begin if res=0 then begin //Writeln('OK'); Result := True; exit; end else begin tsrGetLastError(@ErrorMessage, SizeOf(ErrorMessage)); Result := False; end; end; function DoGetPlayers : boolean; var PlayersInfo : Array[0..1023] of TtsrPlayerInfo; Records : Integer; I: integer; begin result := true; Records := 1024; try if not DisplayResult(tsrGetPlayers(@playersInfo, @records) ) then ; if Records > 0 then setlength(Player,records); if records > 0 then begin for I :=0 to Records-1 do begin PLayer[i].id := PlayersInfo[i].PlayerID; Player[i].Name := PlayersInfo[i].NickName; end; result := true; end; except On E:Exception Do begin hLog.AddException(E); exit; end; end; end; function DoGetSpeakers : pchar; var IDs : Array[0..1023] of Integer; Records : Integer; I: integer; PlayersInfo : Array[0..1023] of TtsrPlayerInfo; ID : integer; begin result := ''; Records := 1024; try if not DisplayResult(tsrGetSpeakers(@playersInfo, @records) ) then exit; if Records > 0 then ; for I :=0 to Records-1 do ID := PlayersInfo[i].PlayerID ; for i:= 0 to high(Player) do if Player[i].id = Id then result := pchar(player[i].Name); except On E:Exception Do hLog.AddException(E); end; end; begin result := ''; if DOGetPlayers then try result := DogetSpeakers; except On E:Exception Do hLog.AddException(E,'Function GetTSSpeaker', []); end; end; Hier der TimerCode
Delphi-Quellcode:
procedure TForm1.Timer3Timer(Sender: TObject);
var TSSpeaker : string; i : integer; begin TSSpeaker := GetTSSpeaker; end;
Delphi-Quellcode:
type Player_ = record
ID : integer; Name : string; end; var Player : array of player_; Ich danke schonmal für eure Hilfe |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Wo und wie ist Player deklariert?
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Sorry, das Hatte ich vergessen
Player ist Global deklariert:
Delphi-Quellcode:
type Player_ = record ID : integer; Name : string; end; var Player : array of player_; |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Du Logst doch schon die Ausnahme selbst.
Wie wäre es, wenn du auch loggst in welcher Funktion?
Delphi-Quellcode:
...
except On E:Exception Do begin hLog.AddException('DerMethodenName', E); end; end; |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
tsrGetSpeakers(@playersInfo, @records)
??? |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Hallo,
in der Fehlermeldung bekommst Du doch bestimmt auch die Fehleradresse! Also Debugger marsch: Breakpoint auf die erste Programmzeile in der Programm.dpr setzen, Programm starten, hält am Breakpoint an, Menü Suchen, Laufzeitfehler suchen, Adresse aus der Fehlermeldung eingeben und suchen lassen. Jetzt solltest Du (mit recht großer Wahrscheinlichkeit) an der Stelle im Quelltext landen, an der der Fehler zu suchen ist. Machmal und zeig' uns dann in Deinem Quelltext die entsprechende Stelle, vielleicht ist's dann ein bisserl weniger :glaskugel: |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
OK werd ich mal machen, kann nur eine weile dauern bis der fehler auftritt! ich meld mich wieder mit mehr details
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Wie lautet denn nun die genaue Fehlermeldung inklusive der Adressen welche in der Fehlermeldung enthalten sind?
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Öhm, Jens:
Zitat:
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Dein Code hat eine schlechte Qualität.
Hier ein Beispiel für eine Funktion, die gleich mehrere Fehler/Mängel hat:
Delphi-Quellcode:
function DoGetSpeakers : pchar; // warum Pchar ? string ist viel sicherer
var IDs : Array[0..1023] of Integer; Records : Integer; I: integer; PlayersInfo : Array[0..1023] of TtsrPlayerInfo; // Unschön und gefährlich: grosse Arrays auf dem Stack (Stacküberlauf droht) ID : integer; begin result := ''; Records := 1024; // unschön, hier wäre Length(PlayersInfo) angebracht try if not DisplayResult(tsrGetSpeakers(@playersInfo, @records) ) then exit; if Records > 0 then ; // diese Zeile tut nichts. Warum steht sie dann da ? for I :=0 to Records-1 do ID := PlayersInfo[i].PlayerID ; // Unsinn: ID wird zugewiesen - es wird aber damit nicht gearbeitet for i:= 0 to high(Player) do // wenn i > Records-1, dann wird auf uninitialisierten Daten gearbeitet !!! ein ganz böses Foul if Player[i].id = Id then result := pchar(player[i].Name); // Schleife läuft weiter, obwohl der Player mit der Id gefunden wurde // fehlt da nicht ein Break ? except On E:Exception Do hLog.AddException(E); end; // Einrückung passt nicht end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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