![]() |
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:
Könnt ihr mal schauen was da quer liegt. Für Lösungen wäre ich dankbar.
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; |
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... |
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] |
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:
Das Ergebnis der Proc ist der, jenachdem wohin InqBuf zeigt, der Hersteller , die Modelbezeichnung oder
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'; } 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