Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AccsesViolation in System.pas (https://www.delphipraxis.net/102702-accsesviolation-system-pas.html)

TurboMartin 2. Nov 2007 18:01


AccsesViolation in System.pas
 
Ich habe jetzt ein Problem:
Die System.pas aud D2007 crasht, das bedeutet, das ich immer eine AV erhalte.
Die Zelennummer ist 12345.
Delphi-Quellcode:
procedure _LStrAsg(var dest; const source);
{$IFDEF PUREPASCAL}
var
  S, D: Pointer;
  P: PStrRec;
  Temp: Longint;
begin
  S := Pointer(source);
  if S <> nil then
  begin
    P := PStrRec(Integer(S) - sizeof(StrRec));
    if P.refCnt < 0 then  // make copy of string literal
    begin
      Temp := P.length;
      S := _NewAnsiString(Temp);
      Move(Pointer(source)^, S^, Temp);
      P := PStrRec(Integer(S) - sizeof(StrRec));
    end;
    InterlockedIncrement(P.refCnt);
  end;

  D := Pointer(dest);
  Pointer(dest) := S;
  if D <> nil then
  begin
    P := PStrRec(Integer(D) - sizeof(StrRec));
    if P.refCnt > 0 then
      if InterlockedDecrement(P.refCnt) = 0 then
        FreeMem(P);
  end;
end;
{$ELSE}
asm
        { ->   EAX pointer to dest  str     }
        { ->   EDX pointer to source str     }

                TEST   EDX,EDX                          { have a source? }
                JE     @@2                               { no -> jump    }

                MOV    ECX,[EDX-skew].StrRec.refCnt
                INC    ECX
                JG     @@1                               { literal string -> jump not taken }

                PUSH   EAX
                PUSH   EDX
                MOV    EAX,[EDX-skew].StrRec.length
                CALL   _NewAnsiString
                MOV    EDX,EAX
                POP    EAX
                PUSH   EDX
                MOV    ECX,[EAX-skew].StrRec.length
                CALL   Move
                POP    EDX
                POP    EAX
                JMP    @@2

@@1:
           LOCK INC    [EDX-skew].StrRec.refCnt

@@2:           XCHG   EDX,[EAX]
                TEST   EDX,EDX                              //<-- da crasht es
                JE     @@3
                MOV    ECX,[EDX-skew].StrRec.refCnt
                DEC    ECX
                JL     @@3
           LOCK DEC    [EDX-skew].StrRec.refCnt
                JNE    @@3
                LEA    EAX,[EDX-skew].StrRec.refCnt
                CALL   _FreeMem
@@3:
end;
{$ENDIF}
Woher kommt das und wie ändere/behebe ich den Fehler?
Nach einem Debugen kamen plötzlich massenhaft Fehler:
Fehler

Erzeugen
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert
[Pascal Fataler Fehler] system.pas(1748): F2051 Unit SysInit wurde mit einer unterschiedlichen Version von System.@RunError compiliert

Kann es die Prozedur TryStrToFloat sein, die den Fehler verursacht?
Mein Aufruf ist
Delphi-Quellcode:
TryStrToFloat(values1[l],dvalue1);
values1 ist ein array of String und dValue1 ist Single.



[edit]
Es schein hier irgendwas nicht zu funktionieren...

Delphi-Quellcode:
for i := 0 to Length(values)-1 do
  begin
    if not odd(i) then
    begin
      values1[j] := values[i];
      j := j+1;
    end
    else
      begin
        values2[k] := values[i];
        k := k+1;
      end;
  end;
[/edit]
[edit=2]
der Übeltäter scheint j := j+1 zu schein. j ist ein Integer, aber ich verstehe nicht weshalb das nicht funktioniert.[/edit]

3_of_8 2. Nov 2007 18:27

Re: AccsesViolation in System.pas
 
Aktivier mal die Rangechecks, ein Bug in der System.pas ist eher unwahrscheinlich. Ich vermute eher, dass du irgendwo einen ungültigen Parameter übergibst oder sowas.

EDIT: Achja, und setz mal nen Breakpoing auf das, was in deinem Post Zeile 5 ist, und verfolge mal den Wert von j mit dem Evaluator oder den überwachten Ausdrücken. Und bist du dir sicher, dass du j und k auf einen ordentlichen Wert initialisiert hast?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 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