Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler bei Wertzuweisung (https://www.delphipraxis.net/21625-fehler-bei-wertzuweisung.html)

Alter Mann 5. Mai 2004 20:07


Fehler bei Wertzuweisung
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo alle Zusammen,

ich habe das Problem, das ich beim Programmablauf an einer bestimmten Stelle einen
Zugriffsfehler bekomme. Setze ich dort einen Haltepunkt und überprüfe sie mittels
'Auswerten / Ändern' wird die Wertzuweisung korrekt angezeigt (Beweis im Anhang).
Code:
function GetIdentifyStr(const InqBuf : PWord; InqBufSize : Integer): String;
var
   P : PWORD;
   I,J : Integer;
   S : Array[0..127] of Char;
begin
  P := InqBuf;
  I := 0;
  J := 0;
  FillChar(S, SizeOf(S), Char(32));
  while I < InqBufSize do
  begin
    inc(I);
    inc(P);
    S[J] := Char(P^ shr 8);    <- Hier kommt die Zugriffsverletzung
    inc(J);
  end;

  Result := StrPas(S);
end;
Könnt ihr mal schauen was da quer liegt. Für Lösungen wäre ich dankbar.

GuenterS 5. Mai 2004 20:19

Re: Fehler bei Wertzuweisung
 
Was mir mal so auffällt ist, dass Du nicht überprüfst ob J < 128 ist, was ebenfalls zu einer Zugrifssverletzung führen müßte, sollte InqBufSize einmal größer 127 sein.


Ich frage mich wieso Du P inkrementierst und nicht P^.

bzw. Würde mich auch intressieren was die Funktion genau machen soll...

Christian Seehase 5. Mai 2004 23:34

Re: Fehler bei Wertzuweisung
 
Moin Alter Mann,

das Problem dürfte vermutlich sein, dass Du nicht berücksichtigst, was inc(P) macht.
Da P als Pointer auf ein DWORD deklariert wurde, wird der Pointer bei jedem inc um 4 erhöht.
Ich denke mal, dass Du die Buffersize in Anzahl Byte und nicht in Anzahl DWORD angegeben hast, und somit P nach 32 durchläufen ausserhalb des reservierten Speichers zugreift.

[EDIT]
@GuenterS:
durch inc(P) wird auf das nächste DWORD adressiert, durch inc(P^), wird das DWORD auf das P gerade zeigt um 1 erhöht, was in dem gezeigten Zusammenhang für mich auch mehr Sinn macht.
[/EDIT]

Alter Mann 6. Mai 2004 17:59

Re: Fehler bei Wertzuweisung
 
Hallo,

hört sich ganz Gut an, werde es mal prüfen.
Das Original ist in C++ und gerade da bin ich nicht ganz so fit.

Hier mal ein Ausug aus dem Original

Code:
static void GetIdentifyStr(char *s, PWORD InqBuf, unsigned int InqBufSize)
{
  PWORD p = InqBuf;
  char *p1 = s;
  for (unsigned int i = 0; i < InqBufSize; ++i, ++p)
    {
      // wandelt Big Endian in Little Endian
      *p1++ = (char)(*p >> 8);
      *p1++ = (char)*p;
    }
  *p1 = '\0';
 
  // führende Leerzeichen entfernen
  while (s[0] == ' ')
    memmove(s, s + 1, strlen(s));
  unsigned int l = strlen(s);
 
  // abschließende Leerzeichen entfernen
  while ((l > 0) && (s[l - 1] == ' '))
    s[--l] = '\0';
}
Das Ergebnis der Proc ist der, jenachdem wohin InqBuf zeigt, der Hersteller , die Modelbezeichnung oder
die Seriennummer der Festplatte. Also alles das was auch auf dem Aufkleber steht.

PS. Ob ich nun I prüfe oder nicht, bei der ersten Wertzuweisung trit der Fehler schon auf(siehe jpg -> Auswerten/Ändern Dialog).


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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 by Thomas Breitkreuz