AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei Wertzuweisung

Ein Thema von Alter Mann · begonnen am 5. Mai 2004 · letzter Beitrag vom 6. Mai 2004
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Fehler bei Wertzuweisung

  Alt 5. Mai 2004, 19:07
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.
Angehängte Dateien
Dateityp: zip test_192.zip (80,3 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von GuenterS
GuenterS

Registriert seit: 3. Mai 2004
Ort: Österreich > Bad Vöslau
760 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Fehler bei Wertzuweisung

  Alt 5. Mai 2004, 19:19
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...
Günter
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: Fehler bei Wertzuweisung

  Alt 5. Mai 2004, 22:34
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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Fehler bei Wertzuweisung

  Alt 6. Mai 2004, 16:59
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).
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:41 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