Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit JEDI (Gleitkommadivision durch NULL) (https://www.delphipraxis.net/30076-problem-mit-jedi-gleitkommadivision-durch-null.html)

xineohp 19. Sep 2004 16:41


Problem mit JEDI (Gleitkommadivision durch NULL)
 
moin,

Ich wollte in meinem Projekt das JEDI IP-Eingabe-Edit verwenden:

Beim Starten erhalte ich aber nun die Fehlermeldung "Gleitkommadivision durch Null" und Delphi springt in die Unit "JclSysInfo" und markiert die letzte Zeile der procedure "GetCpuInfo".

Ich konnte das Problem soweit eingrenzen, dass es wohl nicht direkt an der IP-Kompo liegt, sondern viel mehr an der, durch die Verwendung der Kompo eingebundenen, Unit "JvComCtrls" liegt.

Ein ähnlicher/der gleiche Fehler wurde schon hier behandelt, nur leider gab es dort keinen Lösungsansatz.

PS: ich verwende die Version "Release 2.10 Stable mit JCL und Installer" erhältlich auf http://www.delphi-source.de/jedi/jvcl/ incl. des ebenfalls dort erhältlichen Fix.

Duffy 19. Sep 2004 17:13

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
Hallo xineohp,
es liegt daran, daß die JCL der 2.1 zu alt ist. Du mußt entweder die gesamte JCL austauschen, was vielleicht dazuführen wird, daß Du die JVCL nicht mehr compilieren kannst oder Du tauscht einfach nur den Code der Funktion "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;" in der "JclSysInfo.pas" aus. Letzters geht schneller und unkomplizierter.

Alter Code der "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;"
Delphi-Quellcode:
//--------------------------------------------------------------------------------------------------

function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;
var
  T0, T1: TULargeInteger;
  CountFreq: TULargeInteger;
  Freq, Freq2, Freq3, Total: Integer;
  TotalCycles, Cycles: Int64;
  Stamp0, Stamp1: Int64;
  TotalTicks, Ticks: Cardinal;
  Tries, Priority: Integer;
  Thread: THandle;
begin
  Stamp0 := 0;
  Stamp1 := 0;
  Freq := 0;
  Freq2 := 0;
  Freq3 := 0;
  Tries := 0;
  TotalCycles := 0;
  TotalTicks := 0;
  Total := 0;

  Thread := GetCurrentThread();
  Result := QueryPerformanceFrequency(Int64(CountFreq));
  if Result then
  begin
    while ((Tries < 3 ) or ((Tries < 20) and ((Abs(3 * Freq - Total) > 3) or
      (Abs(3 * Freq2 - Total) > 3) or (Abs(3 * Freq3 - Total) > 3)))) do
    begin
      Inc(Tries);
      Freq3 := Freq2;
      Freq2 := Freq;
      QueryPerformanceCounter(Int64(T0));
      T1.LowPart := T0.LowPart;
      T1.HighPart := T0.HighPart;

      Priority := GetThreadPriority(Thread);
      if Priority <> THREAD_PRIORITY_ERROR_RETURN then
        SetThreadPriority(Thread, THREAD_PRIORITY_TIME_CRITICAL);
      try
        while (T1.LowPart - T0.LowPart) < 50 do
        begin
          QueryPerformanceCounter(Int64(T1));
          Stamp0 := ReadTimeStampCounter;
        end;
        T0.LowPart := T1.LowPart;
        T0.HighPart := T1.HighPart;

        while (T1.LowPart - T0.LowPart) < 1000 do
        begin
          QueryPerformanceCounter(Int64(T1));
          Stamp1 := ReadTimeStampCounter;
        end;
      finally
        if Priority <> THREAD_PRIORITY_ERROR_RETURN then
          SetThreadPriority(Thread, Priority);
      end;

      Cycles := Stamp1 - Stamp0;
      Ticks := T1.LowPart - T0.LowPart;
      Ticks := Ticks * 100000;
      Ticks := Round(Ticks / (CountFreq.LowPart / 10));
      TotalTicks := TotalTicks + Ticks;
      TotalCycles := TotalCycles + Cycles;
      Freq := Round(Cycles / Ticks);
      Total := Freq + Freq2 + Freq3;
    end;
    Freq3 := Round((TotalCycles * 10) / TotalTicks);
    Freq2 := Round((TotalCycles * 100) / TotalTicks);

    if Freq2 - (Freq3 * 10) >= 6 then
      Inc(Freq3);

    CpuSpeed.RawFreq := Round(TotalCycles / TotalTicks);
    CpuSpeed.NormFreq := CpuSpeed.RawFreq;

    Freq := CpuSpeed.RawFreq * 10;
    if (Freq3 - Freq) >= 6 then
      Inc(CpuSpeed.NormFreq);

    CpuSpeed.ExTicks := TotalTicks;
    CpuSpeed.InCycles := TotalCycles;

    CpuSpeed.NormFreq := RoundFrequency(CpuSpeed.NormFreq);
    Result := True;
  end;
end;
Neuer Code der "function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;"
Delphi-Quellcode:
//--------------------------------------------------------------------------------------------------

function GetCPUSpeed(var CpuSpeed: TFreqInfo): Boolean;
{$IFDEF LINUX}
begin
  { TODO : GetCPUSpeed: Solution for Linux }
  Result := False;
end;
{$ENDIF LINUX}
{$IFDEF MSWINDOWS}
var
  T0, T1: Int64;
  CountFreq: Int64;
  Freq, Freq2, Freq3, Total: Int64;
  TotalCycles, Cycles: Int64;
  Stamp0, Stamp1: Int64;
  TotalTicks, Ticks: Double;
  Tries, Priority: Integer;
  Thread: THandle;
begin
  Stamp0 := 0;
  Stamp1 := 0;
  Freq := 0;
  Freq2 := 0;
  Freq3 := 0;
  Tries := 0;
  TotalCycles := 0;
  TotalTicks := 0;
  Total := 0;

  Thread := GetCurrentThread();
  Result := QueryPerformanceFrequency(CountFreq);
  if Result then
  begin
    while ((Tries < 3 ) or ((Tries < 20) and ((Abs(3 * Freq - Total) > 3) or
      (Abs(3 * Freq2 - Total) > 3) or (Abs(3 * Freq3 - Total) > 3)))) do
    begin
      Inc(Tries);
      Freq3 := Freq2;
      Freq2 := Freq;
      QueryPerformanceCounter(T0);
      T1 := T0;

      Priority := GetThreadPriority(Thread);
      if Priority <> THREAD_PRIORITY_ERROR_RETURN then
        SetThreadPriority(Thread, THREAD_PRIORITY_TIME_CRITICAL);
      try
        while T1 - T0 < 50 do
        begin
          QueryPerformanceCounter(T1);
          Stamp0 := ReadTimeStampCounter;
        end;
        T0 := T1;

        while T1 - T0 < 1000 do
        begin
          QueryPerformanceCounter(T1);
          Stamp1 := ReadTimeStampCounter;
        end;
      finally
        if Priority <> THREAD_PRIORITY_ERROR_RETURN then
          SetThreadPriority(Thread, Priority);
      end;

      Cycles := Stamp1 - Stamp0;
      Ticks := T1 - T0;
      Ticks := Ticks * 100000;

      // avoid division by zero
      if CountFreq = 0 then
        Ticks := High(Int64)
      else
        Ticks := Ticks / (CountFreq / 10);

      TotalTicks := TotalTicks + Ticks;
      TotalCycles := TotalCycles + Cycles;

      // avoid division by zero
      if Ticks = 0 then
        Freq := High(Freq)
      else
        Freq := Round(Cycles / Ticks);

      Total := Freq + Freq2 + Freq3;
    end;

    // avoid division by zero
    if TotalTicks = 0 then
    begin
      Freq3 := High(Freq3);
      Freq2 := High(Freq2);
      CpuSpeed.RawFreq := High(CpuSpeed.RawFreq);
    end
    else
    begin
      Freq3 := Round((TotalCycles *  10) / TotalTicks); // freq. in multiples of 10^5 Hz
      Freq2 := Round((TotalCycles * 100) / TotalTicks); // freq. in multiples of 10^4 Hz
      CpuSpeed.RawFreq := Round(TotalCycles / TotalTicks);
    end;

    CpuSpeed.NormFreq := CpuSpeed.RawFreq;

    if Freq2 - (Freq3 * 10) >= 6 then
      Inc(Freq3);


    Freq := CpuSpeed.RawFreq * 10;
    if (Freq3 - Freq) >= 6 then
      Inc(CpuSpeed.NormFreq);

    CpuSpeed.ExTicks := Round(TotalTicks);
    CpuSpeed.InCycles := TotalCycles;

    CpuSpeed.NormFreq := RoundFrequency(CpuSpeed.NormFreq);
    Result := True;
  end;
end;
{$ENDIF MSWINDOWS}
bye
Claus

xineohp 19. Sep 2004 17:28

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
herzlichen Dank für die Antwort.

Aber sollt man nicht bei einem release erwarten dürfen, dass die einzelnen Komponenten vollständig kompartibel sind?

Robert Marquardt 19. Sep 2004 17:31

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
Die Versionen sind doch kompatibel.
Es passt nur eine alte JCL nicht zu einer neuen JVCL.
Wir habe uebrigens gerade die naechte Zwischenversion der JVCL 3 Beta herausgebracht.
Dazu passt die JCL 1.92.

Duffy 19. Sep 2004 17:51

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
Hallo Robert,
Zitat:

Zitat von Robert Marquardt
Die Versionen sind doch kompatibel.
Es passt nur eine alte JCL nicht zu einer neuen JVCL.
Wir habe uebrigens gerade die naechte Zwischenversion der JVCL 3 Beta herausgebracht.
Dazu passt die JCL 1.92.

Bei mir war es so. Die beigelegte JCL der 2.1 verursacht das Problem. Wenn ich die 1.91 installiere bekomme ich Einsprungsprobleme in der kompilierten JVCL. Also einfach diese neu kompilieren, was aber dann nicht mehr funktioniert.

In der Version 3 habe ich das Problem, daß beim kompilieren folgende Fehlermeldung kommt
  • [Fehler] JvFunctions.pas(1469): Undefinierter Bezeichner: 'CharIsNumber'
  • [Fehler] JvFunctions.pas(1469): Operator ist auf diesen Operandentyp nicht anwendbar
Aber das ist eine andere Baustelle …

bye
Claus

Robert Marquardt 20. Sep 2004 06:41

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
Na die JVCL 2.1 ist halt auch komplett tot aus unserer Sicht. Wir haben keine Manpower die in irgeneiner Weise noch zu unterstuetzen.
Der CharIsNumber-Fehler deutet darauf hin das eine alte JCL gefunden wird. JVCL 2.1 und JVCL 3 lassen sich nicht gemeinsam betreiben. Die JVCL 2.1 und die zugehoerige alte JCL muessen komplett geloescht werden (einschliesslich .bpl .dcu Files).

Diese Probleme entstehen daraus das wir gelegentlich Teile der JVCL in die JCL uebernehmen. Es entstehen dann immer Link-Probleme.

Duffy 20. Sep 2004 07:09

Re: Problem mit JEDI (Gleitkommadivision durch NULL)
 
Hallo Robert,
ich denke auch, daß es sich um temporäre Übergangsprobleme handelt. Im übrigen habe ich natürlich die 2.1 samt JCL entfernt und das Ganze läuft autark auf einem eigenen Rechner.

Bye
Claus


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