AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzung???
Thema durchsuchen
Ansicht
Themen-Optionen

Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzung???

Ein Thema von SimStar001 · begonnen am 5. Dez 2008 · letzter Beitrag vom 17. Jan 2009
Antwort Antwort
Seite 2 von 3     12 3      
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#11

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 14:49
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:
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
Was den rest betrifft, habe ich den code auch wenn er scheinbar nichts macht stehengelassen!



PS: Programm wird gerade getestet!
Marco Tröger
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 15:12
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? der Aufruf von tsrGetSpeakers(@playersInfo, @records) bewirkt, dass
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:
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
Das macht so alles keinen Sinn, weil der Zeiger "Result" ständig neu überschrieben wird.
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 15:17
Zitat von shmia:
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?
Wo das denn

Ich dachte das ist so definiert
Delphi-Quellcode:
type Player_ = record
      ID : integer;
      Name : string;
      end;


var Player : array of player_;
... und war das nicht so:
Delphi-Quellcode:
var
  VarArray : array [0..128] of integer;
das High( VarArray ) auch 128 liefert

und das hier
Delphi-Quellcode:
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
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#14

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 15:36
Zitat:
und war das nicht so:
Delphi-Quellcode: markieren
var
VarArray : array [0..128] of integer;


das High( VarArray ) auch 128 liefert Grübelnd...

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!
Marco Tröger
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#15

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 15:42
Bei einem array[0..128] wäre der höchste Index doch 128, Length() wäre 129, oder?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#16

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 15:52
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;
Marco Tröger
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#17

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 17:00
Zitat von SimStar001:
Zitat:
und war das nicht so:
Delphi-Quellcode: markieren
var
VarArray : array [0..128] of integer;


das High( VarArray ) auch 128 liefert Grübelnd...

NEIN high liefert den Höchsten Index der übergebenen Variable! in dem Fall 127!!!
Dann ist mein Delphi kaputt, denn
Delphi-Quellcode:
var MeinArray : array[ 0..128] of integer;
begin
  ShowMessage( Format( 'low: %d, high: %d', [ Low( MeinArray ), High( MeinArray ) ] ) );
end;
Liefert mir "low: 0, high: 128"

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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#18

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 17:04
So nun kam endlich mal der Fehler:

Dies ist die Meldung:
http://xero-network.eu/~simstar/Fehler.jpg

Die Fehlerhafte Code Zeiler ist Diese:


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

  // >>>>>>>>>>>>>>>>>>>>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;
In die TSRemote.dll kann man nicht reinschauen, wird von TS geliefert!

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!
Marco Tröger
  Mit Zitat antworten Zitat
SimStar001

Registriert seit: 18. Jan 2008
594 Beiträge
 
#19

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 20:11
Also diese Fehlermeldung kommt immer wieder und wies auschaut kann ich da nichts gegen machen!
Marco Tröger
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Bitte CODE prüfen - bekomme Immer eine Zugriffsverletzun

  Alt 5. Dez 2008, 20:19
Diese Fehlermeldung legt nahe, dass du auf ein nichtinitialisiertes Objekt (Nil) zugreifen willst

In welcher Zeile tritt der Fehler den genau auf?
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz