AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit JEDI (Gleitkommadivision durch NULL)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit JEDI (Gleitkommadivision durch NULL)

Ein Thema von xineohp · begonnen am 19. Sep 2004 · letzter Beitrag vom 20. Sep 2004
Antwort Antwort
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#1

Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 19. Sep 2004, 15:41
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.
Peter Enenkel
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#2

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 19. Sep 2004, 16:13
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
xineohp

Registriert seit: 29. Jan 2004
Ort: Heusenstamm
420 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 19. Sep 2004, 16:28
herzlichen Dank für die Antwort.

Aber sollt man nicht bei einem release erwarten dürfen, dass die einzelnen Komponenten vollständig kompartibel sind?
Peter Enenkel
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 19. Sep 2004, 16:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#5

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 19. Sep 2004, 16:51
Hallo Robert,
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 20. Sep 2004, 05:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von Duffy
Duffy

Registriert seit: 19. Mär 2003
Ort: Wuppertal
835 Beiträge
 
Delphi 3 Standard
 
#7

Re: Problem mit JEDI (Gleitkommadivision durch NULL)

  Alt 20. Sep 2004, 06:09
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
Künftige Generationen wollen ihre Fehler selber machen.
Jedes Programm wird nie das können, was Du wirklich brauchst.
Das Gegenteil von gut ist gut gemeint
-----
  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 13:28 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