![]() |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Danke fürs durchschauen des Codes.
Also zur Erklärung, der Code wurde so von Teamspeak Programmierern übernommen, der ja frei zugänglich ist, und nur wenig verändert: Dies ist laut TeamSpeak Beispiel korrekt (sollte es denke ich mal, hab TS ja nicht programmiert):
Delphi-Quellcode:
Was den rest betrifft, habe ich den code auch wenn er scheinbar nichts macht stehengelassen!
PlayersInfo : Array[0..1023] of TtsrPlayerInfo;
Records := 1024; for i:= 0 to high(Player) do // Record wurde ja auf 1024 begrenzt, bzw werden wohl nicht mehr als 1024 player online sein oder dürfen laut TS? if Player[i].id = Id then result := pchar(player[i].Name); //Die Schleife läuft weiter weil ja mehrere Sprechen können, und ich mich der sich auch af dem channel befindet nicht angezeigt haben möchte, sprich ich und noch jemand sprechen gleichzeitig, dann brauche ich nur seine ID und nicht meine PS: Programm wird gerade getestet! |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Delphi-Quellcode:
der Aufruf von tsrGetSpeakers(@playersInfo, @records) bewirkt, dass
for i:= 0 to high(Player) do // Record wurde ja auf 1024 begrenzt, bzw werden wohl nicht mehr als 1024 player online sein oder dürfen laut TS?
das Array playersInfo befüllt wird und die Anzahl der Einträge wird in "records" abgelegt Also darf eine Schleife doch immer nur von 0 bis records-1 laufen. Niemals darf die Schleife über das gesamte reservierte Array laufen!! playersInfo[0] bis playersInfo[records-1] enthalten gültige Daten. playersInfo[records] bis playersInfo[1024] enthalten ungültige Daten.
Delphi-Quellcode:
Das macht so alles keinen Sinn, weil der Zeiger "Result" ständig neu überschrieben wird.
if Player[i].id = Id then
result := pchar(player[i].Name); //Die Schleife läuft weiter weil ja mehrere Sprechen können, und ich mich der sich auch af dem channel befindet nicht angezeigt haben möchte, sprich ich und noch jemand sprechen gleichzeitig, dann brauche ich nur seine ID und nicht meine Wenn ich nur einen Sprecher suchen möchte, dann kann die Schleife mit "break" doch beendet werden. Wenn ich mehrere Sprecher haben möchte, dann geht das nicht mit PCHAR. Hier ein Beispiel, das Sinn machen würde:
Delphi-Quellcode:
// wichtig in diesem Beispiel ist, dass Result ein String ist
// nur so können alle Sprecher (ausser mir selbst) in einem String zurückkommen for i:= 0 to records-1 do begin if Player[i].id <> MeineEigeneID then begin Result := Result + Player[i].Name+ ' | '; end; end; |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Zitat:
Ich dachte das ist so definiert
Delphi-Quellcode:
... und war das nicht so:
type Player_ = record
ID : integer; Name : string; end; var Player : array of player_;
Delphi-Quellcode:
das High( VarArray ) auch 128 liefert :gruebel:
var
VarArray : array [0..128] of integer; und das hier
Delphi-Quellcode:
da wird Result doch nicht ständig überschrieben, denn der Wert von ID ändert sich in der Schleife nicht und daher gibt es nur eine ID wo das zutrifft, also auch nur einmal Aufrufen.
if Player[i].id = Id then
result := pchar(player[i].Name); //Die Schleife läuft weiter weil ja mehrere Sprechen können, und ich mich der sich auch af dem channel befindet nicht angezeigt haben möchte, sprich ich und noch jemand sprechen gleichzeitig, dann brauche ich nur seine ID und nicht meine |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Zitat:
NEIN high liefert den Höchsten Index der übergebenen Variable! in dem Fall 127!!! So ich habe mal noch die Unterfunktion DoGetSpeakers überarbeitet, ich denke da war ein denkfehlr drin!
Delphi-Quellcode:
function DoGetSpeakers : pchar;
var IDs : Array[0..1023] of Integer; Records : Integer; I, u: 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 begin ID := PlayersInfo[i].PlayerID ; for u := 0 to high(Player) do if Player[u].id = Id then begin result := pchar(player[u].Name); break; end; end; except On E:Exception Do hLog.AddException(E); end; end; ich werde weiter testen und mir den ganzen code nochmal in ruhe ansehen und verbessern! |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Bei einem array[0..128] wäre der höchste Index doch 128, Length() wäre 129, oder?
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Ja stgimmt, wenn man es so definert! fehler meinerseits! sry
So Code wurde leicht verändert und wird jetzt getestet:
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 DisplayResult(tsrGetPlayers(@playersInfo, @records) ); 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 Try Abschnitt end; function DoGetSpeakers : pchar; var IDs : Array[0..1023] of Integer; Records : Integer; I , u: integer; PlayersInfo : Array[0..1023] of TtsrPlayerInfo; ID : integer; begin result := ''; Records := 1024; try DisplayResult(tsrGetSpeakers(@playersInfo, @records) ); //if Records > 0 then ; for I := 0 to Records - 1 do for u := 0 to high(Player) do if Player[u].id = PlayersInfo[i].PlayerID then begin result := pchar(player[u].Name); break; end; except On E : Exception Do hLog.AddException(E); end; //Ende Try Abschnitt end; begin result := ''; if DOGetPlayers then try result := DogetSpeakers; except On E:Exception Do hLog.AddException(E,'Function GetTSSpeaker', []); end; end; |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Zitat:
Delphi-Quellcode:
Liefert mir "low: 0, high: 128"
var MeinArray : array[ 0..128] of integer;
begin ShowMessage( Format( 'low: %d, high: %d', [ Low( MeinArray ), High( MeinArray ) ] ) ); end; Edit: Puh, da habe ich aber Glück, mein Delphi ist doch nicht kaputt. Laut OH wird bei einem normalen Array (array[n..m]) mit High der höchste Index zurückgeliefert (also m) und mit Low der niedrigste (also n). Bei einem offnen Array liefert High die Anzahl der Elemente - 1 |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
So nun kam endlich mal der Fehler:
Dies ist die Meldung: ![]() Die Fehlerhafte Code Zeiler ist Diese:
Delphi-Quellcode:
In die TSRemote.dll kann man nicht reinschauen, wird von TS geliefert!
function DoGetSpeakers : pchar;
var IDs : Array[0..1023] of Integer; Records : Integer; I , u: integer; PlayersInfo : Array[0..1023] of TtsrPlayerInfo; ID : integer; begin result := ''; Records := 1024; try // >>>>>>>>>>>>>>>>>>>>FEHLER!<<<<<<<<<<<<<<<<<<<<< DisplayResult(tsrGetSpeakers(@playersInfo, @records) ); //>>>>>>>>>>>>>>>>>>>>>FEHLER!<<<<<<<<<<<<<<<<<<<<< //if Records > 0 then ; for I := 0 to Records - 1 do for u := 0 to high(Player) do if Player[u].id = PlayersInfo[i].PlayerID then begin result := pchar(player[u].Name); break; end; except On E : Exception Do hLog.AddException(E); end; //Ende Try Abschnitt end; SO ich weiß nicht woran der Fehler liegt! // Ich weiß, war ein lesefehler meinerseits, da du das array ja nich dynamisch erstellt hast, sondern festgelegt hast von vornherein! steht aber auch nen beritrag weiter über deinem! :wink: |
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Also diese Fehlermeldung kommt immer wieder und wies auschaut kann ich da nichts gegen machen!
|
Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun
Diese Fehlermeldung legt nahe, dass du auf ein nichtinitialisiertes Objekt (Nil) zugreifen willst
In welcher Zeile tritt der Fehler den genau auf? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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