AGB  ·  Datenschutz  ·  Impressum  







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

AccsesViolation in System.pas

Offene Frage von "TurboMartin"
Ein Thema von TurboMartin · begonnen am 2. Nov 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
TurboMartin

Registriert seit: 13. Feb 2006
Ort: Bad Honnef
765 Beiträge
 
Turbo Delphi für Win32
 
#1

AccsesViolation in System.pas

  Alt 2. Nov 2007, 18:01
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
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]
Tomorrow will be cancelled due to lack of interest.

  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: AccsesViolation in System.pas

  Alt 2. Nov 2007, 18:27
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?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  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 00:35 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