AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi lustiges problem mit dem compiler (?)
Thema durchsuchen
Ansicht
Themen-Optionen

lustiges problem mit dem compiler (?)

Ein Thema von arkon · begonnen am 13. Jun 2009 · letzter Beitrag vom 13. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2      
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#1

lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 13:55
folgender schöner quelltext:

Delphi-Quellcode:
function compvoc(Item1, Item2: Pointer): integer;
var
  t1,t2: extended;
begin
  t1:= TChVoc(Item1).coeff;
  t2:= TChVoc(Item2).coeff;
  if t1> t2then
    result := -1
  else
    result := 1;
// Result := Round(TChVoc(Item1).coeff - TChVoc(Item2).coeff);
end;
wenn ich die if-abfrage ausklammere oder nur die letzte, ausgeklammerte zeile benutze funktioniert alles wunderbar. nur in der version, die oben steht, gibts nen zugriffsfehler. sicher, der eigentlich fehler liegt nicht hier sondern woanders. ABER: warum funktioniert "Result := Round(TChVoc(Item1).coeff - TChVoc(Item2).coeff);" aber nicht "if Round(TChVoc(Item1).coeff > TChVoc(Item2).coeff) then" !?!??!?!?
was zur hölle soll mir das sagen? compiler-optimierung ist schon ausgeschaltet.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 14:10
Wie sihet TChVoc aus?
Markus Kinzler
  Mit Zitat antworten Zitat
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#3

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 14:16
oh, sorry...
Delphi-Quellcode:
  TChVoc = class
    public
...
      cgright: integer;
      cgwrong: integer;
      gcright: integer;
      gcwrong: integer;
      pgright: integer;
      pgwrong: integer;
...
      function coeff: extended;
  end;

function TChVoc.coeff: extended;
begin
// Form1.Memo2.Lines.Add(pinyin);//+'|'+FloatToStr(result));
  case learningmode of
    cltPG: result := (pgwrong+1)/(pgwrong+pgright+1);
    cltGC: result := (gcwrong+1)/(gcwrong+gcright+1);
    cltCG: result := (cgwrong+1)/(cgwrong+cgright+1);
  else
    result := 0;
  end;
end;
also ein objekt. wenn ich die zeile in der coeff-fkt ausklammere, dann läuft er aus dem speicher raus. ergo wurde das objekt nicht initialisiert. das ganze ist in einer TLIst gespeichert und wird sortiert, daher kann ich nicht genau sagen wie das sortieren abläuft. aber das wird schon richtig sein . jedenfalls: direkt VOR dem sortieren kann ich noch fehlerfrei auf jeden eintrag der Liste zugreifen. trotzdem kommt er eine zeile später im nirvana an!?!?! vor allem aber: warum ist das verhalten bei den unterschiedlichen aufrufen so unterschiedlich? was spuckt der compiler hinten aus?
antwort: der compiler spuckt ganz zivilen assembler aus. im kritischen durchlauf ist jedoch item1 ein null-pointer. wadup?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 14:23
Zitat von arkon:
was zur hölle soll mir das sagen?
Das hört sich sehr nach überschriebenem Speicher an. Benutzt du dynamische Arrays zum Beispiel? Dann schalte am besten einmal die Bereichsüberprüfung in den Compileroptionen an.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 14:29
Hallo,

wenn die Funktion eine Vergleichsroutine für einen Sortieralgorithmus darstellt, dann muss sie bei identischen Werten für die übergebenen Elemente den Wert 0 liefern. Die auskommentierte Zeile tut dies, die nicht auskommentierten Zeilen nicht.

Gruß Hawkeye
  Mit Zitat antworten Zitat
arkon

Registriert seit: 15. Jul 2007
Ort: Berlin
7 Beiträge
 
#6

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 14:35
hmmm... ich dachte, dass das nur die sortierung der liste beeinflussen würde. aber, siehe da: mit unterscheidung, ob die einträge gleich sind gibts keine fehler mehr. ?!?!? erstmal danke für die lösung, aber: warum macht tlist eine abfrage mit einem null-pointer wenn es die liste nicht sortiert kriegt? absicht? unkommentiert in jedemfall
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#7

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 15:01
Zitat von arkon:
folgender schöner quelltext:
Ne, der Quelltext ist nicht schön; er ist unschön!
1.) du sicherst deine Zeiger nicht mit Assert() ab
Delphi-Quellcode:
function compvoc(Item1, Item2: Pointer): integer;
var
  t1,t2: extended;
begin
  Assert(Assigned(Item1)); // der Rettungsschirm
  Assert(Assigned(Item2));
  t1:= TChVoc(Item1).coeff;
...end;
2.) Du hast doch schon eine Klasse.
Warum nicht eine Vergleichsfunktion einbauen?
Delphi-Quellcode:
TChVoc = class
public
...
  class function Compare(a,b:TChVoc):integer;
end;

...

function compvoc(Item1, Item2: Pointer): integer;
begin
  Assert(Assigned(Item1));
  Assert(Assigned(Item2));
  Result := TChVoc.Compare(TChVoc(Item1), TChVoc(Item2));
end;
fork me on Github
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 15:11
Peng. Da fehlt wohl ein static.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 15:20
Zitat von Apollonius:
Peng. Da fehlt wohl ein static.
"static"
Die Compare-Methode ist doch eine Klassenfunktion (class function).
In C++ oder C# würde man das Schlüsselwort "static" benützen...
fork me on Github
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: lustiges problem mit dem compiler (?)

  Alt 13. Jun 2009, 15:21
Versuch's einfach mal. Ohne static wird es nicht funktionieren.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:50 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