Lazarus 3.0 (2023.12.21.)
Letöltés

  • Oldal:
  • 1

TÉMA:

SigFPE hiba egész változóval való osztásnál 2016 márc. 08 18:06 #1896

  • ltibor65
  • ltibor65 profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 3
  • Köszönetek: 0
Gábor, nagyon szépen köszönöm, hogy megnézted a kódot és leírtad a hibát. Köszönöm a hasznos tanácsokat! Megpróbálom kijavítani a programot és folytatni a kódot, mert még lesz vele munka bőven. (StringGridek feltöltése a legjobb tanulókkal átlag szerint sorba rendezve, ill. az osztályok átlagok szerinti sorrendjével és mindezek fájlba mentése.)

SigFPE hiba egész változóval való osztásnál 2016 márc. 08 14:05 #1895

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Átnéztem...
Ott a hiba, hogy a CheckBox1Click kétszer fut le minden körben, másodszor ráadásul nulla bemenő értékekkel. Az első lefutás a jelölőnégyzetre kattintáskor történik, a második pedig amikor a Button1Click-ben megváltoztatod a CheckBox1.Checked értékét. Mivel előtte nullázod a bemenő osztályzatokat (Edit5.Clear) a CheckBox1Click-ben a számítások már nullákkal hajtódnak végre, ami ugyebár hibás eredményt ad.

Az a bizonyos "negatív tizedestört", pedig a (hiba miatt "használatba vett") legkisebb valós számértékből (-nan(0x8000000000000) = -92233720368547760 ) számolt hibás eredmény, például: -4.61168601842739E16 (egy ilyen módon formázott szám nem feltétlenül tizedestört)

A rosszul szervezett és felesleges kódok megbosszulják magukat. Mindig törekedj az egyszerűségre!

Hibák kereséséhez állíts be töréspontokat a forráskódodban, úgy hogy a sorszámok elé kattintasz (ekkor egy kis kérdőjel vagy pipa jelenik meg piros háttéren) és figyeld a fontos változók értékét a "Nézet / Hibakereső ablakok / Figyelt elemek" használatával...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SigFPE hiba egész változóval való osztásnál 2016 márc. 07 17:50 #1892

  • ltibor65
  • ltibor65 profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 3
  • Köszönetek: 0
- A linux alatt nem kapok hibaüzenetet, csak helytelen eredményt (negatív tizedestört) a szövegmezőben
- Az üzenetablakok azért vannak, hogy a felhasználó entert nyomjon az adatok beírása után, és véletlenül ne a következő szövegmezőbe kattintson, mert akkor az adatok nem kerülnek bevitelre. Tehát csak biztonsági figyelmeztetésnek szántam
- Ami a kód szervezését illeti, abban valószínűleg még sok hibám van. Még kezdő vagyok, néhány programot írtam csak.
- Feltöltöttem az unit1.lfm file-t

Melléklet:

Fájlnév: unit1.lfm
Fájlméret:12 KB
Mellékletek:

SigFPE hiba egész változóval való osztásnál 2016 márc. 07 17:24 #1891

  • Gábor
  • Gábor profilkép
  • Adminisztrátor
  • Adminisztrátor
  • Hozzászólások: 504
  • Köszönetek: 86
Hibakereső kimenete mit mond?
Légy szíves töltsd fel a unit1,lfm fájlt is, mert a unit1.lfm nélkül a unit1.pas működése csak nehezen tesztelhető.

További probléma (bár nem ez a SIGFPE oka), hogy a kódod rosszul van szervezve, ami miatt tele van felesleges műveletekkel, melyek csak helyet foglalnak.
Ráadásul ahogy a kódot szervezted azon látszik, hogy a házi feladatok terminálos (parancssoros) megoldásának stílusát/menetét igyekszel grafikus felületre átvinni, de a feladatok megoldása GUI-n egy kicsit más logikát igényel:
  • A grafikus felületen az adatokat a felhasználó tetszőleges sorrendben viheti be, ebben őt korlátozni és üzenetablakkal "zaklatni" nem illik.
  • A bevitt adatok elfogadhatóságát a legtöbb esetben elegendő azok feldolgozása előtt ellenőrizni, például az "Oké" vagy a "Számítás" gomb OnClick eseménykezelőjében.
  • Az állandó felíratok szövegeit az Objektum felügyelőben (pl Label6.Caption) megadva nem kell a a forráskódot feleslegesen növelni. Csak azokat a feliratokat kell a forráskódban megadni, melyek tartalma változik a program futása közben.
  • stb...
Hogyan kérdezzünk okosan? / Mit kell tennünk kérdezés előtt? -- Lazarus 3.0 -- FPC 3.2-- GNU/Linux 5.15.0 x86_64

SigFPE hiba egész változóval való osztásnál 2016 márc. 06 21:48 #1890

  • ltibor65
  • ltibor65 profilkép Témaindító
  • Új tag
  • Új tag
  • Hozzászólások: 3
  • Köszönetek: 0
Sziasztok!

Átlagszámító programot írok iskolám részére grafikus felületen. Free Pascal 3-t és Lazarus 1.6-ot használok Ubuntu 14.04 64 bites operációs rendszer alatt. A problémám, hogy egy egésszel való osztásnál valamilyen hiba keletkezik és a TEdit szövegmezőben a helyes eredmény helyett egy negatív valós számot ír ki linux alatt. Ha Windowsra lefordítom, ott pedig kivételt dob SigFPE jellel, amely valamilyen lebegő pontos művelet hibájára utal. Az osztó egy egész típusú változó, amely az osztályzatok számát jelenti, értéke nem nulla, tehát az osztás elvileg elvégezhető. Mi lehet a hiba, illetve hogyan lehetne orvosolni?
A kód a mellékletben.

Melléklet:

Fájlnév: unit1.pas
Fájlméret:6 KB
Mellékletek:

  • Oldal:
  • 1